精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 计算机安全>>◆破解技巧◆>>教你如何修改gba rom里的程序

主题:教你如何修改gba rom里的程序
发信人: williamlong(蓝色月光)
整理人: williamlong(2004-06-15 19:06:36), 站内信件

所用工具:No$gba1.4C (调试功能异常的强大的GBA模拟器)  UltraEdit8.10 
文章说明:教学类 
作者:大老 
所属组织:=BCG= =[DCG]= 
本人作品:文件加密狗检测工具 2.0 文件加密狗检测工具 2.1 
本人邮箱:[email protected] [email protected] 
本人主页:http://dalao2002.yeah.net 
本人论坛:http://61.177.65.168/dalaobbs/cgi-bin/leoboard.cgi 
Oicq:79234668 
此文献给所有爱好解密和爱好模拟器的朋友们! 
如果大家觉得对自己有所帮助请回复支持一下谢谢! 
转载请保留完整谢谢!!! 

GBA是日本任天堂公司出的一款32位的手掌游戏机!本人购买了一款!呵呵没事的时候消遣一下!最新的型号是GBASP带背光功能! 
简介 
GBA是一款注重便携性和2D图形性能的游戏机,它提供了类似Window的旋转、缩放、α混合、浅入浅出等特性。它有两种位图模式:双倍缓冲模式用于实时重写全屏幕影响,单缓冲模式用于显示静止图像。显示屏是2.9英尺宽的反射TFT彩色液晶。声音方面,除了兼容于GBC之外,GBA有一个PCM立体声发生器,可以通过CPU重叠模拟播放多个轨道。控制器增加了L和R按键。虽然GBA使用的32位RISC CPU在性能和数据处理能力方面都远超过GBC,但是耗电量却少很多,可以连续游戏20小时,因为它混合使用了多种RAM在一个特制的芯片里。GBA的软件可以用C语言编写。总体性能相当于或超过SFC。 
进入正题 
GO 
(1)<<例子说明>> 
---------------------------------------------------------------------------------------- 
今天的例子是GBA游戏就是大家比较熟悉<<魂斗乐>>GBA版 
这个游戏只要玩过FC的都知道当年非常有名射击横版过关游戏!第一代是科拉米公司1988年出的!当年 
3人通关呵呵!印象深刻呀!GBA版的是SFC(超任)的移植版!画面还可以就是太难了!所以嘿嘿咱们把它 
CRACK一下让他变得容易点! 
------------------------------------------------------------------------------------------ 
(2)<<修改目的>> 
------------------------------------------------------------------------------------------ 
今天的目的是让他的人数不减或每次死后增加人数而不是减少人数! 
第一步用工具找出存放生命地址,这个用VisualBoyAdvance1.6即可!用它的里面的金手指功能即可! 
最后找到地址是03002C60:0003 这个是他存放人数的地址,0003代表是3个生命!找到这个后就好办了! 
现在出场的是No$gba1.4C破解版这东西现在的注册费是$5000!!!昂贵!最新版本是1.7由于1.4版本的破解!作者不放出新版的演示版了! 
---------------------------------------------------------------------------------------- 
(3)<<分析>> 
=========================================================================================== 
先说明一下GBA核心ARM CPU 
指令集 

在本文档的汇编语法中,用 # 前缀表示立即值,用 & 表示十六进制值,用 % 表示二进制值,用 {花括号} 表示指令中可选的设置字段或位。下面表格中粗体的指令是核心 ARM 指令,其他的是值得包含的位和片段、移位选项和汇编器助记码(mnemonic)... 还列出了协处理器指令。但是用于 RISC OS 机器的 ARM 处理器不支持协处理器,只在一个可访问的芯片中提供了实际上的协处理器功能。其中包括设置 ARM、cache、MMU 的设施,等... 

  指令  意义  最早的 CPU / 注释  
