你看看你问的是什么?
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名");
得到的就是它的句柄.

解决方案 »

  1.   

    1.WIN32下,进程将DLL加载到自己的进程空间,由于每个进程的地址空间是独立的,所以如果同一个DLL碚多个进程加载的话,每个进程都有该DLL的一份单独拷贝,而不是共享的。2.当进程加载DLL时,他会调用DLL的DllMain函数:
    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;
    }