|

- 帖子
- 11
- 精华
- 0
- 积分
- 45
- 威望
- 0
- 金钱
- 13
- 阅读权限
- 10
- 注册时间
- 2011-3-16
|
关于某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 ; RAM ff_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 |
|