阅读:1463回复:2
WINDOWS api 全局钩子实现问题
使用CreateRemoteThread来注入DLL,
先是对Explorer等程序注入一个专门截取CreateProcessA和CreateProcessW的DLL,然在这两个函数中判断,如果新进程名字是notepad和ie,就注入另外一个用于截取待截取API的DLL。 在程序中的实现如下: BOOL WINAPI Hook_CreateProcessW(LPWSTR Para0, LPWSTR Para1, LPSECURITY_ATTRIBUTES Para2, LPSECURITY_ATTRIBUTES Para3, BOOL Para4, DWORD Para5, LPVOID Para6, LPWSTR Para7, LPSTARTUPINFOW Para8, LPPROCESS_INFORMATION ProcessInformation){ //调用原来的函数 BOOL nResult=((LUO_CREATEPROCESSW)(PROC)g_CreateProcessW)(Para0, Para1, Para2, Para3, Para4, Para5|CREATE_SUSPENDED, Para6, Para7, Para8, ProcessInformation); //注入Dll int bRet=0; //bRet=WhatKindOfProcess(Para1);//判断是哪一类进程 if(0==bRet){ InjectLibW(ProcessInformation->dwProcessId, L\"C:\\\\APISpy2003\\\\APISpyLib.dll\"); }els if( 0xFFFFFFFF==ResumeThread(ProcessInformation->hThread)) ::MessageBox(NULL,\"无法继续执行!\",\"提示(HKCreProcLib.DLL:CreateProcessW)\",MB_OK); return (nResult); } 但在调试中发现,如果是以挂起方式(即Para5|CREATE_SUSPENDED)启动新进程注入,则新进程一起动就退出;而去掉CREATE_SUSPENDED则可以截取并正常运行。 这是为什么? |
|
最新喜欢:![]()
|
沙发#
发布于:2003-09-23 13:11
因为第一个线程是初始化线程,也就是主线程
而如果这个进程的启动参数是 SUSPEND的话, 你ResumeThread,并不能使得主线程能继续 如果你的主线程并没有运行,也就是说,并没有进行初始化, 那么当你的远程注射线程运行的时候,就会出现异常。 然后就导致了整个进程的退出, 这就是为什么新进程一启动就退出 的原因了。 |
|
板凳#
发布于:2003-09-21 21:25
不行就不用了
|
|