|
本帖最后由 jiangzhengwenjz 于 2016-11-24 12:20 编辑
限于火红版,这个其实是之前所做的事了,虽然老外做过了但自己试一下也不坏。
制作之前先要明确目的:
1. 不显示数量(伪HM)
2. 使用后不删除
3. 【易忽略】不能携带
1. 数量较难断,于是对HM图标的数据下断(通过内存数据得到位置)或是直接搜索0xe99118的指针得到读取HM图标的源码位置是x1335b0
反追踪一次得到调用位置是x131efa,注意到在x131eac获取了技能机的数量,后面的程序进行转码和写入内存,因此我们只需跳过这段代码。
也就是HM:不读取数量,读取图标。TM:不读取数量,也不读取图标。这里给出这个程序的源码:- ROM:08131E68 PUSH {R4-R7,LR}
- ROM:08131E6A MOV R7, R9
- ROM:08131E6C MOV R6, R8
- ROM:08131E6E PUSH {R6,R7}
- ROM:08131E70 SUB SP, SP, #0x14
- ROM:08131E72 LSLS R0, R0, #0x18
- ROM:08131E74 LSRS R0, R0, #0x18
- ROM:08131E76 MOV R9, R0
- ROM:08131E78 MOV R7, R9
- ROM:08131E7A LSLS R2, R2, #0x18
- ROM:08131E7C LSRS R2, R2, #0x18
- ROM:08131E7E MOV R8, R2
- ROM:08131E80 MOV R4, R8
- ROM:08131E82 MOVS R0, #2
- ROM:08131E84 NEGS R0, R0
- ROM:08131E86 CMP R1, R0
- ROM:08131E88 BEQ loc_8131EFE
- ROM:08131E8A LSLS R0, R1, #0x10
- ROM:08131E8C LSRS R6, R0, #0x10
- ROM:08131E8E MOVS R0, #4
- ROM:08131E90 MOVS R1, R6
- ROM:08131E92 BL sub_809A798 @获得道具id
- ROM:08131E96 LSLS R0, R0, #0x10
- ROM:08131E98 LSRS R0, R0, #0x10
- ROM:08131E9A BL sub_809A990 @检测
- ROM:08131E9E LSLS R0, R0, #0x18
- ROM:08131EA0 LSRS R5, R0, #0x18
- ROM:08131EA2 CMP R5, #0
- ROM:08131EA4 BNE loc_8131EF4 @是HM,不读取数量而去读取图标
- ROM:08131EA6 LDR R4, =0x2021CD0
- ROM:08131EA8 MOVS R0, #4
- ROM:08131EAA MOVS R1, R6
- ROM:08131EAC BL sub_809A7B4 @获取数量
- ROM:08131EB0 MOVS R1, R0
- ROM:08131EB2 LSLS R1, R1, #0x10
- ROM:08131EB4 LSRS R1, R1, #0x10
- ROM:08131EB6 MOVS R0, R4
- ROM:08131EB8 MOVS R2, #1
- ROM:08131EBA MOVS R3, #3
- ROM:08131EBC BL sub_8008E78 @转换代码&写入内存
- ROM:08131EC0 LDR R4, =0x2021D18
- ROM:08131EC2 LDR R1, =0x84162B9
- ROM:08131EC4 MOVS R0, R4
- ROM:08131EC6 BL sub_8008FCC @加上乘号,写入另一个内存,如B900A6A1就是× 50
- ROM:08131ECA MOV R0, R8
- ROM:08131ECC STR R0, [SP]
- ROM:08131ECE STR R5, [SP,#4]
- ROM:08131ED0 STR R5, [SP,#8]
- ROM:08131ED2 MOVS R0, #0xFF
- ROM:08131ED4 STR R0, [SP,#0xC]
- ROM:08131ED6 MOVS R0, #1
- ROM:08131ED8 STR R0, [SP,#0x10]
- ROM:08131EDA MOV R0, R9
- ROM:08131EDC MOVS R1, #0
- ROM:08131EDE MOVS R2, R4
- ROM:08131EE0 MOVS R3, #0x7E
- ROM:08131EE2 BL sub_81332EC
- ROM:08131EE6 B loc_8131EFE @跳过读取图标的部分
- ROM:08131EE6 ; ---------------------------------------------------------------------------
- ROM:08131EE8 dword_8131EE8 DCD 0x2021CD0 ; DATA XREF: ROM:08131EA6r
- ROM:08131EEC dword_8131EEC DCD 0x2021D18 ; DATA XREF: ROM:08131EC0r
- ROM:08131EF0 dword_8131EF0 DCD 0x84162B9 ; DATA XREF: ROM:08131EC2r
- ROM:08131EF4 ; ---------------------------------------------------------------------------
- ROM:08131EF4
- ROM:08131EF4 loc_8131EF4 ; CODE XREF: ROM:08131EA4j
- ROM:08131EF4 MOVS R0, R7
- ROM:08131EF6 MOVS R1, #8
- ROM:08131EF8 MOVS R2, R4
- ROM:08131EFA BL sub_81335B0 @正式读取图标
- ROM:08131EFE
- ROM:08131EFE loc_8131EFE ; CODE XREF: ROM:08131E88j
- ROM:08131EFE ; ROM:08131EE6j
- ROM:08131EFE ADD SP, SP, #0x14
- ROM:08131F00 POP {R3,R4}
- ROM:08131F02 MOV R8, R3
- ROM:08131F04 MOV R9, R4
- ROM:08131F06 POP {R4-R7}
- ROM:08131F08 POP {R0}
- ROM:08131F0A BX R0
复制代码 那么,如何改造也就很清楚了,我的方法是将x131ea6的指令改去b 0x8131efe,也就是写入2A E0。测试也通过(不过老外的似乎有些不同)
2. 这个非常直观,但暗桩较多。首先获得删除道具程序的位置,从脚本命令中,道具中都可(好吧其实这个程序哪都有),随后下断
会发现有3个程序都调用了这个,分别是:玩家看完动画后删除,玩家按b退出动画后删除,给少于4个技能的精灵学习后删除【这个略坑,看了老外的才发现
将这些位置调用程序的代码都去掉即可,即将x124f78,x125c80,x124eac的数据都改去00 00 00 00。
3. 这个很容易漏掉,不改的话会发生携带了之后背包里还有这个道具的情况。
首先注意到HM是不能进行携带的,故可猜测某处会判断HM和TM。但这个程序的地址我们真的不知道吗?在之前x131e9a的源码处我们知道是判定是否为HM,故而这个程序一定会断
直接下断,会断2次,一次是小框中的读取图标判定,另一次则是我们所需要的位置了(按下give时)。- ROM:081326B8 CMP R0, #0
- ROM:081326BA BNE loc_81326EC
复制代码 只需让它都以为是HM即可,这里的代码改去00 00 17 E0,强行跳转即可,那么整个的修改就完成了。
当然,还需要让技能机器不能被卖掉,这个老外没有给出方法。
我简单研究了一下,改动应该是这个方法理论上是很优的,但并没有经过测试。
对于购买时的数量显示,若要直接阉割:若要保留则要对源码稍事修改了:- 0x9BCB0 - 00 49 08 47 XX XX XX XX
复制代码 其中XX XX XX XX是下面源码的指针(thumb模式+1)- .thumb
- .align 2
- add r5, r5, r0
- ldrh r0, [r5, #0xA]
- mov r1, #9
- lsl r1, r1, #5
- add r1, r1, #1
- cmp r0, r1
- blt notm
- add r1, #0x31
- cmp r0, r1
- bgt notm
- ldr r1, =0x809a7dd
- bl call_viar1
- cmp r0, #0
- bgt adjust
- b return
- notm:
- ldr r1, =0x809a7dd
- bl call_viar1
- return:
- ldr r1, =0x809bcb9
- call_viar1:
- bx r1
- adjust:
- mov r0, #1
- b return
复制代码 那么最后来汇总一下需要修改的代码:- 0x1326BA - 17 E0
- 0x124F78 - 00 00 00 00
- 0x125C80 - 00 00 00 00
- 0x124EAC - 00 00 00 00
- 0x131EA6 - 2A E0
- 0x132924 - 00 00 00 00
- 以下二选一:
- 阉割:
- 0x9BCC2 - 00 00 00 00
- 保留:
- 0x9BCB0 - 00 49 08 47 GH+1 EF CD AB
- 0xABCDEFGH - 2D 18 68 89 09 21 49 01 01 31 88 42 08 DB 31 31 88 42 05 DC 06 49 00 F0 07 F8 00 28 05 DC 02 E0 03 49 00 F0 01 F8 03 49 08 47 01 20 FB E7 00 00 DD A7 09 08 B9 BC 09 08
复制代码 C语言编的懒人程序:
inf.zip
(25.96 KB, 下载次数: 587)
2016.11.24更新: |
|