6. 脚本文件分析
下面开始具体分析脚本文件,这里又要用到agemo_debugger了。
下CD-ROM访问断点,可以看到程序将Sce.pac中的一段载入到800C89B8,一开始是读取sce.pac中的1f段。
然后下内存访问断点,范围大约是800C89B8 - 800D07C0。
根据第2节的分析也可知1f段也分成了若干段,这里读取的是第4段00 91。(注意,段号是基0的)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 74 00 7F 00 87 00 8D 00 91 00 AE 00 C1 00 D4 00 t..‡..‘.®.Á.Ô.
00000010 E7 00 FA 00 0D 01 10 01 2A 01 2A 01 2A 01 2A 01 ç.ú.....*.*.*.*.
00000020 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 *.*.*.*.*.*.*.*.
00000030 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 *.*.*.*.*.*.*.*.
00000040 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 *.*.*.*.*.*.*.*.
00000050 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 *.*.*.*.*.*.*.*.
00000060 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 2A 01 *.*.*.*.*.*.*.*.
00000070 2A 01 2A 01 41 03 00 41 01 00 1D 69 01 1C 79 1D *.*.A..A...i..y.
00000080 66 1D 67 3E 01 78 69 41 03 00 41 01 00 1D 69 3F f.g>.xiA..A...i?
00000090 00 1D 00 40 00 01 22 79 1D 68 40 01 01 1E 79 40 ...@.."y.h@...y@
000000A0 01 02 1F 79 40 01 03 20 79 40 01 04 21 79 4E 02 ...y@.. y@..!yN.
000000B0 E8 80 1D 69 1D 00 40 00 01 22 79 41 01 01 01 1B è€.i..@.."yA....
000000C0 79 4E 02 F6 80 1D 69 1D 00 40 00 01 22 79 41 01 yN.ö€.i..@.."yA.
000000D0 02 01 1B 79 4E 02 00 81 1D 69 1D 00 40 00 01 22 ...yN...i..@.."
000000E0 79 41 01 03 01 1B 79 4E 02 0C 81 1D 69 1D 00 40 yA....yN...i..@
000000F0 00 01 22 79 41 01 04 01 1B 79 4E 02 10 81 1D 69 .."yA....yN...i
00000100 1D 00 40 00 01 22 79 41 01 00 01 1B 79 01 AC 61 ..@.."yA....y.¬a
00000110 1D 07 00 70 67 00 41 03 00 44 40 03 01 1A 79 1D ...pg.A..D@...y.
00000120 66 1D 67 3E 53 01 00 01 78 69 00 00 00 00 00 00 f.g>S...xi......
下内存断点有一个方便的地方就是可以观察跳转,比如说现在正在访问00 91,之后顺序访问了00 92一直到00 97,之后突然访问了01 0D,那么就知道出现了一个跳转指令。
对于跳转指令很适合下内存访问断点并且进行asm log,基本中间没有废代码。如果是其他指令,尤其是会出现中断的指令,比如会读取光盘,显示图片,等待输入之类的,生成的asm log会很大。
重新读档后,再下内存访问断点,点上asm log,分析可知:
指令应该有0-100共101(65)种,有两套函数来进行处理,
第一套在8006A580;
第二套在8006A3EC;
他们是连续的。
脚本处理程序首先读取1byte,然后执行第一套函数,估计是有效性检查。然后再执行第二套函数,这才是真正的执行。
01的含义应该是跳转,之后跟2bytes。
79 22 指明跳转的大段号和小段号。算法如下:(注:这个应该是优化过的除法,实际是除以3E8,agemo_homepage中有文章提到过这一点)
7922 * 0x10624DD3,取高位到a3,
a0 = a3 / 0x40(a3 >> 6) a0就是大段号 (这里是1F)
v1 = 7922 –a0 * 3E8 v1就是小段号 (这里是A)
这个脚本略微复杂了一些,因为每一条指令并没有一个参数指明指令长度,所以只能去看每一个函数,确定各个指令的参数占用多少字节,意义如何。
详细参考FuckSce的代码和idb文件,查找ReadScript函数。
之后跳转到了其他段,发现有压缩的情况,所以开始处理解压。