一:背景
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
订阅专栏 解锁全文
1663

被折叠的 条评论
为什么被折叠?



