使用代码洞穴注入64位DLL

Ome*_*mer 6 c++ security assembly masm code-injection

我正在尝试将64位DLL注入64位进程(探测器).
我尝试过使用Remote-thread\Window Hooks技术,但是一些Anti-Viruses检测到我的加载器是误报.
阅读本文后:Darawk的Dll Injection,我决定使用代码洞穴.
它适用于32位,但因为VS不支持64位的内联汇编,所以我必须明确地编写操作码和操作数.
我看了这篇文章:64Bit注入使用代码洞穴,正如文章所述,存在一些差异:

这里必须包含几个不同之处:

  1. MASM64使用fastcall,因此函数的参数必须在寄存器中传递,而不是在堆栈中传递.
  2. 必须考虑地址的长度--32对64位.
  3. MASM64没有指令将所有寄存器压入堆栈(如32位的pushad),因此必须通过显式推送所有寄存器来完成.

我按照这些指导原则运行了文章的例子,但没有我做过的工作.
目标进程刚刚在我恢复主线程时崩溃,我不知道如何真正调查它因为ollydbg没有64位支持.

这是我注入之前代码的样子:

   codeToInject:  
000000013FACD000  push        7741933Ah  
000000013FACD005  pushfq  
000000013FACD006  push        rax  
000000013FACD007  push        rcx  
000000013FACD008  push        rdx  
000000013FACD009  push        rbx  
000000013FACD00A  push        rbp  
000000013FACD00B  push        rsi  
000000013FACD00C  push        rdi  
000000013FACD00D  push        r8  
000000013FACD00F  push        r9  
000000013FACD011  push        r10  
000000013FACD013  push        r11  
000000013FACD015  push        r12  
000000013FACD017  push        r13  
000000013FACD019  push        r14  
000000013FACD01B  push        r15  
000000013FACD01D  mov         rcx,2CA0000h  
000000013FACD027  mov         rax,76E36F80h  
000000013FACD031  call        rax  
000000013FACD033  pop         r15  
000000013FACD035  pop         r14  
000000013FACD037  pop         r13  
000000013FACD039  pop         r12  
000000013FACD03B  pop         r11  
000000013FACD03D  pop         r10  
000000013FACD03F  pop         r9  
000000013FACD041  pop         r8  
000000013FACD043  pop         rdi  
000000013FACD044  pop         rsi  
000000013FACD045  pop         rbp  
000000013FACD046  pop         rbx  
000000013FACD047  pop         rdx  
000000013FACD048  pop         rcx  
000000013FACD049  pop         rax  
000000013FACD04A  popfq  
000000013FACD04B  ret   
Run Code Online (Sandbox Code Playgroud)

对我来说似乎很好,但我想我错过了一些东西.
我的完整代码可以在这里找到: 源代码

任何想法\建议\替代品?

pez*_*ode 5

存储返回值的第一次推送仅推送一个 32 位值。dwOldIP在你的代码中也是 a DWORD,它应该是一个DWORD64. 必须转换为DWORDfromctx.Rip应该已经足够暗示了;)

另外,请确保在进入对 的调用时堆栈是 16 字节对齐的LoadLibrary。如果堆栈未正确对齐,某些 API 会引发异常。


Ome*_*mer 3

显然,主要问题是我在没有 EXECUTE_PAGE_READWRITE 权限的情况下分配了代码洞穴数据,因此数据块被视为数据而不是操作码。

  • 没关系,通过应用所有 pezcode 建议来修复它:http://pastebin.com/34xCSrL2 (3认同)