【致初学修改器的你】如何优雅的杀敌以做到英雄无敌?记一次血战上海滩修改器制作过程

查看 70|回复 10
作者:xiajin   
第一次写逆向调试的文章,不足之处,敬请关照!  能力有限,大佬勿喷!
新人学做修改器拿什么游戏练手?可能大部分人会想到《植物大战僵尸》和《血战上海滩》,是的,的确是这样,这两款游戏不仅家喻户晓,而且这两款游戏都属于无壳、无混淆、无加密的“三无”游戏,非常适合新人练习。不过目前网上的关于植物大战僵尸的通过逆向调试来做修改器的文章有很多,所以今天我们来讲讲血战上海滩。另外植物大战僵尸的游戏属性远远多于血战上海滩的游戏属性,且属性间的关系机制较为复杂,对新人来说并不友好,所以我个人推荐新人学逆向修改先从血战上海滩开始练习。
如果新人学做修改器,并且程序没有加密、壳等妨碍新人学习的特殊手段的话使用CheatEngine就可以满足需求,本文就以CE为例。  
知识储备
你必须知道的术语
以下知识基于拓展阅读的参考资料讲述的内容并用自己的话来整理的。
(1)断点(Breakpoint)
在指定位置暂停程序执行,允许开发者检查程序状态。断点分为多种类型,例如:普通断点、条件断点、硬件断点、内存断点等。
(2)步进(Step Over)
逐行执行代码,但不会进入被调用的函数内部。例如,执行printf() 时,直接完成整个函数调用而不进入其内部实现。
(3)步入(Step Into)
当执行到函数调用时,进入该函数内部逐行调试,适用于需要分析子函数逻辑的场景。
(4)栈(Stack)
栈是一种后进先出(LIFO)的线性数据结构,其所有操作仅允许在栈顶(Top)进行,而栈底(Bottom)固定不动。栈的物理模型可类比生活中的叠盘子:每次取放只能从顶部操作,最后放入的盘子会最先被取出。
(5)寄存器(Register)
寄存器是计算机中央处理器(CPU)内部的核心组件,用于高速暂存指令、数据和地址。寄存器类就好比商场地下超市的存包柜,存取方便(通过操作指令或地址),但容量有限。其特点可概括为临时性、高速性、容量有限性。
(6)游戏基址(Game Base Address)
程序加载到内存时的起始地址,是定位游戏数据的参考原点。在现代操作系统中,由于ASLR(地址空间布局随机化)的存在,基址往往动态变化。静态基址(如Unity引擎的"GameAssembly.dll")可用于跨版本寻址。例如修改角色血量时,需要通过"基址+固定偏移"的组合来定位内存单元。
(7)偏移(Offset)
相对于基址的位移量,用于精确导航到目标数据。根据内存层级结构,偏移可呈现多级扩展形态。例如0x114514+0x666+0x888,其中每个+号后的数值均代表不同层级的偏移值,就如同玩藏宝图寻宝游戏,根据藏宝图上特定的地点向东走10步再向南走50步…逐步确定宝藏的位置。
(8)指针(Pointer)
存储内存地址的特殊变量,本质是"地址的地址"。如果说内存是一幢写字楼,那么指针变量存储的是某个房间的门牌号。
你必须知道的Win32寄存器
通用寄存器
​​EAX (累加器)​​
主要用途:乘除法运算、I/O操作、函数返回值存储(Win32 API的返回值默认存放在EAX)
可分割为:AX(16位)、AH/AL(8位高位/低位)
特殊功能:在字符串操作指令(如LODS)中自动使用
​​EBX (基址寄存器)​​
主要用途:内存数据指针,常用于基址寻址
可分割为:BX(16位)、BH/BL(8位高位/低位)
​​ECX (计数器)​​
主要用途:循环计数器(LOOP指令)、字符串操作中的重复次数
可分割为:CX(16位)、CH/CL(8位高位/低位)
特殊示例:REP MOVSB指令中控制复制次数
​​EDX (数据寄存器)​​
主要用途:乘除法辅助运算、I/O端口地址存储
可分割为:DX(16位)、DH/DL(8位高位/低位)
​​ESI(源变址寄存器)​​
主要用途:字符串操作中的源指针,内存数据指针
特殊指令:与LODS/MOVSB等指令配合使用
​​EDI (目标变址寄存器)​​
主要用途:字符串操作中的目标指针
特殊指令:与STOS/MOVSB等指令配合使用
指针寄存器
​​ESP (堆栈指针)​​
核心功能:始终指向栈顶地址,不可用于算术运算
相关指令:PUSH/POP/CALL/RET直接操作ESP
​​EBP (基址指针)​​
核心功能:访问栈帧中的参数和局部变量
特殊用途:通过EBP+偏移量访问函数参数(如EBP+8为第一个参数)
控制寄存器
​​EIP (指令指针)​​
核心功能:存储下一条待执行指令的地址
不可直接修改,仅通过JMP/CALL/RET等指令间接改变
​​EFLAGS (标志寄存器)​​
关键标志位:
​​CF​​(进位标志):无符号运算溢出时置1
​​ZF​​(零标志):结果为0时置1
​​SF​​(符号标志):结果为负数时置1
​​OF​​(溢出标志):有符号运算溢出时置1
​​DF​​(方向标志):控制字符串操作方向(STD/CLD修改)
你必须知道的汇编命令
数据传输类
MOV
将数据从源操作数复制到目标操作数(寄存器/内存)。
示例:
mov ecx, 0x114514
功能:将数值0x114514存入ECX寄存器。
PUSH与POP
将寄存器/内存中的值压入/弹出栈顶。
示例:
push ebx:将EBX的值压入栈顶。
pop eax:将栈顶的值弹出到EAX。
LEA
计算源操作数的有效地址(偏移量),并将结果存入目标寄存器。
示例:
lea eax, [ebx + ecx + 0x666]
功能:将EBX + ECX + 0x666的地址计算结果存入EAX。
算术运算类
ADD
32位加法,如ADD EAX, ECX或ADC EDX, 0(用于多精度运算)。
SUB
32位减法,例如SUB EAX, EDX,支持32位操作数。
MUL
无符号乘法,32位模式下结果存在EDX:EAX中,如MUL ECX。
DIV
无符号/有符号除法,32位被除数由EDX:EAX提供,商存入EAX,余数存入EDX。
INC/DEC
32位寄存器或内存操作数自增/自减,如INC DWORD PTR [ESI]。
控制转移类
JMP
无条件跳转到目标地址。
CALL
调用子程序,自动将返回地址压入栈。
空操作
NOP
空操作指令,用于程序优化、时序控制等场景。
你必须知道的CheatEngine用法
1. 附加调试进程
启动目标游戏和CheatEngine,点击“文件”→“打开进程”,选择目标游戏进程进行调试。
2. 搜索动态地址
首次输入当前数值(如金钱100),点击“首次扫描”。
回到游戏继续打怪赚钱,当金钱数值改变后,输入新数值并点击“再次扫描”。
重复直至仅剩一个地址。
3. 修改/锁定地址值
●双击地址将其加入修改列表,输入新值后确认。
●勾选“激活”列(显示“X”)以锁定数值。
4. 下断点
●内存断点:右击内存数据区域,选择“数据断点”→设置触发条件(写入/访问)。
●硬件断点:在汇编代码窗口选中目标行,按F5键设置断点。
你必须知道的《血战上海滩》作弊代码和程序附加命令
按下键盘左上角“~” 键(ESC下方),屏幕左上角将出现>命令输入符输入完整指令。注意保持全英文字符输入法,输入作弊码后必须按下回车键 激活生效反馈。
作弊代码
[table]
[tr]
[td]作弊命令[/td]
[td]功能[/td]
[td]备注[/td]
[/tr]
[tr]
[td]god_on

寄存器, 地址

klarkzby   

学习一下,以前用fpe修改器、金山游侠改过。
colaraa   

这是修炼江湖大侠的秘籍吗?
之前只会用ce做数值修改,面对那种范围或者比较模糊的百分比,没有出数值就歇菜了。
希望能够有所突破。
cqfyaaa   

学习了,感谢分享
uuwatch   

写的很好
xuanqi521   

入门的知识还得再学习一下,不然跟看天书一样
IcePlume   

这么说,我玩游戏该无敌了吧
niugiaogiao   

新人菜鸟正需要这个!
秘制蛋炒饭   

赞 学习了👍
uuwatch   

下载来玩玩
您需要登录后才可以回帖 登录 | 立即注册

返回顶部