从C中的PE文件部分检索汇编代码

时间:2018-08-13 17:36:02

标签: c security code-injection portable-executable

我正在尝试编写一个简单的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复制的(空字节除外) 我的问题是:

  1. 如果这是.text节(shellcode)的实际代码,为什么受感染的程序没有执行它?
  2. 也许这是错误的方法?
  3. 也许我做的方法是正确的方法,但是我搞砸了更改入口点吗?

注意: shellcode是用汇编(32位)编写的,它只是从Windows API调用MessageBox。另外,C程序也被编写为32位应用程序。

任何帮助将不胜感激,我为此付出了一段时间,毕竟,我只是想更好地了解PE文件格式。因此,任何资源都将受到欢迎。

如果有时间请检查完整的代码。

如果在错误的地方提出这样的问题,请将我重定向到正确的地方。 谢谢,祝你有美好的一天!

0 个答案:

没有答案