DLL装载后被映射到主进程的虚拟内存空间中;这个地址是系统决定的;没有固定规律;API hooker不应该关心这个问题;获得你的目标API地址后只管hooking 就是了;

解决方案 »

  1.   

    你所说的另一种方法是指IAT注入,原理是一样,jmp跳转
      

  2.   

    IAT 获得的地址  和 Getprocaddress的地址是一样的吗?
      

  3.   

    GetProcAddress这个不是dll的么?
      

  4.   

    目标API的函数入口地址,用这2种方式得到的,是一样的。
    但是前者是用来修改IAT表,后者是为了在目标API的入口处填充上JMP指令,即修改的内存是不一样的。
      

  5.   

    使用代码改写法最有效,使用detoues吧.
      

  6.   

    应用层hook api有两个方法,你上面说的好像都是一种,不是两种!还有一种,是直接改变一个系统api的机器码,用机器码写入jmp 0x00ff00ff   ,00ff00ff是你自己函数的地址,这个方法代码少,拦截PE输入表,稍微麻烦点,功能都一样
      

  7.   

    两种方法我都实现过, lz你看看代码吧 
    跳转(修改函数前5个字节):
    HANDLE user=LoadLibrary("user32.dll");
    if(user==NULL)
    {
    MessageBox("1");
    return;
    }
    FARPROC add=GetProcAddress((HMODULE)user, "MessageBoxA");
    BYTE before[5];
    ReadProcessMemory(GetCurrentProcess(), (void *)add, (void *)before, 8, NULL);

    BYTE FiveByte[5];
    DWORD tojmp=(DWORD)NHMessageBoxA-(DWORD)add-5;
    FiveByte[0]=0xE9;
    BYTE temp;
    WORD wHiWord = HIWORD(tojmp);
    WORD wLoWord = LOWORD(tojmp);
    temp = LOBYTE(wLoWord); // -------------------------
    FiveByte[1] = temp;
    temp = HIBYTE(wLoWord);
    FiveByte[2] = temp;
    temp = LOBYTE(wHiWord);
    FiveByte[3] = temp;
    temp = HIBYTE(wHiWord);
    FiveByte[4] = temp;
    修改ITA:
    PROC pfnCur=GetProcAddress(GetModuleHandle("user32.dll"), "SetRect");
    CString temp;
    ULONG size;
    IMAGE_IMPORT_DESCRIPTOR* iid=(IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(m_myself, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size);
    if(iid==NULL)
    {
    MessageBoxA(_T("no idd"));
    return;
    } for(;iid->Name;iid++)
    {
    char* module=(char *)((DWORD)m_myself+iid->Name);
    //MessageBox(module);
    if(lstrcmpiA(module, "user32.dll")==0)
    break;
    } if(iid->Name==0)
    {
    MessageBoxA("no mod");
    return;
    } IMAGE_THUNK_DATA* itd=(IMAGE_THUNK_DATA*)((DWORD)m_myself+iid->FirstThunk); for(; itd->u1.Function ;itd++)
    {
    PROC ppfn=(PROC)itd->u1.Function;
    if(ppfn==pfnCur)
    MessageBoxA("same");
    }
      

  8.   

    apihook??我觉得 不需要发帖了 没有几个人会  回答你的 技术都是不外传的 自己研究吧  我也在找呢  
      

  9.   

    两种技术,缺点都很明显,修改IAT的话,动态加载DLL的话比较难HOOK到;修改函数入口的话,存在同步问题,还是推荐微软的detours,回楼上的,技术是有人共享的
      

  10.   

    你看下操作系统中的 存储管理把 上面有详细的讲述寻址问题。 程序中的地址是偏移地址,也就是逻辑地址。在运行中,由于内存是多道的。操作系统的储存管理程序,给程序分配一个基地址B,将地址B放到寄存器中。实际物理地址=B+偏移地址~~~~~
      

  11.   

    我最近也在研究detours,这可是好东西,只要是好东西,总会有大公无私的人。要想了解hook api, detours一定要了解。 
      

  12.   

    闷Hook API还是  叫技术?Hook SSDT都太有人玩了孤陋寡闻了
      

  13.   

    detours很容易写,核心代码不超过200行