近来ios上的游戏, 用非原生的SDK的那是越来越多.
长话短说, 前天就遇到一个, 叫做D.Switches, 塔防游戏, 里面内购主要是解锁我方可使用的人物, 解锁地图.
按照惯例, 打开iFunbox, 把Documents目录里面的文件都拷贝到机器上.
依次打开各种*.sqlite文件, 发现game.sqlite里面的summon表, 应该就是我们需要动手的地方.
地图先不管, 把这里的lock都给去了, 保存, 传到ipad上. 然后进入商店, 喵的一声, 弹出一个对话框, 提示summon信息损坏, 已经重新初始化.
看来这里的hex就应该是校验了, 数了下64字节, 应该是512bits, 512的有啥呢, 我第一时间想到了了sha系列, 搜了下应该是sha512吧?
顿时恶向胆边生, 把整个D.Switches.app拷贝到了电脑上, 用010Editor打开主文件D.Switches, 搜索summon字样, 满以为能找到关键点, 令人惊奇的是, ANSI, Unicode和UCS4格式都搜了, 居然没有.
对整个目录搜索, 不幸在resource.car里面发现了一些summon字样.
打开这个文件, 里面居然有残缺的sql语句, 看起来应该是什么脚本系的东西. 当然这个后缀肯定不会是symbian或者brew这类的, 不管, 经过查看文件头部, 感觉这个可以解.
把每个记录抄在纸上, 发现每条记录分为4部分, 再仔细观察, 文件名部分结尾的0不止是一个, 有时候是两个, 应该是为了对齐.
最后写了个文件模版验证, 证明猜测是对的.
接下来就是找了个以前做的类似结构的解包程序, 改了下代码, 把文件都给解出来了. 当然这个解包程序还有打包功能, 打包部分懒得一并修改了, 回头再说吧.
解出来的一堆.lu文件, 看起来很像是lua的东西啊, 搜了一堆lua的反编译工具都不认, 然后去看了bytecode的格式, 发现这玩意是Corona包过的, 头部加了三个字段, 删掉这三个字段, 保存为db_m.lu后, luadec提示版本是5.1的, 遂去找了luadec51, 运行居然要msvcr100d.dll我的天, debug运行库得vc安装包才有, 懒得解了, 拿vc2008编译了一个, 再反编译, 还是失败, 不过倒是有bgm_m.lu和info_m.lu可能是比较简单吧, 反出来几行. 既然反编译不行, 那就用-dis选项来反汇编吧.
反汇编出来的虚拟机汇编代码类似ARM的.
顺利找到了令人关心的位置:
; Function #19:
;
; Name:
; Defined at line: 313
; #Upvalues: 2
; #Parameters: 2
; Is_vararg: 0
; Max Stack Size: 11
1 [-]: EQ 0 R1 K0 ; if R1 ~= nil then PC := 9
2 [-]: JMP 9 ; PC := 9
3 [-]: GETGLOBAL R2 K1 ; R2 := tostring
4 [-]: GETGLOBAL R3 K2 ; R3 := os
5 [-]: GETTABLE R3 R3 K3 ; R3 := R3["time"]
6 [-]: CALL R3 1 0 ; R3,... := R3()
7 [-]: CALL R2 0 2 ; R2 := R2(R3,...) ; R2 = tostring(os["time"])
8 [-]: MOVE R1 R2 ; R1 := R2
9 [-]: MOVE R2 R1 ; R2 := R1
10 [-]: GETGLOBAL R3 K4 ; R3 := pairs
11 [-]: MOVE R4 R0 ; R4 := R0
12 [-]: CALL R3 2 4 ; R3,R4,R5 := R3(R4) ; R3,R4,R5 = pairs(arg1)
13 [-]: JMP 19 ; PC := 19
14 [-]: MOVE R8 R2 ; R8 := R2
15 [-]: GETGLOBAL R9 K1 ; R9 := tostring
16 [-]: MOVE R10 R7 ; R10 := R7
17 [-]: CALL R9 2 2 ; R9 := R9(R10) R9 = tostring(R7)
18 [-]: CONCAT R2 R8 R9 ; R2 := R8 .. R9
19 [-]: TFORLOOP R3 2 ; R6,R7 := R3(R4,R5); if R6 ~= nil then begin PC = 14; R5 := R6 end
20 [-]: JMP 14 ; PC := 14
21 [-]: MOVE R3 R2 ; R3 := R2
22 [-]: LOADK R4 K5 ; R4 := "feel-.-dead-.-beef"
23 [-]: CONCAT R2 R3 R4 ; R2 := R3 .. R4
24 [-]: GETUPVAL R3 U0 ; R3 := U0
25 [-]: GETTABLE R3 R3 K6 ; R3 := R3["hmac"]
26 [-]: GETUPVAL R4 U0 ; R4 := U0
27 [-]: GETTABLE R4 R4 K7 ; R4 := R4["sha512"]
28 [-]: MOVE R5 R2 ; R5 := R2
29 [-]: GETUPVAL R6 U1 ; R6 := U1
30 [-]: CALL R3 4 2 ; R3 := R3(R4,R5,R6) r3 = hmac("sha512", R2+fell-.dead-.-beef)
31 [-]: MOVE R4 R1 ; R4 := R1
32 [-]: RETURN R3 3 ; return R3,R4
33 [-]: RETURN R0 1 ; return
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课