将 DLL 永久加载到可执行文件

逆向工程 艾达 dll dll注入 汇编
2021-06-29 06:39:14

在 IDA 的帮助下,我能够通过简单地用十六进制编辑器替换一些字节来将更改硬编码为可执行文件,我所做的是将分辨率更改为更大的内容。

我了解到可以用钩子做类似的事情,所以我把所有的编辑都转移到了多个钩子上。现在的问题是我需要在其他任何事情之前加载我新创建的 DLL,这意味着使用不同的方法而不是简单地注入它。

我希望这是有道理的,实现这一目标的最佳方法是什么?

2个回答

一种简单的方法是修改 IAT(导入地址表/导入目录),这可以使用诸如LordPE 之类的工具来完成

从主屏幕中选择PE Editor并选择要修改的可执行文件(或 DLL): 在此处输入图片说明

然后点击Directories在此处输入图片说明

单击旁边的省略号按钮Import Table在此处输入图片说明

右键单击并选择add import在此处输入图片说明

现在添加您的 dll 和 DLL 的导出: 在此处输入图片说明

OK,然后SAVE虽然不是必需的,但您可以使用?按钮更正 PE 校验和(然后保存): 在此处输入图片说明

请注意,添加导入并不意味着加载 dll 的可执行文件调用指定的导出。这只是意味着 dll 将被加载并被DLLMain调用。

您可以创建一个加载程序,它只是创建处于挂起状态的目标应用程序,并将 dll 加载到该进程的虚拟地址空间中。这样,您注入的 dll 将在目标应用程序的入口点之前运行。示例代码:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
LPCSTR dllname = "testdll.dll";
LPVOID stringAddr = NULL;
LPVOID LoadLib = NULL;

LoadLib = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (LoadLib == NULL) {
    return -1;
}

if (!CreateProcess(TEXT("target.exe"), NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) {
    return -1;
}

stringAddr = VirtualAllocEx(pi.hProcess, NULL, strlen(dllname), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (stringAddr == NULL) {
    return -1;
}

WriteProcessMemory(pi.hProcess, stringAddr, dllname, strlen(dllname), NULL);
CreateRemoteThread(pi.hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLib, stringAddr, NULL, NULL);
ResumeThread(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;