我正在分析一个恶意软件,恶意软件将一个pe文件解密到内存中,如下所示
我使用烯丙基作为x64dbg来转储内存,
然后使用IDA进行分析,但它是这样的
这是一个dll,它将被注入到其他进程。所以目前的过程不会加载它,那么我如何才能修复它呢?
发布于 2018-08-30 07:55:33
第一件事是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 )和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作为切入点/OEP,然后单击IAT AutoSearch
,然后单击Get Imports
和Fix dump
。祝好运!
https://stackoverflow.com/questions/52073023
复制相似问题