一种在32位Windows进程中运行64位代码的方法
通过用汇编强改段寄存器的方式,以C++内联汇编为例:void 运行部分64位代码(void *想运行的代码入口)
{
unsigned long origin_esp = 0;
__asm {
mov origin_esp, esp
and esp, 0xfffffff0
push 033h ; CS=0x33时CPU对程序的地址空间解释为64位
call push_eip
push_eip:
add, 5
retf
; CPU进入64位模式
sub esp, 040h ; 从栈顶开一块空间
mov eax, 想运行的代码入口
call eax ; 从此开始执行目标64位代码,最终返回这里
add esp, 040h
mov ecx, 02bh
mov ss, cx
call push_rip
push_rip:
mov dword ptr, 023h ; CS=0x23时CPU对程序的地址空间解释为32位
add dword ptr, 0dh
retf
; CPU回到32位模式
mov esp, origin_esp
}
}
837468220 发表于 2020-12-30 11:21
有没有示例呢。。。
我一楼发的就是示例呀,难不成你是想要这种示例?
.版本 2
.子程序 ExecuteNative64
.参数 EntryPoint, 整数型
.局部变量 saved_esp, 整数型
saved_esp = 0
置入代码 ({ 137, 101, 252, 131, 228, 240, 106, 51, 232, 0, 0, 0, 0, 128, 4, 36, 5, 203, 131, 236, 64, 139, 69, 8, 255, 208, 131, 196, 64, 185, 43, 0, 0, 0, 142, 209, 232, 0, 0, 0, 0, 199, 68, 36, 4, 35, 0, 0, 0, 131, 4, 36, 13, 203, 139, 101, 252 })
返回 ()
拿好不谢{:1_926:} 建议进入x64后首先将RSP寄存器值进行8字节对齐,不然很大几率后面访问堆栈地址没对齐崩溃,要使用kernel32等还要自己加载到64位空间 然后wow64下64位空间的PEBTEB各种坑 ,系统回调也被wow64接管了,跑跑小shellcode还行 大程序就算了 好想法,但要防止8字节的数据,运行前应检查 感谢楼主的分享! 楼主试过什么程序可以呢? bachelor66 发表于 2020-12-28 16:26
楼主试过什么程序可以呢?
这个是我一个配合shellcode使用的产品,call eax那个地方就是call我注入到其他64位进程中的64位shellcode的。如果是其他应用场景的话也可以不call,代码少的话在call那个位置继续写代码就可以了。 感谢楼主分享
感谢楼主分享 感谢楼主分享 感谢分享 wow!好东西收藏先