我正在尝试编写一个简单的PE文件注入器。 基本思想是我打开并映射(有效载荷和目标)文件。然后从有效负载中提取.text部分,在目标中找到一个代码凹坑,然后将“ shellcode”复制到该代码凹坑中。
我在从有效载荷中提取“ shellcode”时遇到麻烦,或者至少这是我认为的问题。
这是程序的完整代码:https://pastebin.com/LGBw3DkD
但是,这个特定问题的重要代码是:
// Retrieve shellcode size and pointer to the code
shellcodeSize = GetShellcodeSize(lpPayBase, &offsetShellcode);
...some other code...
// Create buffer for payload
hHeap = HeapCreate(0, 0, shellcodeSize);
lpHeap = HeapAlloc(hHeap, HEAP_ZERO_MEMORY, shellcodeSize);
// Load the payload in the buffer
memcpy(lpHeap, lpPayBase + offsetShellcode, shellcodeSize);
// Copy the payload in codecave
memcpy((LPBYTE)(lpTgBase + injPos), lpHeap, shellcodeSize);
GetShellcodeSize()函数的代码:
int GetShellcodeSize(LPBYTE lpFileBase, DWORD *shellcodeOff) {
PIMAGE_DOS_HEADER pDosH = RetrieveDosH(lpFileBase);
// Find .text section
PIMAGE_SECTION_HEADER txtSection = FindSection(".text", pDosH);
if (txtSection == NULL) {
return 0;
}
else {
// Retrieve offset to the code
*shellcodeOff = txtSection->PointerToRawData;
// Return the size
return txtSection->SizeOfRawData;
}
}
问题是,当我将shellcode的偏移量添加到映射文件时,会得到以下信息: Screenshot layout of memory
因此,当我将shellcode复制到内存中,再复制到codecave中时,它是从地址0x000E0400-> 0x000E0417复制的(空字节除外) 我的问题是:
注意: shellcode是用汇编(32位)编写的,它只是从Windows API调用MessageBox。另外,C程序也被编写为32位应用程序。
任何帮助将不胜感激,我为此付出了一段时间,毕竟,我只是想更好地了解PE文件格式。因此,任何资源都将受到欢迎。
如果有时间请检查完整的代码。
如果在错误的地方提出这样的问题,请将我重定向到正确的地方。 谢谢,祝你有美好的一天!