返回列表 发帖

关于某SS游戏反编译源码分析

先在主角的名字下断,一路跟踪到下面的这个字符显示函数:
计算编码=(字符编码)<<8+下个编码+85
RAM:0603877C myTextOut:                              ; CODE XREF: sub_6038854+22p
RAM:0603877C                                         ; RAM:060388C2p ...
RAM:0603877C                 mov.l   r8, @-r15
RAM:0603877E                 mov.l   r9, @-r15
RAM:06038780                 mov.l   r10, @-r15
RAM:06038782                 mov.l   r11, @-r15
RAM:06038784                 mov.l   r12, @-r15
RAM:06038786                 mov.l   r13, @-r15
RAM:06038788                 sts.l   pr, @-r15
RAM:0603878A                 mov     r4, r8          ; r4存放计算编码
RAM:0603878C                 mov     r5, r12
RAM:0603878E                 mov     r6, r9
RAM:06038790                 mov     r7, r10
RAM:06038792                 tst     r8, r8
RAM:06038794                 bf/s    loc_60387AC     ; 计算编码不为0则跳

RAM:060387AC                 mov.l   off_6038840, r13 ; loc_6038164
RAM:060387AE
RAM:060387AE loc_60387AE:                            ; CODE XREF: myTextOut+44j
RAM:060387AE                                         ; myTextOut+76j ...
RAM:060387AE                 mov.w   @r8+, r5        ; 取计算编码
RAM:060387B0
RAM:060387B0 loc_60387B0:                            ; CODE XREF: myTextOut+90j
RAM:060387B0                 tst     r5, r5
RAM:060387B2                 bt/s    loc_6038828
RAM:060387B4                 mov     #h'1E, r1
RAM:060387B6                 cmp/gt  r1, r5
RAM:060387B8                 bt/s    loc_603881C     ; 计算编码大于1E则跳

