qzhsjz 发表于 2020-12-28 15:58

一种在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
    }
}

qzhsjz 发表于 2020-12-30 13:19

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:}

昨夜星辰恰似你 发表于 2021-1-5 10:07

建议进入x64后首先将RSP寄存器值进行8字节对齐,不然很大几率后面访问堆栈地址没对齐崩溃,要使用kernel32等还要自己加载到64位空间    然后wow64下64位空间的PEBTEB各种坑 ,系统回调也被wow64接管了,跑跑小shellcode还行   大程序就算了

guangzisam 发表于 2020-12-28 20:17

好想法,但要防止8字节的数据,运行前应检查

国际豆哥 发表于 2020-12-28 16:25

感谢楼主的分享!

bachelor66 发表于 2020-12-28 16:26

楼主试过什么程序可以呢?                        

qzhsjz 发表于 2020-12-28 16:30

bachelor66 发表于 2020-12-28 16:26
楼主试过什么程序可以呢?

这个是我一个配合shellcode使用的产品,call eax那个地方就是call我注入到其他64位进程中的64位shellcode的。如果是其他应用场景的话也可以不call,代码少的话在call那个位置继续写代码就可以了。

jopyy2020 发表于 2020-12-28 17:37

感谢楼主分享

ynjian 发表于 2020-12-28 18:01


感谢楼主分享

caiji1 发表于 2020-12-28 20:31

感谢楼主分享

ellvincent 发表于 2020-12-28 21:25

感谢分享

鸭子咯咯哒~ 发表于 2020-12-28 22:23

wow!好东西收藏先
页: [1] 2 3 4 5
查看完整版本: 一种在32位Windows进程中运行64位代码的方法