【问题标题】:When I dump a pe from memory,how can I repair IAT?当我从内存中转储一个pe时,我该如何修复IAT?
【发布时间】:2018-08-30 23:55:33
【问题描述】:

我正在分析一个恶意软件,恶意软件将一个pe文件解密到内存中,像这样

我使用ollydumpex for x64dbg 转储内存,

然后用IDA分析,结果是这样的

这是一个dll,它将被注入其他进程。所以当前进程不会加载它,我该如何修复它?

【问题讨论】:

    标签: reverse malware ida


    【解决方案1】:

    首先是 OEP。在屏幕截图中,我看到 EntryPoint(PE\x00\x00 签名地址的 +0x28)为零。所以,首先你需要找到这个入口点的真正位置。

    所以,如果你检查CreateRemoteThread描述:

    句柄 CreateRemoteThread( 处理 hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );

    你需要参数lpStartAddress。该参数可以位于行

    4015C9  lea eax, dword ptr ds:[ebx+edi]
    

    所以,您的 edi 值为 0x3CE0000(这是另一个进程中的 ImageBase),而 ebx 值为 0xB159(这是 EntryPoint RVA)。在 OllyDumpEx 中,您必须将此值写入 EntryPoint 字段。

    恢复导入是一个漫长的过程,需要分析对库的所有调用并重新创建 IMPORT_DIRECTORY 和 IAT 表。您可以为此编写脚本或使用任何现有的。另一种选择是修补 Scylla(这是一个开源项目)并添加将 ImageBase 更改为某个特定值(在您的情况下为 0x3CE0000)的能力。

    ImpREC (Import Reconstructor) 和 Scylla 等工具不适合在没有补丁的情况下使用。这里真正的问题是您的 DLL 没有像普通 DLL 那样加载。因此,您不能在 ImpREC/Scylla 中使用“Pick DLL”来选择它。

    但是你可以做一些破解。创建 2 个空项目 - DLL 和加载 DLL 的 EXE。在 exe 中加载您的 DLL,然后像这样编写无限循环:

    #include <stdio.h>
    #include <Windows.h>
    int main() {
         HANDLE hLib = LoadLibraryA("someDll.dll");
         DWORD old;
         // this will make your DLL writable.
         VirtualProtect((DWORD)hLib, 0x3C414, PAGE_EXECUTE_READWRITE, &old);
         DWORD pid = GetProcessId(GetCurrentProcess());
         char addressBuffer[64];
         sprintf(addressBuffer, "ImageBase: %#x\nPID: %#x", (DWORD)hLib, pid);
         MessageBoxA(NULL, addressBuffer, "Donor DLL address", MB_OK);
         for (;;) Sleep(1000);
         return 0;
    }
    

    我建议您在 DLL 中添加一些大数据对象。此 DLL 将成为您的恶意软件的捐赠者。只需在函数之外的某处添加int bigData[0x3C414];(函数数据将放在堆栈上,但您需要一个大的主模块内存)。我从 EBP 值中得到 0x3C414 作为恶意软件的大小。

    现在运行这个应用程序并从消息框中读取 ImageBase 和 PID。然后跟踪到OpenProcess 并将第三个参数 (dwProcessId) 替换为您的应用程序的 PID。然后跟踪到屏幕截图中的行,将第二个参数替换为 ImageBase 并执行 WriteProcessMemory。就这样!您现在可以使用 ImpREC 或 Scilla 恢复 IAT。只需打开您的进程并选择 DLL someDll.dll。键入 0xB159 作为 EntryPoint/OEP 并单击 IAT AutoSearch,然后单击 Get ImportsFix dump。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多