while(pThunk->u1.Function)
{
// lpAddr指向的内存保存了函数的地址
DWORD* lpAddr = (DWORD*)&(pThunk->u1.Function);
     
if(*lpAddr == (DWORD)g_orgProc)
{
// 修改IAT表项,使其指向我们自定义的函数,相当于“*lpAddr = (DWORD)MyMessageBoxA;”

DWORD* lpNewProc = (DWORD*)MyMessageBoxA;

     
                   ::WriteProcessMemory(::GetCurrentProcess(), 
lpAddr, &lpNewProc, sizeof(DWORD), NULL);
return TRUE;
}
描述:修改带入表中函数的地址,
问题: ::WriteProcessMemory(::GetCurrentProcess(), lpAddr, &lpNewProc, sizeof(DWORD), NULL);
这个函数中传递的为什么是&lpNewProc,lpNewProc不就是保存了我定义的函数MyMessageBoxA的地址吗
传递lpNewProc就相当于向内存中写入了这个函数的地址,在这里却传递的是&lpNewProc
很不理解,麻烦大家了

解决方案 »

  1.   

    那为什么要传递指针的值 呢 &lpNewProc
    终于有人回帖了 呵呵
      

  2.   

    你要写入IAT的不是这个函数过程的地址而是存放这个函数指针地址的地址,IAT就是这么调用的,通过地址,假设为ebx,然后它去Call [ebx],而不是call ebx
      

  3.   

    关于楼主的例子,我在正在做并且还有点其它的疑惑。在自定义的函数中调用原来的函数,如果直接调用MessageBoxA就会出错,必须先将原函数保存起来,然后在自定义函数中调用。我见过有的程序,并没有保存原函数地址呀,而是直接调用的,例如要挂钩MessageBoxA或者OpenPorcess,但是在定义函数中,仍然可以调用MessageBoxA、OpenPorcess。菜鸟们一般都没不会汇编,请大虾们详细说明下,谢谢啦!!!