|  | 
 
| 本帖最后由 jiangzhengwenjz 于 2016-11-24 12:20 编辑 
 限于火红版,这个其实是之前所做的事了,虽然老外做过了但自己试一下也不坏。
 
 制作之前先要明确目的:
 1. 不显示数量(伪HM)
 2. 使用后不删除
 3. 【易忽略】不能携带
 
 1. 数量较难断,于是对HM图标的数据下断(通过内存数据得到位置)或是直接搜索0xe99118的指针得到读取HM图标的源码位置是x1335b0
 
 反追踪一次得到调用位置是x131efa,注意到在x131eac获取了技能机的数量,后面的程序进行转码和写入内存,因此我们只需跳过这段代码。
 
 也就是HM:不读取数量,读取图标。TM:不读取数量,也不读取图标。这里给出这个程序的源码:
 那么,如何改造也就很清楚了,我的方法是将x131ea6的指令改去b 0x8131efe,也就是写入2A E0。测试也通过(不过老外的似乎有些不同)复制代码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
 2. 这个非常直观,但暗桩较多。首先获得删除道具程序的位置,从脚本命令中,道具中都可(好吧其实这个程序哪都有),随后下断
 
 会发现有3个程序都调用了这个,分别是:玩家看完动画后删除,玩家按b退出动画后删除,给少于4个技能的精灵学习后删除【这个略坑,看了老外的才发现
 
 将这些位置调用程序的代码都去掉即可,即将x124f78,x125c80,x124eac的数据都改去00 00 00 00。
 
 3. 这个很容易漏掉,不改的话会发生携带了之后背包里还有这个道具的情况。
 
 首先注意到HM是不能进行携带的,故可猜测某处会判断HM和TM。但这个程序的地址我们真的不知道吗?在之前x131e9a的源码处我们知道是判定是否为HM,故而这个程序一定会断
 
 直接下断,会断2次,一次是小框中的读取图标判定,另一次则是我们所需要的位置了(按下give时)。
 只需让它都以为是HM即可,这里的代码改去00 00 17 E0,强行跳转即可,那么整个的修改就完成了。复制代码ROM:081326B8                 CMP     R0, #0
ROM:081326BA                 BNE     loc_81326EC
 当然,还需要让技能机器不能被卖掉,这个老外没有给出方法。
 我简单研究了一下,改动应该是这个方法理论上是很优的,但并没有经过测试。
 对于购买时的数量显示,若要直接阉割:若要保留则要对源码稍事修改了:
 其中XX XX XX XX是下面源码的指针(thumb模式+1)复制代码0x9BCB0 - 00 49 08 47 XX XX XX XX
那么最后来汇总一下需要修改的代码:复制代码.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
C语言编的懒人程序:复制代码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
  inf.zip
(25.96 KB, 下载次数: 1055) 
 2016.11.24更新:
 | 
 |