修复IAT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//获取导入表首地址
IMAGE_DOS_HEADER* pDosHdr = (IMAGE_DOS_HEADER*)pImageBaseAddr;
IMAGE_NT_HEADERS* pNtHdr = (IMAGE_NT_HEADERS*)(pDosHdr->e_lfanew + (DWORD)pImageBaseAddr);
IMAGE_DATA_DIRECTORY* pDataDirHdr = (IMAGE_DATA_DIRECTORY*)pNtHdr->OptionalHeader.DataDirectory;
IMAGE_IMPORT_DESCRIPTOR* pImport = (IMAGE_IMPORT_DESCRIPTOR*)(pDataDirHdr[1].VirtualAddress + (DWORD)pImageBaseAddr);
  
while (pImport->OriginalFirstThunk != 0 || pImport->FirstThunk != 0)
{
    //获得当前DLL名
    char* chName = (char*)(pImport->Name + (DWORD)pImageBaseAddr);
  
    //加载模块
    HMODULE hModule = My_LoadLibraryExA(chName, 0, 0);
  
    //如果有INT表则通过INT表来修复IAT表
    DWORD* pReferenceTab = nullptr;
    (pImport->OriginalFirstThunk == 0x0) || (pImport->OriginalFirstThunk == 0xFFFFFFFF) ?
        pReferenceTab = (DWORD*)(pImport->FirstThunk + (DWORD)pImageBaseAddr) :
        pReferenceTab = (DWORD*)(pImport->OriginalFirstThunk + (DWORD)pImageBaseAddr);
  
    //被修复的IAT表
    DWORD* pIatTab = (DWORD*)(pImport->FirstThunk + (DWORD)pImageBaseAddr);
  
    DWORD dwIatIndex = 0;
    while (pReferenceTab[dwIatIndex] != 0)
    {
        //判断是什么方式导入 <序号> <名称>
        if ((pReferenceTab[dwIatIndex] & 0x80000000) == 0) //最高为1是序号导入
        {
            IMAGE_IMPORT_BY_NAME* pByName = (IMAGE_IMPORT_BY_NAME*)
                (pReferenceTab[dwIatIndex] + (DWORD)pImageBaseAddr);
  
            //获取到的API地址
            pIatTab[dwIatIndex] = (DWORD)My_GetProcAddress(hModule, pByName->Name);
        }
        else
        {
            DWORD dwIndex = pReferenceTab[dwIatIndex] & 0x7FFFFFFF;
            //获取到的API地址
            DWORD dwApiAddr = (DWORD)My_GetProcAddress(hModule, (char*)dwIndex);
            pIatTab[dwIatIndex] = (DWORD)dwApiAddr;
        }
        ++dwIatIndex;
    }
    //指向下一个结构体
    pImport += 1;
}

  

posted @   admrty  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示