文章总结: 本文是面向逆向新手的实战教程,以某端游人物血量为目标,演示从CE搜索内存地址、下内存访问断点定位读写指令,到用x32dbg逐层回溯寄存器来源,最终得到基址加偏移的指针公式的完整流程。文章详细记录了每一步操作与关键值,并给出验证方法,强调偏移可能随版本更新而变化,适合新手按步骤实操练习。
综合评分: 78
文章分类: 逆向分析,实战经验,二进制安全
逆向新手的第一课:某端游从 CE 搜索->断点->血量基址
切尔曼提察
切尔曼提察
神农Sec
2026年9月15日 09:00
安徽
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
课程培训
扫码咨询
#
专注于SRC漏洞挖掘、红蓝对抗、渗透测试、代码审计JS逆向,CNVD和EDUSRC漏洞挖掘,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。加内部圈子,文末有彩蛋(课程培训限时优惠)。
#
文章作者:切尔曼提察
文章来源:https://xz.aliyun.com/news/92788
01
0x1 逆向新手的第一课:某端游从 CE 搜索->断点->血量基址
基础数据逆向(一):从 CE 搜索到血量基址
面向逆向新手的第一篇实战。目标:从一个游戏数据(人物血量)出发,用 CE 锁定它的内存地址,再用 x32dbg 沿汇编逐层回溯,最终得到「基址 + 偏移」的指针公式。
- 目标程序:《笑傲江湖》32 位客户端(xajh.exe)
- 目标数据:人物血量
- 使用工具:Cheat Engine(CE)、x32dbg(32 位程序用 x32dbg;x64dbg 是其 64 位版本,操作基本一致)
本文流程速览
- CE 搜索 → 锁定血量所在的内存地址
- 下内存访问断点 → 找到“读取血量”的汇编指令
- 逐层向上回溯寄存器来源 → 直到收敛到游戏基址
- 汇总指针公式
1. 工具与整体思路
1.1 两类工具,各司其职
-
Cheat Engine(CE):负责搜数值——把“血量”这个数值定位到某个具体的内存地址。
-
x32dbg:负责看代码——拿到地址后,用它来观察哪条指令在读/写这块内存,并逐层向上找基址。
CE 与调试器的各种具体操作(附加、搜索、单步、下断),在练习中不断熟悉即可,遇到不会的功能随时查。
1.2 整体思路:记住这条主线
数据地址 → 访问断点找到读写指令 → 看“对象地址”从哪来 → 一路向上 → 回到模块基址
这是所有“找基址”类逆向的通用套路。下面整篇文章都在反复执行这一条主线。
1.3 会用到的调试器操作速查
| 操作 | 作用 |
| — | — |
| 附加进程 | 让调试器接管目标进程 |
| Ctrl+G | 数据 / 代码窗口跳转到指定地址 |
| 内存访问断点 | 目标内存被读 / 写时中断 |
| Ctrl+F9 | 执行到返回(配合 F8 单步,可快速“回到上一层”) |
| F8 | 单步执行 |
| 条件断点 | 满足指定条件才中断(本文用它“识破”假来源) |
2. 用 CE 锁定血量地址
2.1 附加进程
先在游戏里确认当前血量:43348
打开 CE,附加到目标进程(xajh.exe)
进程列表里可能不止一个候选,选中你游戏对应的那个进程即可。
2.2 首轮扫描与二次筛选
以当前血量作为初值进行一次扫描,结果往往很多,这很正常。关键在于改变数值后二次筛选:
使用血量道具,让血量从 43348 变成 44278。
回到 CE,在已有结果上对“改变后的数值(44278)”再次扫描,此时就只剩两条结果了
提示:真实项目里通常要经过好几轮“改值 → 再扫”才能把结果筛干净,一轮扫不干净很正常,多点耐心。
2.3 如何辨认干扰数据
筛选中如果看到以 00 开头的数据,或者长得几乎一模一样的一大批地址,大概率不是我们要找的目标:
2.4 把候选地址加入列表
本例运气不错,只剩两条。把结果双击加入下方的地址列表,两条都可以试——这里我们用 45B1A58C 这条继续演示
1.5 切到调试器,确认数值
CE 负责“找到它”,接下来交给调试器来“看代码”。把进程交给 x32dbg(附加,或以调试方式打开游戏)。在数据窗口用 Ctrl+G 跳转到 0x45B1A58C:
直接看时显示的数值可能不对,把该位置的显示类型切换为无符号整型(Unsigned),就能正确读出当前血量:
3. 内存访问断点:找到“读血量”的代码
3.1 下断点
确认 0x45B1A58C 上保存的正是血量后,对它下一个内存访问断点(长度 4 字节):
断点就绪后,让游戏去读这块内存——例如再扣/加一次血、刷新血条——访问发生时立刻断下:
3.2 命中的指令
断下后停住的这条指令,就是“正在读取血量”的地方:
mov edi, dword ptr ds:[esi+0x1C] ; esi = 0x45B1A570
也就是说:血量 = esi + 0x1C 0x45B1A570 是血量所在的对象,血量字段偏移是 +0x1C——这是我们要记录的第一层。
3.3 记录完先收尾,再继续
记完这层信息后,立刻取消刚才的断点再继续运行,否则之后随便操作都会再次断下:
如果取消断点后游戏仍卡住不动,在上方线程窗口里右键“恢复所有线程”,再点运行即可。
4. 逐层回溯:把对象地址一路追到基址
4.1 回溯心法
现在的问题是:血量对象 0x45B1A570 是从哪来的?反复执行下面四步,直到追到模块基址:
- 在当前函数里向上找“谁给持有该值的寄存器(esi/ecx 等)赋了值”;
- 如果来源不在当前函数(例如往上遇到
int 3、或找不到赋值),就在函数头部下断,用Ctrl+F9+F8返回到上一层继续找; - 每一步先确认寄存器里的数据正确,再继续向上(怎么确认见 3.2);
- 一直追到 EBX/ECX 等寄存器的注释显示它来自
xajh.exe模块基址为止。
4.2 第一跳:从“血量对象”到它的来源
在命中指令所在的函数里向上找“给 esi 赋值”的位置:
发现 esi 来自 ecx:
关键技巧——如何确认自己找对了?新手最常担心的是“我追的这个对象到底对不对”。方法很简单:在怀疑的位置下个断点,断下后把调试器里寄存器/内存显示的值和游戏里的真实数据对比。一致就继续,不一致就说明方向错了。
本例寄存器位置对应的数据确实正确。但继续往上翻,发现再往上是 int 3(没有有效代码),那就需要返回到上一层去找。做法:在当前函数头部下断点,用 Ctrl+F9 执行到返回,再 F8 单步,回到上一层函数:
返回上一层后,找到了真正给这个对象赋值的那一行:
lea ecx, dword ptr ds:[esi+0x2A0] ; esi = 0x45B1A2D0 → ecx = 0x45B1A570
也就是说:血量对象(0x45B1A570) = 上层对象(0x45B1A2D0) + 0x2A0。偏移 +0x2A0 记下。
继续向上寻找 0x45B1A2D0 的来源。又是老一套:esi 来自上一层的 ecx → 头部下断返回上一层 → 返回后发现 ecx 又来自 esi → esi 又来自 ecx,再次返回上一层去追:
4.3 一大段循环:小心“看起来的来源”
返回上一层后,看到上面有一大串循环。这里是新手最容易犯错的地方。
很多人抬头看到不远处的一句:
mov ecx, dword ptr ss:[esp+28]
便理所当然地认为 ecx 来自 [esp+28],顺着去追——但其实是错的。
识破方法:条件断点。在怀疑的位置下条件断点,让它在“你判断的某个值”时才断下。本例中断点确实停下来了,但停下来的数据跟你的断点条件完全对不上——说明它根本不在这条路径上。至于“为什么值不满足却还是断了”,涉及 x32dbg 断点触发原理,这里先不展开。
实际上 ecx 并不来自这部分,而是来自更上面的分支。利用反汇编窗口的跳转提示(从哪条跳转过来的),跳到真正的来源处:
跳过去之后发现:ecx 还是来自 esi,并且此时数据确实正确:
继续向上,esi 又来自 ecx,再次下断返回上一层:
4.4 固定偏移读取:[对象 + 0x10]
回到上一层后,发现 ecx 来自 ebx,而 ebx 又来自一次“带基址 + 索引”的读取,于是对读取位置下断观察:
断下后可以看到:当 ebx = 0x45B1A2D0 时,eax = 0x43103C78。
进一步确认:这个读取其实是按固定偏移进行的——被当成“索引”的量实际恒为 0x10,也就是说这里等价于读 [eax + 0x10],取出的正是我们要找的对象。那么 eax 从哪来?来自上一行:
mov eax, dword ptr ds:[esi+0xC8] ; esi = 0x4555CC00
偏移 +0xC8 记下:
4.5 寄存器接力:不要慌,一步步来
下面是一长串“寄存器接力”:返回一层后它来自 ecx,再上一层 ecx 又来自 esi……如此反复。遇到这种情况不用紧张,就是不断执行“下断 → 返回上一层 → 确认来源 → 再返回”,同时每层都确认下数据对不对:
往上翻过一段距离,发现又来自 ecx,继续返回上一层去追:
4.6 带缩放寻址:[esi + eax*4 + 320],eax = 1
继续返回后,找到这样一行:
mov ecx, dword ptr ds:[esi+eax*4+320]
在上面下断,观察到 eax = 1,于是这行等价于读 [esi + 1*4 + 320],即固定偏移 0x144(4 + 320):
mov ecx, dword ptr ds:[esi+1*4+320]
4.7 再回上一层:[ebp+8] 与 call 的第一个参数
接着去找上面这行里的 esi:
返回上一层后,发现 ecx 来自 [ebp+8]:
这里有个知识点:**[ebp+8] 往往就是 call 的第一个参数。所以先判断 ebp 是不是一个栈地址**——如果 ebp 是栈地址,说明这里只是取参数,没必要在这层继续追,直接返回上一层看“调用者把这个参数传成了什么”即可。本例检查后确认 ebp 不是栈地址(是堆上的对象指针),那就继续跟着追:
mov ecx, dword ptr ss:[ebp+8]
接着发现 ebp 来自 ecx,继续返回上一层去追 ecx:
4.8 追到基址:[ebx + 0x24]
返回上一层后,找到给 ecx/ebx 赋值的一行:
mov ecx, dword ptr ds:[ebx+0x24]
此时 EBX 寄存器的注释已经显示它来自游戏基址(xajh.exe / “笑傲江湖”模块),偏移为 xajh.exe + 0x11282D8。到这里就不用再往上追了——最外层就是模块基址:
偏移 +0x24 与基址偏移 0x11282D8 记下,回溯完成。
5. 结果汇总
5.1 指针公式
把整条链从外到内串起来(外是基址,越靠内越接近血量):
[[[[[[xajh.exe+0x11282D8]+0x24]+0x8]+4+320]+0xC8]+0x10]+0x2A0+0x1C
其中 +4+320 来自 mov ecx,[esi+eax*4+320](当次 eax=1,即固定读 esi+0x144)。写法保留“缩放 × 4 + 位移 320”的原样。
按“逐层解引用”展开更直观:
P0 = *(xajh.exe + 0x11282D8) ; EBX,来自模块基址(xajh.exe+0x11282D8)
P1 = *(P0 + 0x24) ; mov ecx,[ebx+0x24]
P2 = *(P1 + 0x8) ; mov ecx,[ebp+8](call 第一个参数,非栈地址)
P3 = *(P2 + 0x144) ; mov ecx,[esi+eax*4+320],eax=1 → 固定 0x144
P4 = *(P3 + 0xC8) ; mov eax,[esi+0xC8],esi=0x4555CC00 → 0x43103C78
P5 = *(P4 + 0x10) ; 固定偏移 [eax+0x10] → 0x45B1A2D0
esi = P5 + 0x2A0 ; lea ecx,[esi+0x2A0] → 0x45B1A570
血量 = *(esi + 0x1C) ; mov edi,[esi+0x1C] → 最终血量
5.2 回溯过程中的关键值(校验用)
| 位置 | 关键寄存器 / 值 | 说明 |
| — | — | — |
| mov edi,[esi+0x1C] | esi = 0x45B1A570 | 血量所在对象 |
| lea ecx,[esi+0x2A0] | esi = 0x45B1A2D0 → 0x45B1A570 | 偏移 +0x2A0 |
| 固定偏移读取 [eax+0x10] | → 0x45B1A2D0 | 偏移 +0x10 |
| mov eax,[esi+0xC8] | esi = 0x4555CC00 → eax = 0x43103C78 | 偏移 +0xC8 |
| mov ecx,[esi+eax*4+320] | eax = 1 | 固定 +0x144 |
| mov ecx,[ebp+8] | — | 偏移 +0x8(call 参数) |
| mov ecx,[ebx+0x24] | ebx 注释 = 游戏基址 | 偏移 +0x24;基址 xajh.exe+0x11282D8 |
最内几层可用文中记录的真实值自行验算一遍,例如 0x45B1A2D0 + 0x2A0 = 0x45B1A570,再读 +0x1C 处即为血量。
5.3 验证公式
把上面的公式填进 CE(手动“添加地址”或指针扫描),读出的数值应当与游戏里当前血量完全一致。一致即代表整条链路与公式没有问题。
注意:偏移基于本文当次的游戏版本实测。游戏版本更新 / 区服不同后偏移可能变化,届时应重新走一遍本文流程。
5.4 小结:本文的“通用配方”
- CE 定位数值 → 得到具体内存地址;
- 下内存访问断点 → 找到读写该数据的指令,记下对象基址与字段偏移;
- 在对象地址的“来源”处逐层向上回溯,每层都确认数据正确;
- 遇到 int 3 / 找不到赋值 → 函数头下断 + Ctrl+F9/F8 返回上一层;
- 一直追到寄存器注释显示为模块基址为止,写出指针公式;
- 用 CE 验证公式能直接读出血量。
这一路最容易翻车的几个坑:
- 筛选结果里以 00 开头、或成片相似的数据——多为干扰;
- 循环代码里看似“理所当然”的来源(如 [esp+28])——用条件断点验证;
- 遇到 int 3 不会返回上一层——用函数头下断 + Ctrl+F9/F8;
- 忘删断点导致游戏一操作就断——记录完立刻取消断点、恢复线程再运行;
- 返层时没核对寄存器值就继续——每层先确认数据正确再往上追。
这个数据本身虽然简单,但把整条链路完整走一遍,对数据查找能力、汇编阅读能力、调试器使用的提升都是实打实的。
02
0x2 培训课程介绍
26
SRC漏洞挖掘培训课程
1.课程价格目前是575(后面也会随着人数越多,涨价)🌟师傅们还可以上车补票,冲冲冲!
2.报名成功送知识星球一个,拉内部小圈子交流群+SRC直播通知群!✨
3.一周2节课程,直播+录播形式,课程内容大家可以看课表,目前是第一期,一次报名永久无限听课!❤️
4.目前是第一期课程,后面比如说开了二、三期,都是不用在花钱的!
5.上课结束后,会把视频录播+课件笔记一起打包发直播群!
6.哔哩哔哩SRC课程公开课,链接🔗直达:
https://space.bilibili.com/642258933
SRC课程详情🔎:学了一堆理论,还是挖不到漏洞?你缺的是实战!
内部小圈子知识星球详情🔎:50 元封顶!渗透攻防 + SRC 漏洞星球限时开放!
欢迎关注公众号:神农Sec,报名咨询添加VX:routing_love
开课快五个月时间,课程目前已经累计加入了1000+个学员了,课程培训招生任火热持续中,师傅们对于我们课程感兴趣的,想要学习技术,找工作的可以咨询我报名。
课程培训记录📝,每次上车在1-3小时之间,上课包括课程内部群大家交流氛围很好!
课程上课笔记课件📒都会打包给师傅们,笔记都非常详细,很多几k价格的培训机构哪怕是课件笔记都没有的,我这里都是下课第一时间把录播+笔记打包发给大家!
平常也都会给学员进行一些项目发布,包括后面的工作、护网内推等,经常上麦交流,大家互相学习,简历优化等。
SRC漏洞挖掘课程培训已经两个星期了,期间也是创建了“回本小群”,希望学员回本越来越多,创建这个群主要是鼓励学员学习进步,以及不定时发小项目!
最后也是希望大家都可以赚钱,找到好工作🎉
培训时间不长,感谢🙏师傅们的喜报,很开心看到师傅们给我分享自己的成果,希望师傅们越来越强!
平常也会分享项目,下面是一些学员项目成果,群里报课的学员都是不抽成的,主要是帮助学员进行回本,让大家都可以进步!
上课结束后,会把视频录播+课件笔记一起打包发直播群
「神农安全」知识星球目前已经累计2500+网络安全爱好者的加入!
后面也是小圈子做大起来了,师傅们也都喜欢看我文章,想着给大家教下src漏洞挖掘思路,所以自己花了很长时间做了✨课件和课表,都是纯自己手搓的,大家也可以看下课表的内容。
03
0x3 课程特色
课程主打真实,一线SRC漏洞挖掘师傅是如何学习和挖掘SRC漏洞的,让你真正了解SRC漏洞挖掘,助力在岗人员和大学生的能力提升,掌握新的技能树,为下一次跳槽涨薪做好准备。本课程内容覆盖企业SRC、众测项目挖掘、护网HVV红蓝攻防技巧、CVE、CNVD、EDUSRC等平台通杀案例技巧挖掘方法。
本课程适合人群(光看不挖啥也不会)
1、有计算机经验,想从0转行入行的大学生或自学者2、想从CTF比赛/Web或SRC进阶到项目实战的选手3、想参与项目/找工作/提高收入的转型者4、想通过挖SRC赏金做副业的师傅们5、挖SRC漏洞遇到瓶颈的师傅们6、想学习AI安全自动化渗透测试漏洞挖掘的师傅
课程价格:575 元
报课成功的师傅们直接免费送内部小圈:一个知识星球+内部小圈子交流群
1、课程价格真心实惠,绝不割韭菜2、四五百的课程价格让你体会大几千的培训课程内容3、带着大家从0到1,本人上课坚持手搓课件(实战案例+知识体系)4、拒绝使用PPT演讲模式(无实操,很枯燥)
直播培训教学方式
课程一周1-2节课,课程特色涵盖直播多人上麦活跃回答,直播过程中有问题随时解决或私信我。拉群:一个知识星球内部小圈子交流群+课程培训直播通知群。有项目/工作/护网第一时间内推报课的师傅,一对一简历优化,助力在岗人员和大学生的能力提升。
一次报名每期均可永久学习,并且赠送内部「神农安全」知识星球,一对一永久解答、无保留教学!
欢迎关注公众号:神农Sec,报名咨询添加VX:routing_love
课程均为线上交付,报名成功后不支持退款
内部小圈子(知识星球+内部小圈子交流群+知识库)
对内部小圈子感兴趣的师傅们也可以看下下面的这个跳转链接,里面有对小圈子的详细介绍,报名课程成功的师傅们直接免费送一个(直接点击下面直接可以跳转)。
讲师介绍
id:一个想当文人的黑客
欢迎关注公众号:神农Sec,报名咨询添加VX:routing_love
04
0x4 第一期挖洞培训课表内容
内部圈子介绍(报课赠送)
圈子专注于更新src/红蓝攻防相关:
1、维护更新src专项漏洞知识库,包含原理、挖掘技巧、实战案例2、知识星球专属微信“小圈子交流群”3、微信小群一起挖洞4、内部团队专属EDUSRC证书站漏洞报告5、分享src优质视频课程(企业src/EDUSRC/红蓝队攻防)6、分享src挖掘技巧tips7、不定期有众测、渗透测试项目(一起挣钱)8、不定期有工作招聘内推(工作/护网内推)9、送全国职业技能大赛环境+WP解析(比赛拿奖)10、十个专栏会持续更新~提前续费有优惠,好用不贵很实惠11、每日内部资料分享,内部圈子资料1000+12、联系圈主获取:内部漏洞知识库+圈子使用手册+内部圈子交流群13、VX:routing_love,技术交流+疑问解决
内部圈子专栏介绍
知识星球内部共享资料截屏详情如下
(只要没有特殊情况,每天都保持更新)
05
0x5 优秀学员报喜
下面是最近两个月培训期间,很多优秀学员进行报喜,看到师傅们有收获,也是感到很开心的!拉回本小群,就是为了促进大家学习,在群里发学员成果,也是为了让大家学习优秀的师傅们。
加油,你我皆是黑马!
神农安全公开交流群
有需要的师傅们直接扫描文章二维码加入,然后要是后面群聊二维码扫描加入不了的师傅们,直接扫描文章开头的二维码加我(备注加群)
申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,
所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:神农Sec 切尔曼提察
切尔曼提察《逆向新手的第一课:某端游从 CE 搜索->断点->血量基址》