关于HOOK 的优先级问题

问题【1】,在使用SetWindowsHookEx时的疑问。

比如目标线程是X,我按如下顺序操作:
1.我先用程序A,HOOK上了X。
2.然后又用程序B,HOOK上了X。

请问:
现在如果有消息发送给线程X,这个消息是先让A截获、还是先让B截获呢?

问题【2】
比如有一串HOOK(ABCDEF...),依次处理message
message->ABCDEF....->thread

现在假设D被unhook了,那么接下来顺序会怎么样?
是像链表一样,E后面那一串,直接跑到C后面,还是全部打散重新排序?

0

2个回答

hook有优先级。对于同一优先级,系统可能还有权重,比如有公司签名等。如果条件相同,那么就可能是链式串行。

0
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于css的优先级问题
CSS,全称层叠样式表,很多人只知道CSS是用来控制样式的,并没有真正深入理解“层叠”的含义 层叠,其实指的就是“样式的覆盖”,当样式的覆盖发生冲突时,以优先级高的为准。当“同一个元素”的“同一个样式属性”被运用上多个属性值时,就需要遵循一定的优先级规则。常见的样式覆盖发生冲突有以下五种情况: 引用方式冲突。继承方式冲突。指定样式冲突。继承方式和指定样式冲突。!important。 1.
关于++/--优先级的问题
x初值为5,那么对于x-=x-x--,x的自减操作到底是什么时候进行?是在x=5-(5-5);完成后再自减?
关于优先级的问题
[code=C/C++]Status Push(SqStack &S, SElemType e)rnrn if (S.top - S.base >= S.stack_size)rn rn S.base = (SElemType *)realloc(S.base, (S.stack_size + STACK_INCREMENT * sizeof(SElemType)));rn if (!S.base)rn exit(OVERFLOW);rn S.top = S.stack_size + S.base;rn S.stack_size += STACK_INCREMENT;rn rn *S.top++ = e;rn return OK;rnrnrnStatus Pop(SqStack &S, SElemType *e)rnrn if (S.base == S.top)rn rn printf("The stack is empty!\n");rn return ERROR;rn rn *e = *--S.top;rn return OK;rn[/code]rnrn上面是压栈和出栈的代码 其中*S.top++ = e; *e = *--S.top; 是什么意思 * 和-- ++ 那个优先级高啊?rn求教各位大牛。rnrn
关于操作符的优先级的问题
my[5]=6rnfrom=my[5]++rnfrom是等于6还是7???rn
关于==与&&优先级问题
int x = 6,y=8;rnboolean b;rnb = x>y&&++x==--yrn最后问 b x y的值分别是多少?rn我跑过这个程序了,b = false,x = 6,y=8;rn但是不是==的优先级高吗?请问该怎么解释?
一个关于优先级的问题!
最近我在进行数据结构课程设计时我写了如下一个关于算术表达式的运算符的堆栈:rnint order(char operator)rnrn switch(operator)rn rn case '+' :rn case '-' :rn return 1;rn case '*' :rn case '/' :rn return 2;rn rnrn此表达式用纯c语言编写在turboc2.0下进行不带括号的表达式计算时毫无问题,而课程设计要求能够进行带括号的表达式计算。但是清华大学出版的由严蔚敏和吴伟民老师编著的c语言版的数据结构里的有关优先级的关系如下:rn————————————————————————rn\ |rn \ m2| + - * / ( ) # rnm1\ |rn \ |rn----------------------------------------------rn + | > > < < < > > rn - | > > < < < > > rn * | > > > > < > > rn / | > > > > < > > rn ( | < < < < < = rn ) | > > > > > > rn # | < < < < < = rn----------------------------------------------rn也就是说任意两个相继出现的算符m1和m2的优先关系至多是下面三种关系之一:rnm1m2 m1的优先权高于m2rn但是此表中的“(”和“)”的优先关系我始终无法用表达式表示出来。rn希望高人能在我的表达式中完成“(”和“)”的优先级的判断。rn
关于查询优先级的问题
有这样一个表T 商品加顾客作为唯一索引rngoods client discountrna 张三 0.7 //代表张三单独对a商品有7折优惠 rn 张三 0.8 // 代表张三对所有商品都有8折优惠rna 0.9 //代表商品a的通用优惠rnb 0.9rn 商品加顾客作为条件。目前希望select时。优先查找goods跟client都不为空时的折扣。若不存在。则再查找goods为空client不为空时的折扣。 若还是没有记录。则最后查找出商品的通用优惠。rn目前我是用的rnrnselect discount from T where goods =@goods and discount=@discountrnif 结果为空 thenrnselect discount from T where goods is null and discount=@discountrnif 结果为空 rn。。。。。rnrn请问有没有方法能在一个select语句里面实现这种逻辑?rnrnrnrn
关于逻辑运算符优先级问题
请问大虾逻辑与、或、非、异或、同或的优先级???
关于CSS的优先级问题
rn rnrn jhvjhbgjhrn aaaaaaajhvjhbgjhrn rnrn由于i1.style.display='block'的设置的优先级比样式单高rn所以我点击button设置后,那个head里面的style再也不会起作用了,rn我希望点击了button后,再点击一个别的button什么的,可以让head里的style再次起作用rn而不是指定i1.style.display='none',rn因为我需要让所有ul,不管当前的display是什么,优先级是什么,rn要一次性地改成none或block
关于DirectSound 优先级问题
我写了一个DirectSound的播放器。解码用的wmsdk里的wmreader,一个简单的Buffer。然后写了一个拉数据线程。经过观察发现wmreader的播放线程的优先级特别高,如果我再执行一个高优先级的长任务时,会发生一种情况。wmreader将Buffer写满,但是我的拉数据线程无法将数据拉出(拉数据线程已经设置为高优先级)。怀疑是否是DirectSound可以设置它的优先级。感觉事件触发慢了
关于@media优先级问题
经常需要使用@media查询屏幕大小来选择不同的css 有时候发现命名使用了@media重写css样式但是依然@media里面的样式失效。 原因在于css选择器优先级问题,后面的css样式优先级大于前面的。 解决办法: 原本的css样式必须置于在@media里面重写的css样式之上。 eg: .css1{xxx} @media xxxx{ .css1{xxx} }
关于CSS优先级的问题
现在有一个blue.css文件,里面引入了@import url('global.css');rnrnblue.css里面定义了:rn.tblClass thrn background:url('img/bgTblTitle.gif') no-repeat right top;rnrnrnglobal.css里面定义了:rn.tblClassrn width:100%;color:#333;background:white;rnrn.tblClass thrn height:26px;line-height:20px;padding:0 10px;rnrnrn现在我想在网页的datagrid上调用blue.css里面定义th,让背景为一副图片。rn所以让datagrid的HeaderStyle CssClass="th",然而缺没有效果。请各位指教。
新手关于优先级的问题
(*pa)+++*pb是等于((*pa)++)+*pb还是等于(*pa)+(++*pb)能告诉我为什么吗,想了很久也不明白!谢谢
关于算符优先级的问题
vector::iterator iter ;rniter++->size( ) 为什么合法,->的优先级高于++啊,这样的话应该先运算->,而这个公式为什么先运算++呢??
关于多线程的优先级问题
怎么理解“并非线程的优先级越高就一定会执行,哪个线程先执行将有CPU的调度决定”这句话?rn那要是哪个线程先执行将有CPU的调度决定,那干嘛还得设置一个优先级啊??
关于函数指针*优先级的问题
我对函数指针*表示什么不甚理解,什么时候表示的是函数指针,什么时候只是返回值是一个指针而已?
一个关于Hook的问题
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam) rn rn LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam); rn if(nCode==HC_ACTION) rn rn if(lParam & 0x80000000)rn rn char c[1];rn c[0]=wParam;rn SaveLog(c);rn rn rn return Result; rnrn请问 如何可以获得我勾取到的这个消息来自的窗口句柄rn消息结构中 应该有 对应窗口句柄的信息啊。。rn但是怎么可以获得呢 请高手指教
关于hook的简单问题!
我见一片文章写到: rnhProcess=GetCurrentProcess; rn //指向新地址的指针 rn NewAddr.MovEax=$B8; rn NewAddr.Addr=DWORD(NewFunc); rn NewAddr.JmpCode=$E0FF; rn最后这个能hook自己的几乎所有的api函数 上面的地址是固定的么? 为什么 谢谢!
关于hook api的问题
我写了一个dll,但是不知道问什么在setwindowsex函数处失败,请大家帮忙看看,程序如下:rnBOOL APIENTRY DllMain( HANDLE hModule, rn DWORD ul_reason_for_call, rn LPVOID lpReservedrn )rnrn if(ul_reason_for_call == DLL_PROCESS_ATTACH)rn //获取本dll句柄rn g_hInstanceforopen = hModule; //创建事务rn g_hOpen = CreateEvent( NULL, FALSE, TRUE, NULL ); rn //重写API开头的8字节rn HMODULE hWsock = LoadLibrary( "kernel32.dll" );rn g_pOpen = ( DWORD )GetProcAddress( hWsock, "CreateFile" ); //保存原始字节 rn ReadProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pOpen,( void * )g_dwOldBytesforopen[0], sizeof( DWORD )*2, NULL );//将00400000改写为我们函数的地址rn *( DWORD* )( g_btNewBytesforopen + 1 ) = ( DWORD )hook_CreateFile;rn WriteProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pOpen,( void * )g_btNewBytesforopen, sizeof( DWORD )*2, NULL ); rn rn return TRUE;rnrnrn// This is an example of an exported variablernTRYINGDLL_API int nTryingdll=0;rnrn// This is an example of an exported function.rnTRYINGDLL_API int fnTryingdll(void)rnrn return 42;rnrnrn// This is the constructor of a class that has been exported.rn// see tryingdll.h for the class definitionrnCTryingdll::CTryingdll()rn rn return; rnrnstatic LRESULT WINAPI HookProc( int nCode, WPARAM wParam, LPARAM lParam ) rnrnreturn CallNextHookEx( g_hOldHook, nCode, wParam, lParam ); rnrnrnrnBOOL __declspec(dllexport) StartHook(HWND hWnd)rn //通过传入的窗口句柄获取线程句柄rn g_dwThreadID = GetWindowThreadProcessId( hWnd, &g_dwProcessID ); //WH_CALLWNDPROC类型的Hookrn g_hOldOpen = SetWindowsHookEx(WH_CALLWNDPROC, HookProc,( HINSTANCE ) g_hInstanceforopen, g_dwThreadID [color=#FF0000]);//此处运行后下面一行转入false的那行了就[/color]rn if( g_hOldOpen == NULL )rn return FALSE;rn return TRUE;rnrnvoid __declspec(dllexport) StopHook(void)rnrn if(g_hOldHook != NULL)rn rn WaitForSingleObject( g_hOpen, INFINITE );rn HANDLE hProcess = NULL;rn hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_dwProcessID);rn DWORD dwOldProc;rn DWORD dwNewProc; //改变页面属性为读写rn VirtualProtectEx( hProcess, ( void* )g_pOpen, 8, PAGE_READWRITE, &dwOldProc ); //恢复API的首8个字节rn WriteProcessMemory( hProcess, ( void* )g_pOpen,( void* )g_dwOldBytesforopen[0], sizeof( DWORD )*2, NULL ); //恢复页面文件的属性rn VirtualProtectEx( hProcess, ( void* )g_pOpen, 8, dwOldProc, &dwNewProc );rn rn CloseHandle(g_hOpen);rn rn UnhookWindowsHookEx( g_hOldOpen );rn rnrnHANDLE _stdcall hook_CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)rnrn HANDLE hand=NULL;rn if(lpFileName=="%system32/taskmgr.exe")rn MessageBox(NULL,TEXT("Help, Something went wrong"),TEXT("ERROR"),MB_ICONSTOP); rn WaitForSingleObject(g_hOpen, INFINITE ); //恢复API头8个字节rn WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pOpen,( void* )g_dwOldBytesforopen[0], sizeof( DWORD )*2, NULL ); /* 这里可以添加想要进行的处理过程 */ //真正执行API函数rn hand=CreateFile(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile); //写入跳转语句,继续Hookrn WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pOpen, ( void* )g_btNewBytesforopen, sizeof( DWORD )*2, NULL ); rn SetEvent( g_hOpen);rn return hand;rnrn————————————————————————————————————————————————————————————————————————rn我主程序中调用此功能模块如下:rn HWND hWnd;rn hinstance= LoadLibrary("tryingdll.dll");rn start = (lpStartHook)GetProcAddress(hinstance, "StartHook");rn end=(lpEndHook)GetProcAddress(hinstance, "StopHook");rn hWnd=GetDesktopWindow()->GetSafeHwnd(); rn start(hWnd);rn//此处我是想注入到我们的浏览器程序,即explorer.exe进程中的,总体就是想知道进程管理器开始执行时获得一个message而已。请各位帮忙研究看看,急!先谢谢了rn
关于mouse的hook问题
我想写一个mouse的hook,在mouse离开当前exe时,仍然可以收到mouse move的消息,并且把当前mouse的x,y值显示出来,我看了一个别人的source,可是那在delphi6中编译不通过,我改完后运行,却没有达到我要的效果,请给我一个最简单代码的source……rnrn另:可以直接在exe中写hook,而不用另加一dll吧?
一个关于Hook的问题?
但hook有两种,一种是Windows标准钩子,通过SetWindowshook挂。 rn另一种是非标准的,通过在API入口写JMP XXXXXXXX来实现的。rn请问,谁有第二种的范例?
关于HOOK的一个问题
是不是只有写到DLL里面,才能让程序在不获得焦点的时候也能截取按键消息?
关于hook WM_CTLCOLORSTATIC的问题
windows有个消息叫“WM_CTLCOLORSTATIC”,一个控件准备绘制的时候向父窗口发此消息,父窗口可以通过处理这个消息改变此控件的字体和颜色等rnrn当父窗口的消息处理函数在处理完毕后,会return一个brush句柄。rnrn现在问题来了:我hook了这个消息,也就是这个消息由我的callback函数来处理了,并不由父窗口的消息函数来处理了,我如何“返回”这个brush?如果我不能正确“返回”这个brush,绘制是不正常的。rnrn另外:我不想修改父窗口的消息处理函数,我想我根本不用关心父窗口如何,否则我就不要hook这个消息了。rn
关于hook的问题
有没有哪个兄弟能把 全局的hook的源码发给我 我搞了半天 按三木兄的方法老是不能编译
关于api hook的问题!
遇到这样一个问题,对一个测试程序(简单的窗口)进行apihook,hook MessageBoxA(W)函数,如果在测试程序的消息相应函数里调用MessageBoxA(W),成功。可是问题出来了,如果在窗口建立之前调用MessageBoxA(W),发现不能hook到,大致如下代码解释:rnwinmain()rnrnMessageBoxA(W);//Hook 不到rn....rnCreateWindow;rnwhilernrnGetMessage()rn...rnrnCALLBACK WinProc(...)rnrn...rnSwitchrn case WM_DESTROYrn MessageBoxA(W)//成功hookrn......rnrn这是为什么,有法子解决吗?rnrn
关于API HOOK的问题
为什么我HOOK一个进程的send函数会导致进程自动关闭,比如说酷狗。比如我想截获酷狗进程的数据封包,我把代码写在一个dll里,然后注入到酷狗进程里。注入的办法倒不是关键,我就不发自己写的注入程序了,我随便找一个dll注入器注入的,dll代码如下:rn[code=C/C++]#include rn#include rnusing namespace std;rnchar SendJmp[5]=0;rnchar MySendJmp[5]=(char)0xe9;rnint WINAPI MySend(SOCKET s,const char FAR* buf,int len,int flags);rntypedef int (WINAPI *RPsend1)(SOCKET s,const char FAR* buf,int len,int flags);rnRPsend Psend=(RPsend)::GetProcAddress(::LoadLibrary(L"ws2_32.dll"),"send");rnofstream SendOut("SendData.txt");rnBOOL APIENTRY DllMain(HMODULE d1,DWORD d2,LPVOID d3) rn rn DWORD dwJmpAddr=0;rn dwJmpAddr=(DWORD)MySend-(DWORD)Psend-5;rn memcpy(MySendJmp+1,&dwJmpAddr,4);rn ReadProcessMemory((void*)-1,Psend,SendJmp,5,NULL);rn WriteProcessMemory((void*)-1,Psend,MySendJmp,5,NULL);rn return TRUE; rnrnint WINAPI MySend(SOCKET s,const char FAR* buf,int len,int flags)rnrn SendOut<<"Send:"<
关于HOOK的问题
呃,是这么回事。不知道有没有玩DNF的同鞋。 按键精灵对于这款游戏来说完全被和谐, 但有些按键类辅助依然可以正常使用,请大家给个思路。
关于journalrecord hook的问题
在设置了journalrecord hook后可以使鼠标和键盘失效,但是你做的操作在解除hook后rn会实现,我不明白的是为什么ctr+alt+del却可以中断hook执行呢?难道ctr+alt+delrn不放入system queue里么?rn请大家帮我想想
一个关于HOOK的问题
请问,我用setwindowshookex钩到键盘消息后,如何改变消息,rn例如按下Control键,结果应用程序收到的是Alt键,rn我找到很多例子,都是收到消息后的去做特定的事,没有修改消息本身的.rn请问,是否能修改键盘消息,如果可以,请给出例子,谢谢
~的优先级与>>的优先级问题
[code=C/C++]rn#include rnusing namespace std;rnrnint main(void)rnrn unsigned char a = 0xA5;rn unsigned char b = ~a>>4;rn printf("%d\n", b);rn return 0;rnrn[/code]rn求b的值。
再问:关于Hook的问题
设置钩子:rnHHOOK SetWindowsHookEx(rn int idHook, // hook typern HOOKPROC lpfn, // hook procedurern HINSTANCE hMod, // handle to application instancern DWORD dwThreadId // thread identifierrn);rnSetWindowsHookEx的第二个参数,所声明的代理必须是这种形式吗:rnpublic delegate int HOOKPROC(int nCode, int wParam, int lParam);rn如果是的话,int nCode, int wParam, int lParam,应该怎样理解和使用?
关于hook的一个问题。
hook可以截获一个消息的响应,但是能不能截获对特定api的调用呢?rn请指点!
关于HOOK的问题?
我写了HOOK的程序,在SetWindowsHookEx的第一个参数我用WH_GETMESSAGE rn我想问的是如何判断是键盘或鼠标消息,而且我希望拦截下来后不把程序传给rn别的程序,自己将他处理?rnrn希望各位高手能帮帮我,先谢了!!!!
关于hook的一个问题!
我想hook一个使用winsock的程序,把封包过滤后再发出,以及接受的包进行分析,是不是用hook,WM_GETMESSAGE类型呢?还有,我如何保存原来winsock api的地址,等处理完后再调用?还有只想对一个进程进行处理,不影响其它程序,怎么控制呢?如果有类似的源代码,给我一个参考,谢谢咯!
关于HOOK的问题?
有两个HOOK程序H1,H2,都是全局的,都截获键盘消息rn如果H1执行后,再执行H2,那么H1将截获不到键盘消息了,全被H2截获到,直到H2退出。rn有什么办法使此情况下H1,H2都能截获到消息呢?或者H2执行时,H1能知道H2建立了HOOK?
关于hook的问题!
我见一片文章写到: rn hProcess:=GetCurrentProcess;rn //指向新地址的指针rn [color=#FF6600]NewAddr.MovEax:=$B8;rn NewAddr.Addr:=DWORD(NewFunc);rn NewAddr.JmpCode:=$E0FF[/color];rn最后这个能hook自己的几乎所有的api函数 上面的地址是固定的么? 为什么 谢谢!
关于windows hook的问题
最近在研究windows hook,有很多疑惑, 关于如何挂钩可以给个示例代码吗,比如给A进程挂钩,需要监控A进程中的WM_MOUSE_LL消息, 打印到console就行。
关于Hook winspool.drv的问题
我在做Hook Winspool.drv中函数操作时,在word上可以正常操作,但是在记事本上,确实出现异常,报错信息如下:"0x77ef5b70"指令引用的"0x77ef5b70"内存。该内存不能为"written"。rn请给位大虾出手相救啊
关于hook的简单问题!
[code=C/C++]rnvoid CPara4::Onbtnaddhook() rnrn // TODO: Add your control notification handler code herern hook=SetWindowsHookEx(WH_KEYBOARD,hkPro,NULL,GetCurrentThreadId());rn rnrnvoid CPara4::Onbtndelhook() rnrn // TODO: Add your control notification handler code herern if ( UnhookWindowsHookEx(hook))rn rn AfxMessageBox("卸载完毕");rn rnrn rn[/code]rn我连续点击了两下安装钩子 但是只能成功卸载一个 那么另一个怎么卸载呀? 他跑哪去了?
关于hook的简单问题
CallNextHookEx(NULL, nCode, wParam, lParam);第一个参数如果设为NULL,为什么钩子还是起作用?
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo