在 IDA 的帮助下,我能够通过简单地用十六进制编辑器替换一些字节来将更改硬编码为可执行文件,我所做的是将分辨率更改为更大的内容。
我了解到可以用钩子做类似的事情,所以我把所有的编辑都转移到了多个钩子上。现在的问题是我需要在其他任何事情之前加载我新创建的 DLL,这意味着使用不同的方法而不是简单地注入它。
我希望这是有道理的,实现这一目标的最佳方法是什么?
在 IDA 的帮助下,我能够通过简单地用十六进制编辑器替换一些字节来将更改硬编码为可执行文件,我所做的是将分辨率更改为更大的内容。
我了解到可以用钩子做类似的事情,所以我把所有的编辑都转移到了多个钩子上。现在的问题是我需要在其他任何事情之前加载我新创建的 DLL,这意味着使用不同的方法而不是简单地注入它。
我希望这是有道理的,实现这一目标的最佳方法是什么?
一种简单的方法是修改 IAT(导入地址表/导入目录),这可以使用诸如LordPE 之类的工具来完成。
从主屏幕中选择PE Editor并选择要修改的可执行文件(或 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;