吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3376|回复: 5
收起左侧

[其他转载] 【C#】一个方便计算多级指针的辅助函数

[复制链接]
Lensual 发表于 2017-7-27 10:59
本帖最后由 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);

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

gunxsword 发表于 2017-7-27 11:06
看起来不错,顶一下,习惯了一行一行写了!
KING9115 发表于 2017-7-27 11:10
heverst 发表于 2017-7-27 11:20
优优美 发表于 2018-11-12 13:17
刚开始学习C#,有些还看不懂,继续努力中
sunson 发表于 2018-12-11 12:30
mark一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-25 16:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表