修复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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异