本帖最后由 Lensual 于 2017-7-27 11:29 编辑
遇到了一个6级指针,于是写了一个方便计算地址的函数。
需要用到WindowsAPI ReadProcessMemory
返回Int64类型的变量地址,不是指针地址。为了兼容64位地址,所以用Int64。
lpProcess,目标进程句柄,要求已经OpenProcess,并且可读权限。
BaseAddr,基址,要从这里计算偏移,一般是模块基址(ProcessModule.BaseAddress)
Offsets,多级指针偏移,集合成员是Int64类型的偏移量
[C#] 纯文本查看 复制代码 public static Int64 CalcAddr(IntPtr lpProcess, Int64 BaseAddr, List<Int64> Offsets){
if (Offsets.Count > 1)
{
byte[] buffer = new byte[8];
ReadProcessMemory(lpProcess, (IntPtr)(BaseAddr + Offsets[0]), Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0), 8, IntPtr.Zero);
Offsets.RemoveAt(0);
return CalcAddr(lpProcess, BitConverter.ToInt64(buffer,0), Offsets);
}
return BaseAddr + Offsets[0];
}
例子
[example.exe + 0xA] -> 0x1
[0x1 + 0xB] -> 0x2
[0x2 + 0xC] -> 0x3
变量地址是0x3
偏移分别是0xA,0xB,0xC
[C#] 纯文本查看 复制代码
List<Int64> offsets = new List<Int64>();
offsets.Add(0xA);
offsets.Add(0xB);
offsets.Add(0xC);
CalcAddr(example.exe进程句柄, example.exe的基址, offsets); |