[原创]《我叫mt》数据包解包记录
把自己Blog上的一篇文章转过来,V1.6 V2.5 通用
关于GDB部分,不懂的请看虫大的《android软件安全与逆向分析》
=============================================
== From: blog.breeze356.com
《我叫MT online》使用的是开源项目npk(https://github.com/lqez/npk),想要解包data.dat,需要得到key,步骤记录如下,以备忘。
1. 开启Android JIT Debugging
setprop debug.db.uid 32767
启用Just-in-time debugging, pid 小于32767的进程(apk的进程号>10000),在crash之后,自动等待gdb附加调试。
2. 准备LogCat
用数据线连上手机,打开Eclipse,打开DDMS,选中手机,查看LogCat输出信息。
3. 修改libgame.so
找到/data/data/com.locojoy.punchbox.immt_a_chs/lib/libgame.so,下载到电脑,用ida打开,找到函数
__npk_package_open
对比源码
NPK_RESULT __npk_package_open( NPK_PACKAGEBODY* pb, const NPK_CHAR* filename, long filesize, NPK_TEAKEY teakey[4] )
{
...
if( teakey == NULL )
{
return ( npk_error( NPK_ERROR_NeedSpecifiedTeaKey ) );
}
memcpy( pb->teakey_, teakey, sizeof(NPK_TEAKEY) * 4 ); // 如果在memcpy处crash,[R1] 即为 key[0]
...
}找到汇编码
.text:003557BA 20 1C MOVS R0, R4 .text:003557BC 1C 30 ADDS R0, #0x1C ; dest .text:003557BE 0A 99 LDR R1, [SP,#0x270+src] ; src .text:003557C0 10 22 MOVS R2, #0x10 ; n .text:003557C2 0C F6 60 EF BLX memcpy
将
.text:003557C2 0C F6 60 EF BLX memcpy
修改为
.text:003557C2 00 25 MOVS R5, #0 .text:003557C4 2D 68 LDR R5, [R5]
最好自己写个lib,在这个地方下个hook,这里就简单修改一下为了让程序crash
4. Crashing
将修改后的libgame.so覆盖/data/data/com.locojoy.punchbox.immt_a_chs/lib/libgame.so,启动游戏,LogCat将输出以下信息:
06-13 16:13:13.320: I/DEBUG(934): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 06-13 16:13:13.320: I/DEBUG(934): Build fingerprint: 'KONKA/sprdroid_base/hsdroid:2.3.5/MocorDroid2.3.5/W12.20_P8_20120823.110032:user/test-keys' 06-13 16:13:13.320: I/DEBUG(934): pid: 19585, tid: 19594 >>> com.locojoy.punchbox.immt_a_chs <<< 06-13 16:13:13.320: I/DEBUG(934): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 06-13 16:13:13.320: I/DEBUG(934): r0 0044613c r1 44de0838 r2 00000010 r3 44de0838 06-13 16:13:13.320: I/DEBUG(934): r4 00446120 r5 00000000 r6 81cb5f3c r7 00000001 06-13 16:13:13.320: I/DEBUG(934): r8 44de0b68 r9 44ce0f30 10 44ce0f1c fp 802a5368 06-13 16:13:13.320: I/DEBUG(934): ip 81718e84 sp 44de05a8 lr 81355765 pc 8135579c cpsr 40800030 ...... 06-13 16:13:13.470: I/DEBUG(934): ******************************************************** 06-13 16:13:13.470: I/DEBUG(934): * Process 19585 has been suspended while crashing. To 06-13 16:13:13.470: I/DEBUG(934): * attach gdbserver for a gdb connection on port 5039: 06-13 16:13:13.470: I/DEBUG(934): * 06-13 16:13:13.470: I/DEBUG(934): * adb shell gdbserver :5039 --attach 19585 & 06-13 16:13:13.470: I/DEBUG(934): * 06-13 16:13:13.470: I/DEBUG(934): * Press HOME key to let the process continue crashing. 06-13 16:13:13.470: I/DEBUG(934): ********************************************************
5. GDB下获取Key
在手机端
./gdbserver :5039 --attach 19585 &
在PC端
> adb forward tcp:5039 tcp:5039 > arm-linux-androideabi-gdb.exe GNU gdb (GDB) 7.3.1-gg2 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=x86_64-pc-mingw32msvc --target=arm-linux-android". For bug reporting instructions, please see: <http://source.android.com/source/report-bugs.html>. (gdb) target remote localhost:5039 (gdb) p *(0x44de0838) 6: *(0x44de0838) = 1934745265 (gdb) p *(0x44de0838 + 4) 7: *(0x44de0838 + 4) = 1934745265 (gdb) p *(0x44de0838 + 8) 8: *(0x44de0838 + 8) = 66285981 (gdb) p *(0x44de0838 + 0xc) 9: *(0x44de0838 + 0xc) = 1671953521
根据LogCat信息 得知crash时 r1 = 0x44de0838
命令 p 打印出
key[0] = 1934745265 key[1] = 1934745265 key[2] = 66285981 key[3] = 1671953521
6. 解压
至此, key已经找出来了,修改npk源码
#define NPK_SIGNATURE "LJPK"
编译出npk.exe,解压
D:\breezeMT\data>..\npk ..\data.dat -export *.* --k 1934745265:1934745265:66285981:1671953521
