无聊之士
全控
级别: 火花会员
编号: 49952
精华: 5
发帖: 432
威望: 25 点
配偶: 单身
火 花 币: 4092 HHB
注册时间:2006-02-10
最后登陆:2024-06-28
|
文字处理相关
以下分析基于火花狼组汉化的中文版圣魔。关于文字的霍夫曼压缩解压方式。
以地图画面物品整理画面为例:
首先分析部分程序,调色板使用暂时不考虑,目前知道的是字体用调色板是0号 -------------------- R0是武器数量以及武器代码,比如00001E01 ;1E=30 ,01是铁剑
0801729C B500 push , lr 0801729E 21FF mov r1, FFh 080172A0 4008 and r0, r1<------屏蔽数量 080172A2 00C1 lsl r1, r0, 3h《----求偏移开始 080172A4 1809 add r1, r1, r0 080172A6 0089 lsl r1, r1, 2h 080172A8 4804 ldr r0, [pc, 10h] ([000172BC]=0885E068)《----得到基地址 080172AA 1809 add r1, r1, r0《-------得到铁剑武器所在实际地址0885E068+0024=0885E08C 080172AC 8808 ldrh r0, [r1, 0h]<----得出:名称DB 02 ,RO实际数据是000002DB 080172AE FE7BF7F2 bl 8009FA8h《-----下面解释 080172B2 FF31F7F2 bl 800A118h《-----字解释,最好先看前面的查找程序后在看 080172B6 BC02 pop r1 080172B8 4708 bx r1 080172BA 0000 080172BC E068 080172BE 0885 ------------------------------ 080172AE FE7BF7F2 bl 8009FA8h《-----下面解释,还是以铁剑为例
08009FA8 B570 push r4-r6, lr 08009FAA 1C05 mov r5, r0《--------R5=R0=000002DB 08009FAC 4E07 ldr r6, [pc, 1Ch] ([00009FCC]=0202B6A8) 08009FAE 6830 ldr r0, [r6, 0h]<-----RO=060A 08009FB0 4285 cmp r5, r0 08009FB2 D011 beq 8009FD8h<----所以这里是检测和上面的武器、道具是否一样,是一样就省略不少处理的判定 08009FB4 4906 ldr r1, [pc, 18h] ([00009FD0]=0814D08C)《----得到基地址,这里要注意了! 08009FB6 00A8 lsl r0, r5, 2h《----------4倍武器名称,也就是02DB*4=0B6C 08009FB8 1840 add r0, r0, r1<-----合成地址为814DBF8,也就是是说铁剑字库与该指针有关! 08009FBA 6800 ldr r0, [r0, 0h]<----读出【0814DBF8】=080FACE9 08009FBC 4C05 ldr r4, [pc, 14h] ([00009FD4]=0202A6A8) 08009FBE 1C21 mov r1, r4 08009FC0 FD98F7F8 bl 8002AF4h<-------进入霍夫曼解压缩转移 08009FC4 6035 str r5, [r6, 0h]《----当前武器名称存入0202B6A8,不是0202A6A8哦! 08009FC6 1C20 mov r0, r4 08009FC8 E007 b 8009FDAh 08009FCA 0000 lsl r0, r0, 0 08009FCC B6A8 ???? 08009FCE 0202 lsl r2, r0, 8h 08009FD0 D08C beq 8009EECh 08009FD2 0814 lsr r4, r2, 0 08009FD4 A6A8 add r6, [pc, 2A0h] (=0800A278h) 08009FD6 0202 lsl r2, r0, 8h 08009FD8 4801 ldr r0, [pc, 4h] ([00009FE0]=0202A6A8) 08009FDA BC70 pop r4-r6 08009FDC BC02 pop r1 08009FDE 4708 bx r1 08009FE0 A6A8 08009FE2 0202 --------------------------------------- 08009FC0 FD98F7F8 bl 8002AF4h<-------霍夫曼解压缩转移
08002AF4 B500 push , lr 08002AF6 4A03 ldr r2, [pc, Ch] ([00002B04]=030040F0),这个指针下面的数据指针就是程序将去的地方 08002AF8 6812 ldr r2, [r2, 0h] 08002AFA FD63F0D3 bl 80D65C4h《-----这个是个转移,我直接到到达的程序去了 08002AFE BC01 pop r0 08002B00 4700 bx r0 08002B02 0000 08002B04 40F0 08002B06 0300
--------------------------- 08002AFA FD63F0D3 bl 80D65C4h《-----这个是个转移,我直接到到达的程序去了 这段程序在空栈区03003BAC......非常重要!!!直接关系到铁剑字指针的寻找
在rom中是没有空栈区的,但是有对应数据区,我直接抄了03003BAC对应080006E4,在03003BAC区有改变的我写在后面了
080006E4 E92D00F0 stmdb [sp]!, r4-r7 080006E8 E0433003 sub r3, r3, r3 080006EC E51F5014 ldr r5, [pc, -14h] 《-----ldr r5=814929ch 替换前面 8147ddc!!! 080006F0 E51F701C ldr r7, [pc, -1Ch] 《-----ldr r7=814d088h 替换前面 814d088!!! 080006F4 E5977000 ldr r7, [r7, 0h] 080006F8 E1A04007 mov r4, r7《-----R4由【814d088】得来,为814d084 080006FC E2533001 subs r3, r3, 1h《----7次检测内循环 08000700 5A000002 bpl 08000710h 08000704 E5D02000 ldrb r2, [r0, 0h] 08000708 E2800001 add r0, r0, 1h 0800070C E3A03007 mov r3, 7h《----7+1次检测内循环赋值 08000710 E3120001 tst r2, 1h 08000714 0A000001 beq 08000720h 08000718 E1D460B2 ldrh r6, [r4, 2h] 0800071C EA000000 b 08000724h 08000720 E1D460B0 ldrh r6, [r4, 0h] 08000724 E0854106 add r4, r5, r6, lsl 2h 08000728 E1A020A2 mov r2, r2, lsr 1h 0800072C E5946000 ldr r6, [r4, 0h] 08000730 E1160006 tst r6, r6《-----测试是否是负数,也就是字指针是否是FFFFxxxx,其中xxxx为字体指针 08000734 5AFFFFF0 bpl 080006FCh《-----不是要求格式的就不是字指针 08000738 E3160CFF tst r6, FF00h《----测试是否是FFFF0000 0800073C 0A000004 beq 08000754h《----是就要出程序了 08000740 E5C16000 strb r6, [r1, 0h]《-----每查到一个要求的字后该字存入[202A6A8+(N-1)*2],例如第1个字指针是90 ,BD 分别存入202A6A8,202A6A9 08000744 E1A06426 mov r6, r6, lsr 8h 08000748 E5C16001 strb r6, [r1, 1h] 0800074C E2811002 add r1, r1, 2h 08000750 EAFFFFE8 b 080006F8h《---继续外循环 08000754 E5C16000 strb r6, [r1, 0h]《----00保存 08000758 E31600FF tst r6, FFh《----测试是否是FFFF0000 0800075C 0A000001 beq 08000768h《-----是 就跳出该查字程序 08000760 E2811001 add r1, r1, 1h 08000764 EAFFFFE3 b 080006F8h《---不是继续外循环 08000768 E8BD00F0 ldmia [sp]!, r4-r7《----保护数据弹出 0800076C E12FFF1E bx lr《----程序返回入口地址
铁剑每个字指针如下: 202A6A8 202A6A9 90 BD R3=1 202A6AA 202A6AB 89 B8 R3=6 202A6AC 202A6AD 00
上面有3组数据,实际有效的只有2个,分别对应铁剑2个字。。。。。。 ---------------------- 在0801729C 0801729E两处设置BRK 画面中选物品整理,会在0801729C中断,,此时即时存档,然后可以反复读取,R0是武器数量以及武器代码,调试者可以自己改。
然后再以下3个地方设置断点
03003bcc 过一次读8bit
03003c08 存入解码数据第一位,此时记录下R3的值
03003c1c 存入解码数据第二位,当r6数据为00就结束解码
当在03003c1c停止时r6=0,重新读取存档,可继续返回跟踪解码
====================================
|
姓:郑 名:长春 号:无聊之士! 欢迎到网络U盘地址:http://zhengchangchun.ys168.com/ 来~ 个人空间http://i.cn.yahoo.com/zhengchangchun2003
|
[楼 主]
|
Posted:2011-09-13 10:51| |
顶端
| |