我正在尝试将64位DLL注入64位进程(探测器)
我尝试过使用Remote-thread \ Window Hooks技术,但是一些Anti-Viruses检测到我的加载器是误报
阅读本文后Dll Injection by Darawk,我决定使用代码洞穴
它适用于32位,但因为VS不支持64位的内联汇编,所以我必须明确地编写操作码和操作数。
我查看了这篇文章:64Bit injection using code cave,正如文章所述,存在一些差异:
这里必须包含几个不同之处:
- MASM64使用fastcall,因此函数的参数必须在a中传递 注册而不是堆栈。
- 必须考虑地址的长度--32对64位。
- 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
对我来说似乎很好,但我想我错过了一些东西 我的完整代码可以在这里找到:Source code
任何想法\建议\替代品?
答案 0 :(得分:3)
存储返回值的第一个推送仅推送32位值。代码中的dwOldIP
也是DWORD
,它应该是DWORD64
。必须从DWORD
投射到ctx.Rip
应该足以提示;)
此外,在进入LoadLibrary
的呼叫时,请确保堆栈是16字节对齐的。如果堆栈未正确对齐,某些API会抛出异常。
答案 1 :(得分:1)
显然,主要的问题是我在没有EXECUTE_PAGE_READWRITE权限的情况下分配了代码洞穴数据,因此数据块被视为数据而不是操作码。