【发布时间】:2018-08-30 23:55:33
【问题描述】:
我正在分析一个恶意软件,恶意软件将一个pe文件解密到内存中,像这样
我使用ollydumpex for x64dbg 转储内存,
然后用IDA分析,结果是这样的
这是一个dll,它将被注入其他进程。所以当前进程不会加载它,我该如何修复它?
【问题讨论】:
我正在分析一个恶意软件,恶意软件将一个pe文件解密到内存中,像这样
我使用ollydumpex for x64dbg 转储内存,
然后用IDA分析,结果是这样的
这是一个dll,它将被注入其他进程。所以当前进程不会加载它,我该如何修复它?
【问题讨论】:
首先是 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 Imports 和 Fix dump。祝你好运!
【讨论】: