|
本帖最后由 jiangzhengwenjz 于 2015-8-20 15:04 编辑
这个算是临时起意的修改,主要是看到破道大师用了几分钟就弄完,就也想尝试一下。技术含量的确不高,不过我还是打算发个帖子【勿喷
注:我用了knizz的database所以有些数据会以"名称"的形式给出
首先要找出切入点——在火红中不难知道是special 0xb6来检验有没有蛋、有几只精灵,那就当然直接反汇编查看。无疑我们只关心哪里是控制有没有蛋的,故检测种族、用循环来检查存放精灵个数的部分完全可以无视(虽然也很明确)
这是开头检查蛋的部分:- ROM:080464B4 PUSH {R4,LR}
- ROM:080464B6 LDR R4, =saveblock1_mapdata
- ROM:080464B8 LDR R0, [R4]
- ROM:080464BA MOVS R1, #sav1.daycare_data
- ROM:080464BE ADDS R0, R0, R1
- ROM:080464C0 BL sub_80463FC
复制代码- ROM:080463FC MOVS R1, #0x118
- ROM:08046400 ADDS R0, R0, R1
- ROM:08046402 LDRH R1, [R0]
- ROM:08046404 NEGS R0, R1
- ROM:08046406 ORRS R0, R1
- ROM:08046408 LSRS R0, R0, #0x1F
- ROM:0804640A BX LR
复制代码 结合这个special的返回值(脚本中可看)很明显[3005008h]+2f80h+118h的一个hword用来控制有没有蛋,那么可以根据这里来找"是否产生蛋"的判定程序
(好吧我承认这个办法不怎么好,所以具体怎么找到这个程序的,我还是略去了)
经过断点截取发现——位于0x462C4的程序用来随机判断是否得蛋(当然也没必要完全看懂,看懂下面这一小段就可以)- ROM:080462C4 PUSH {R4-R7,LR}
- ROM:080462C6 SUB SP, SP, #4
- ROM:080462C8 MOVS R6, R0
- ROM:080462CA MOVS R7, #0
- ROM:080462CC MOVS R5, #0
- ROM:080462CE
- ROM:080462CE loc_80462CE: @ CODE XREF: sub_80462C4+2Ej
- ROM:080462CE MOVS R0, #0x8C @ '
- ROM:080462D0 MOVS R4, R5
- ROM:080462D2 MULS R4, R0
- ROM:080462D4 ADDS R0, R6, R4
- ROM:080462D6 MOVS R1, #req_sanity_bit2
- ROM:080462D8 BL pokemon_getattr_encrypted
- ROM:080462DC CMP R0, #0
- ROM:080462DE BEQ loc_80462EE
- ROM:080462E0 MOVS R1, R6
- ROM:080462E2 ADDS R1, #0x88 @ '
- ROM:080462E4 ADDS R1, R1, R4
- ROM:080462E6 LDR R0, [R1]
- ROM:080462E8 ADDS R0, #1
- ROM:080462EA STR R0, [R1]
- ROM:080462EC ADDS R7, #1
- ROM:080462EE
- ROM:080462EE loc_80462EE: @ CODE XREF: sub_80462C4+1Aj
- ROM:080462EE ADDS R5, #1
- ROM:080462F0 CMP R5, #1
- ROM:080462F2 BLS loc_80462CE
- ROM:080462F4 MOVS R1, #0x118
- ROM:080462F8 ADDS R0, R6, R1
- ROM:080462FA LDRH R0, [R0]
- ROM:080462FC CMP R0, #0
- ROM:080462FE BNE loc_8046334
- ROM:08046300 CMP R7, #2
- ROM:08046302 BNE loc_8046334
- ROM:08046304 SUBS R1, #4
- ROM:08046306 ADDS R0, R6, R1
- ROM:08046308 LDRB R0, [R0]
- ROM:0804630A CMP R0, #0xFF
- ROM:0804630C BNE loc_8046334
- ROM:0804630E MOVS R0, R6
- ROM:08046310 BL daycare_relationship_score
- ROM:08046314 MOVS R4, R0
- ROM:08046316 LSLS R4, R4, #0x18
- ROM:08046318 LSRS R4, R4, #0x18
- ROM:0804631A BL rand
- ROM:0804631E LSLS R0, R0, #0x10
- ROM:08046320 LSRS R0, R0, #0x10
- ROM:08046322 MOVS R1, #0x64 @ 'd'
- ROM:08046324 MULS R0, R1
- ROM:08046326 LDR R1, =0xFFFF
- ROM:08046328 BL __udivsi3
- ROM:0804632C CMP R4, R0
- ROM:0804632E BLS loc_8046334
- ROM:08046330 BL sub_8045A48
复制代码 应该说这个程序还是非常容易分析的——而在daycaare_releationship_score中不难发现根据不同情况返回值是0x14,0x46,0x32,对应三种情况下的概率(那么后面的指令和跳转的在干什么也很明确了吧)
那么接下来就是随意设置跳转,进行判断了,我选在0x46320(有注释可能没法正常编译)- .thumb
- .align 2
- ldr r1, =0x8800001 @新程序指针
- bx r1
复制代码 新的程序则是- .thumb
- .align 2
- @800000h
- push {r0, r2-r7}
- mov r0, #0xfe @参量,道具编号(这里随便填了一个)
- mov r1, #1
- bl checkitem
- mov r1, r0
- pop {r0, r2-r7}
- lsr r0, r0, #0x10
- cmp r1, #1
- bne original
- mov r1, #0x10 @调小以提升概率(这种情况下"255步判断"必出蛋)
- b share
- original:
- mov r1, #0x64
- share:
- mul r0, r1
- ldrh r1, =0xffff
- ldr r3, =0x08046329
- bx r3
- checkitem:
- ldr r4, =0x08099F41
- bx r4
复制代码 大概就是这么回事了,苦逼地写论文去(花了整整一上午,但这东西很难测试)
或许这里或那里有什么错误或问题,欢迎指导【测试不足,不得转载 |
|