ADC  带进位的加法  -  
ADD  加法  -  
AND  逻辑与  -  
ASL  算术左移  这是一个选项,不是指令  
ASR  算术右移  这是一个选项,不是指令  
B  分支  -  
BIC  位清除  -  
BL  带连接的分支  -  
BX  分支到 Thumb 代码  StrongARM SA1110 ?  
CDP  协处理器数据操作  -  
CMN  比较取负的值  -  
CMP  比较值  -  
EOR  异或两个值  -  
LDC  装载内存到协处理器  -  
LDM  装载多个寄存器  -  
LDR  装载寄存器  -  
LDRB  装载字节到寄存器  -  
LDRH  装载半字到寄存器  StrongARM  
LDRSB  装载有符号字节到寄存器  StrongARM  
LDRSH  装载有符号半字到寄存器  StrongARM    
LSL  逻辑左移  这是一个选项,不是指令  
LSR  逻辑右移  这是一个选项,不是指令  
MCR  协处理器寄存器传送  -  
MLA  带累加的乘法  -  
MOV  传送值/寄存器到一个寄存器  -  
MRC  协处理器寄存器传送  -  
MRS  传送状态标志到一个寄存器  ARM 6  
MSR  传送一个寄存器的内容到状态标志  ARM 6  
MUL  乘法  -  
MVN  传送取负的(值)  -  
ORR  逻辑或  -  
ROR  循环右移  这是一个选项,不是指令    
RRX  带扩展的循环右移  这是一个选项,不是指令    
RSB  反向减法  -    
RSC  带借位的反向减法  -    
SBC  带借位的减法  -    
SMLAL  带累加的有符号长(64 位)乘法  StrongARM    
SMULL  有符号长(64 位)乘法  StrongARM    
STC  协处理器数据传送  -    
STM  存储多个寄存器  -    
STR  存储一个寄存器  -    
STRB  存储一个字节(从一个寄存器)  -    
STRH  存储一个半字(从一个寄存器)  StrongARM    
STRSB  存储一个有符号字节(从一个寄存器)  StrongARM    
STRSH  存储一个有符号半字(从一个寄存器)  StrongARM    
SUB  减法  -    
SWI  导致一个软件中断  -    
SWP  交换寄存器与内存  ARM 3    
TEQ  测试等价(概念上的 EOR)  -    
TST  测试并屏蔽(概念上的 AND)  -    
UMLAL  带累加的无符号长(64 位)乘法  StrongARM    
UMULL  无符号长(64 位)乘法  StrongARM 
================================================================================================================ 
用No$gba1.4C载入Contra_Advance_The_Alien_Wars_EX_USA_GBA-MODE7.ZIP载入后设置监视断点! 
先说明一下如何用这个工具进行内存断点的设置! 
下面是这个东西开发手册上说的! 
This break-family allows to capture writes to specific memory addresses, or memory areas. Membreaks are defined by pressing Ctrl+B, and then entering conditions such like: 
<按CTRL+B进行内存地址或内存区域的条件断点设置> 
[02000100]! ;stops on any byte/halfword/word write to [2000100h] 

[02000100]? ;stops only when writing new/changed data 

[06000000..06003fff]! ;stops on any write to first 16Kbytes of VRAM 

[02000000..02003fff]? ;stops only when writing new/changed data 
Normal Breaks (F2-key) 
<按f2设置或清除断点最多可以设置50个断点> 
Normal breakpoints are set (or removed) by moving the code-window cursor onto the desired opcode, and then pushing the F2-key. Up to 50 breakpoints can be defined. 

Run-to-Cursor (F4-key) 
<按f4程序执行到当前鼠标处停止> 
Hitting F4-key directly starts emulation, and stops when reaching the code window cursor. The break address is not memorized, ie. it is used only once. 


开始跟踪分析 
按CTRL+B 键入[03002C60]!点OK后点击右边的游戏窗口进行游戏!当你死掉一条人命后! 
游戏中断来到下面的代码 
08014EC2 2878    cmp    r0,78h 
08014EC4 D95D    bls    8014F82h 
08014EC6 8898    ldrh    r0,[r3,4h] 
08014EC8 2800    cmp    r0,0h =========>比较R0寄存器是不是=0 如果是游戏终止也就是GAME OVER 
08014ECA D05C    beq    8014F86h =====>R0=0就跳转到GAME OVER 
08014ECC 3801    sub    r0,1h  ======>不为0则R0=R0-1 剩下的不用我多说了吧! 
08014ECE 8098    strh    r0,[r3,4h] 
08014ED0>8B18    ldrh    r0,[r3,18h] 
08014ED2 2800    cmp    r0,0h 
08014ED4 D001    beq    8014EDAh 
根据上面的分析咱们只要吧8014ECC这句SUB R0,1修改就行了!我的改法是让他加+1而不是减-1!再这句上点鼠标的右键! 
选择第6项CHANGE Instruction添入add r0,01确定后记下机器码3001然后用UltraEdit8.10打开rom文件!查找5CD00138 
找到后改成5CD00130存盘即可!再打开试试!嘿嘿是不是死了加生命而不是减生命了吧!其实我写这篇文章只是个抛砖引玉 
告诉大家怎么修改ROM!希望能对想修改游戏而又找不到门的朋友有所帮助! 
--------------------------------------------------------------------------------------------------------------------- 
大老 
3:44 09/19/2003 
凌晨 


----
青青子衿,悠悠我心 

网易社区精华区下载程序


              

[关闭][返回]