我正在分析一种恶意软件,该恶意软件将pe文件解密到内存中,就像这样
我将ollydumpex用于x64dbg转储内存,
然后使用IDA进行分析,但是它像这样
这是一个dll,它将被注入其他进程。因此当前进程将不会加载它,那么我该如何修复它?
答案 0 :(得分:1)
第一件事是OEP。在屏幕截图上,我看到EntryPoint(PE \ x00 \ x00签名地址的+ 0x28)为零。因此,首先,您需要找到此入口点的真正位置。
因此,如果您查看CreateRemoteThread
描述:
HANDLE 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(导入重构器)和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
并将第三个参数(dwProcessId
)替换为应用程序的PID。然后跟踪到屏幕快照中的那一行,用ImageBase替换第二个参数并执行WriteProcessMemory。就这样!您现在可以使用ImpREC或Scilla恢复IAT。只需打开您的进程,然后选择DLL someDll.dll。键入0xB159作为EntryPoint / OEP,然后依次单击IAT AutoSearch
,Get Imports
和Fix dump
。祝你好运!