当我从内存中转储pe时,如何修复IAT?

问题描述 投票:1回答:1

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

enter image description here

我使用ollydumpex for x64dbg来转储内存,

enter image description here

然后使用IDA进行分析,但就像这样

enter image description here

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

reverse malware ida
1个回答
1
投票

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

那么,如果你检查CreateRemoteThread描述:

HANDLE CreateRemoteThread(HANDLE 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中使用“选择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并用你的应用程序的PID替换第三个参数(dwProcessId)。然后跟踪到截图中的行,用ImageBase替换第二个参数并执行WriteProcessMemory。就这样!您现在可以使用ImpREC或Scilla恢复IAT。只需打开您的进程并选择DLL someDll.dll。键入0xB159作为EntryPoint / OEP并单击IAT AutoSearch,然后单击Get ImportsFix dump。祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.