RAM:0603881C                 mov     r10, r7
RAM:0603881E                 mov     r9, r6
RAM:06038820                 jsr     @r13            ; 跳到6038164 关键函数
RAM:06038822                 mov     r12, r4
RAM:06038824                 bra     loc_60387AE      ;取下个编码
RAM:06038826                 add     r0, r9



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RAM:06038164 loc_6038164:                            ; DATA XREF: myTextOut:loc_60387ACo
RAM:06038164                                         ; RAMff_6038840o
RAM:06038164                 mov.l   r8, @-r15
RAM:06038166                 mov.l   r9, @-r15
RAM:06038168                 mov.l   r10, @-r15
RAM:0603816A                 mov.l   r11, @-r15
RAM:0603816C                 mov.l   r12, @-r15
RAM:0603816E                 mov.l   r13, @-r15
RAM:06038170                 mov.l   r14, @-r15
RAM:06038172                 sts.l   pr, @-r15
RAM:06038174                 add     #-h'30, r15
RAM:06038176                 mov.l   r4, @(h'1C,r15)
RAM:06038178                 mov.l   r7, @(h'20,r15)
RAM:0603817A                 mov.l   off_6038310, r1 ; unk_603BDB8
RAM:0603817C                 mov.l   @r1, r12
RAM:0603817E                 mov.l   off_6038314, r1 ; unk_603BDF8
RAM:06038180                 mov.l   @r1, r14
RAM:06038182                 mov     r5, r8
RAM:06038184                 mov.l   off_6038318, r1 ; unk_603BDC4
RAM:06038186                 mov.l   @r1, r1
RAM:06038188                 mov.l   r1, @(h'28,r15)
RAM:0603818A                 mov.l   off_603831C, r1 ; unk_603BDF4
RAM:0603818C                 mov.l   @r1, r10
RAM:0603818E                 mov     #0, r0
RAM:06038190                 mov.l   r0, @(h'2C,r15)
RAM:06038192                 mov.l   off_6038320, r0 ; sub_6036D7C
RAM:06038194                 jsr     @r0 ; sub_6036D7C
RAM:06038196                 mov     r6, r11
RAM:06038198                 mov     r0, r9
RAM:0603819A                 tst     r9, r9
RAM:0603819C                 bf/s    loc_60381A4
RAM:0603819E                 mov     r9, r2
RAM:060381A0                 bra     loc_60382EC
RAM:060381A2                 mov     #-1, r0
RAM:060381A4 ; ---------------------------------------------------------------------------
RAM:060381A4
RAM:060381A4 loc_60381A4:                            ; CODE XREF: RAM:0603819Cj
RAM:060381A4                 mov.l   off_6038324, r1 ; off_603A734
RAM:060381A6                 mov.l   @r1, r1
RAM:060381A8                 sub     r1, r2
RAM:060381AA                 mov.l   off_6038328, r1 ; unk_6038160
RAM:060381AC                 mov.l   @r1, r1
RAM:060381AE                 dmulu.l r1, r2
RAM:060381B0                 mov.l   off_603832C, r3 ; unk_603BDBC
RAM:060381B2                 sts     mach, r2
RAM:060381B4                 shlr2   r2
RAM:060381B6                 shlr    r2
RAM:060381B8                 shlr2   r2
RAM:060381BA                 mov.w   @r3, r1
RAM:060381BC                 shll2   r2
RAM:060381BE                 shll2   r2
RAM:060381C0                 add     r2, r1
RAM:060381C2                 extu.w  r1, r1
RAM:060381C4                 mov.l   r1, @(h'24,r15)
RAM:060381C6                 mov.w   word_6038300, r1 ; h'84
RAM:060381C8                 cmp/gt  r1, r8
RAM:060381CA                 bf/s    loc_60381EE
RAM:060381CC                 mov     r15, r7
RAM:060381CE                 mov.w   word_6038302, r1 ; h'85
RAM:060381D0                 mov     r8, r2
RAM:060381D2                 sub     r1, r2
RAM:060381D4                 mov.l   dword_603824C, r1 ; h'22400000
RAM:060381D6                 mov.w   word_6038250, r4 ; h'500
RAM:060381D8                 mov.l   dword_6038330, r5 ; h'20034C
RAM:060381DA                 jsr     @r5             ; 在20C61A这个缓冲区遍历查找对应的字模(计算编码-85+1)
RAM:060381DC                 mov.l   @r1, r0
RAM:060381DE                 nop
RAM:060381E0                 mov     r15, r7
RAM:060381E2                 mov     #h'E, r5
RAM:060381E4                 mov     r15, r2
RAM:060381E6                 add     #h'18, r2
RAM:060381E8                 mov     #0, r1
RAM:060381EA                 bra     loc_603820A
RAM:060381EC                 mov.w   r1, @r2
RAM:060381EE ; ---------------------------------------------------------------------------
RAM:060381EE
RAM:060381EE loc_60381EE:                            ; CODE XREF: RAM:060381CAj
RAM:060381EE                 mov     r8, r2
RAM:060381F0                 add     #-h'29, r2
RAM:060381F2                 mov     #h'1A, r1
RAM:060381F4                 mul.l   r1, r2
RAM:060381F6                 mov.l   dword_6038334, r3 ; h'200450
RAM:060381F8                 mov.l   @r3, r1
RAM:060381FA                 sts     macl, r2
RAM:060381FC                 mov     r1, r3
RAM:060381FE                 add     r2, r3
RAM:06038200                 mov     #0, r1
RAM:06038202                 mov.w   r1, @r15
RAM:06038204                 mov.w   @r3+, r1
RAM:06038206                 add     #2, r7
RAM:06038208                 extu.w  r1, r5
RAM:0603820A
RAM:0603820A loc_603820A:                            ; CODE XREF: RAM:060381EAj
RAM:0603820A                 mov     #0, r2
RAM:0603820C                 mov     #h'B, r6
RAM:0603820E
RAM:0603820E loc_603820E:                            ; CODE XREF: RAM:06038216j
RAM:0603820E                 mov.w   @r3+, r1        ; 把找到的(24个字节)字模复制到堆栈中
RAM:06038210                 add     #1, r2
RAM:06038212                 cmp/gt  r6, r2
RAM:06038214                 mov.w   r1, @r7
RAM:06038216                 bf/s    loc_603820E
RAM:06038218                 add     #2, r7
RAM:0603821A                 mov     #1, r1
RAM:0603821C                 and     r14, r1
RAM:0603821E                 tst     r1, r1
RAM:06038220                 bt      loc_6038224
RAM:06038222                 add     #1, r5

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RAM:0603A374 loc_603A374:                            ; CODE XREF: RAM:0603A38Cj  在字模数据所在堆栈区下断,断在此处
RAM:0603A374                 mov.w   @r5+, r1        ; 取数据 重要算法,对字模数据进行解码
RAM:0603A376                 mov     r4, r6          ; r6=r4=60FF9B1
RAM:0603A378                 tst     r1, r1
RAM:0603A37A                 bt/s    loc_603A38A
RAM:0603A37C                 shll16  r1
RAM:0603A37E
RAM:0603A37E loc_603A37E:                            ; CODE XREF: RAM:0603A380j
RAM:0603A37E                                         ; RAM:0603A386j
RAM:0603A37E                 addc    r1, r1
RAM:0603A380                 bf/s    loc_603A37E
RAM:0603A382                 add     #1, r6          ; r6++
RAM:0603A384                 tst     r1, r1
RAM:0603A386                 bf/s    loc_603A37E
RAM:0603A388                 mov.b   r3, @(r0,r6)    ; r3=3 r0=FFFFFFFF
RAM:0603A38A
RAM:0603A38A loc_603A38A:                            ; CODE XREF: RAM:0603A37Aj
RAM:0603A38A                 dt      r7               r7初始值为0xD
RAM:0603A38C                 bf/s    loc_603A374     ; 重要算法
RAM:0603A38E                 add     #h'10, r4
RAM:0603A390                 rts                      可在此处继续下断
RAM:0603A392                 nop
算法分析:字模数据转化为二进制,一个比特位代表一个点,
以下是从内存中导出的E的字模(已进行转化)

00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 03 03 03 03 03 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 03 03 03 03 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 00 00 00 00 00 00  00 00 00 00 00 00 00 00
03 03 03 03 03 03 03 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00

分析的数据最好贴完整的,比如RAM:06038794    后面的没看见
bt/s bf/s这种带/s和bra jmp jsr这种指令的,都是先执行后一条指令在跳转的

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

TOP

返回列表