如何提取 x64 程序那些易失的方法参数

一:背景

1. 讲故事

最近经常遇到有朋友反馈,在 x64 环境下如何提取线程栈中的方法参数,熟悉 x64 调用协定的朋友应该知道,这种协定范围下,方法的前四个参数都是用寄存器传递的,比如rcx,rdx,r8d,r9d 四个寄存器,由于寄存器存值的临时性,它的值容易被后面的逻辑给征用了,那这种情况下还有没有办法提取出来呢? 说实话,全靠运气,为什么这么说呢? 如果这个在方法的栈初始化过程中有临时的保存在线程栈中的话,那恭喜你,可以成功给捞出来。

接下来通过一个小案例来深入的聊一下。

二:案例分析

1. 一个案例演示

为了方便讲述,这里我用 Marshal 在 ntheap 上分配堆块,然后提取 Marshal.FreeHGlobal 方法的用户句柄,参考代码如下:


        static void Main(string[] args)
        {
            //1. 分配 堆块
            IntPtr ptr = Marshal.AllocHGlobal(sizeof(int));
            Console.WriteLine("ptr= 0x{0:X2}", ptr);

            //2. 写入数据
            var num = int.MaxValue;
            Marshal.WriteInt32(pt
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值