你看看你问的是什么?
DllMain(HINSTANCE hInstance...)!!!!
我的代码是什么?
if (dwReason == DLL_PROCESS_ATTACH)
{
AfxInitExtensionModule(MhdDLL, hInstance);
new CDynLinkLibrary(MhdDLL);
glhInstance=hInstance;
}
SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
也可以这么写...这样你会比较清楚.
HINSTANCE hInstance=GetModuleHandle("mhd.dll");
SetWindowSHookEx(WH_MOUSE,MouseProc,glhInstance,0);
这两分代码的作用是一样的!
它们当然是得到mhd.dll的句柄!!
但是SetWindowsHookEx把glhInstance注入到其它的进程中.
下面是我写的大概流程,有些是剪贴的,
你该多看看网上的代码和贴子,非常有好处!
由于系统鼠标钩子已经完成注入其它GUI进程的工作,就不需要注入再做工作。
如果你知道所有系统钩子的函数必须要在动态库里,你就不会对注入这个词感到奇怪。
首先,当一个进程隐式或显示调用一个动态库里的函数时,系统都要把这个动态库映射
到这个进程的虚拟地址空间里。将DLL映射到进程的虚拟地址空间里使得DLL成为
这个进程的一部分,它以这个进程的身份执行,使用这个进程的堆栈。
当包含钩子的DLL注入了其它的进程后,寻找映射到虚拟内存的各个模块(EXE和DLL)
的基地址。
EXE和DLL被映射到虚拟内存空间的什么地方是由它们的基地址决定的。它们的基地址
是在链接时由链接器决定的。当你新建一个Win32工程时,VC++链接器使用缺省的
基地址0x00400000。你如果跟踪进WinMain的时候,hInstance值总是0x00400000就是上面的
原因。当然也可以通过链接器的/BASE选项改变模块的基地址。
现在我们知道了,EXE通常被映射到虚拟内存的0x00400000处。DLL由于它们也有各自
不同的基地址,通常情况下也被映射到不同进程的相同的虚拟地址空间处。
那么我们怎么才能知道EXE和DLL被映射到哪里了呢?
在win32中,HMODULE和HINSTANCE是相同的。它们就是相应模块被装入进程的虚拟
内存空间的基地址。比如:
HMODULE hmodule=GetModuleHandle(“user32.dll”);
返回的模块句柄强制转换为指针后,就是user32.dll被装入的基地址。
关于如何找到虚拟内存空间映射了哪些DLL?
while (pImportDesc->Name)
{
PSTR szCurrMod=(PSTR)((DWORD)pDOSHeader+(DWORD)(pImportDesc->Name));
if(stricmp(szCurrMod,szImportMod)==0)
break;
pImportDesc++;
}
得到基地址后,根据PE文件的格式穷举这个模块的IMAGE_IMPORT_DESCRIPTOR数组,
看是否引入了user32.DLL。如是,穷举IMAGE_THUNK_DATA数组,看看是不是有MessageBoxA;
如果有就MessageBOx("找到.");
如你所说,我改了.没有用,还是要弹出来.
我也把HookAPIByName(glhInstince,"user32.dll",aaa);
改为HookAPIByName(GetModuleHandle("mhd.dll"),"user32.dll",aaa);
也没有用.
可知不是地址的问题,
而是跳转或者是跳转后的函数有没有执行的问题.
快给我回复!GetModuleHandle("你的dll名");
得到的就是它的句柄.
DllMain(HINSTANCE hInstance...)!!!!
我的代码是什么?
if (dwReason == DLL_PROCESS_ATTACH)
{
AfxInitExtensionModule(MhdDLL, hInstance);
new CDynLinkLibrary(MhdDLL);
glhInstance=hInstance;
}
SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
也可以这么写...这样你会比较清楚.
HINSTANCE hInstance=GetModuleHandle("mhd.dll");
SetWindowSHookEx(WH_MOUSE,MouseProc,glhInstance,0);
这两分代码的作用是一样的!
它们当然是得到mhd.dll的句柄!!
但是SetWindowsHookEx把glhInstance注入到其它的进程中.
下面是我写的大概流程,有些是剪贴的,
你该多看看网上的代码和贴子,非常有好处!
由于系统鼠标钩子已经完成注入其它GUI进程的工作,就不需要注入再做工作。
如果你知道所有系统钩子的函数必须要在动态库里,你就不会对注入这个词感到奇怪。
首先,当一个进程隐式或显示调用一个动态库里的函数时,系统都要把这个动态库映射
到这个进程的虚拟地址空间里。将DLL映射到进程的虚拟地址空间里使得DLL成为
这个进程的一部分,它以这个进程的身份执行,使用这个进程的堆栈。
当包含钩子的DLL注入了其它的进程后,寻找映射到虚拟内存的各个模块(EXE和DLL)
的基地址。
EXE和DLL被映射到虚拟内存空间的什么地方是由它们的基地址决定的。它们的基地址
是在链接时由链接器决定的。当你新建一个Win32工程时,VC++链接器使用缺省的
基地址0x00400000。你如果跟踪进WinMain的时候,hInstance值总是0x00400000就是上面的
原因。当然也可以通过链接器的/BASE选项改变模块的基地址。
现在我们知道了,EXE通常被映射到虚拟内存的0x00400000处。DLL由于它们也有各自
不同的基地址,通常情况下也被映射到不同进程的相同的虚拟地址空间处。
那么我们怎么才能知道EXE和DLL被映射到哪里了呢?
在win32中,HMODULE和HINSTANCE是相同的。它们就是相应模块被装入进程的虚拟
内存空间的基地址。比如:
HMODULE hmodule=GetModuleHandle(“user32.dll”);
返回的模块句柄强制转换为指针后,就是user32.dll被装入的基地址。
关于如何找到虚拟内存空间映射了哪些DLL?
while (pImportDesc->Name)
{
PSTR szCurrMod=(PSTR)((DWORD)pDOSHeader+(DWORD)(pImportDesc->Name));
if(stricmp(szCurrMod,szImportMod)==0)
break;
pImportDesc++;
}
得到基地址后,根据PE文件的格式穷举这个模块的IMAGE_IMPORT_DESCRIPTOR数组,
看是否引入了user32.DLL。如是,穷举IMAGE_THUNK_DATA数组,看看是不是有MessageBoxA;
如果有就MessageBOx("找到.");
如你所说,我改了.没有用,还是要弹出来.
我也把HookAPIByName(glhInstince,"user32.dll",aaa);
改为HookAPIByName(GetModuleHandle("mhd.dll"),"user32.dll",aaa);
也没有用.
可知不是地址的问题,
而是跳转或者是跳转后的函数有没有执行的问题.
快给我回复!GetModuleHandle("你的dll名");
得到的就是它的句柄.
BOOL WINAPI DllMain(
HINSTANCE hInstance,
DWORD dwReason,
LPVOID lpvReserved
);
进程同时并传入该进程的实例句柄, 也就是DllMain()函数的参数中的hInstance;另外dwReason为调用DllMain的原因,其中有两个:
DLL_PROCESS_ATTACH 进程第一次加载该DLL
DLL_PROCESS_DETACH 进程卸载该DLL
你可以在DLL_PROCESS_ATTACH时得到hInstance,用一个全局变量将其保存起来;第三个参数保留,现在没用。示例程序如下:HINSTANCE hInst;BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
...
break;
default:
break;
}
return TRUE;
}