| 
 | 
 
 本帖最后由 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
 
  复制代码 大概就是这么回事了,苦逼地写论文去(花了整整一上午,但这东西很难测试) 
 
或许这里或那里有什么错误或问题,欢迎指导【测试不足,不得转载 |   
 
 
 
 |