リバースエンジニアリング検証

apkを元に、Proguardをかける前かけた後でどのくらい解読具合が異なるのか、パッケージが含むC++等のネイティブライブラリ(libXX.so)やjarライブラリがどのくらい解読し得るのか、少し気になって、自作アプリで確認してみた。

結論は、ネイティブライブラリの解読は逆アセンブルで困難だが、javaのソースはjarライブラリもプロジェクトのソースもしっかり見えた。
Proguardをかけるとやはり見えにくくはなっているが、ある程度推測して解読はできる感じ。(アプリのつくりにもよるが)

試したリバースエンジニアリングの手順は以下。
1.apkをunzipして、プロジェクトに含まれるclass.dex(javaのclassファイルの情報)、Manifestやresourceのxmlを取り出す。

2.http://code.google.com/p/android4me/ からAXMLPrinter2.jarをダウンロードして、AndroidManifest.xmlや、res/***/***.xmlを復元。

$ java -jar AXMLPrinter2.jar AndroidManifest.xml 

3.http://code.google.com/p/dex2jar/からdex2jarをダウンロードし、classes.dexをjarに復元

$ dex2jar.bat classes.dex
$ ls
classes.dex.dex2jar

4. http://java.decompiler.free.fr/からJava Decompiler(jd-gui)をダウンロードし、3で復元したからJavaソースを復元。

$ jd-gui.sh classes.dex.dex2jar

5.class.dex.dex2jarを展開し、含まれるjarやネイティブライブラリを取り出す。

$ jar xvf class.dex.dex2jar

パッケージが展開され、含まれるjarやネイティブのライブラリが取り出せる。
jarライブラリは更に本コマンドで展開するなり、4で復元してもよいし、EclipseのInstallからhttp://java.decompiler.free.fr/jd-eclipse/updateを追加してjd-eclipseをインストールし、jarや各classを開いても復元される。

ネイティブライブラリは、逆アセンブラで解読できる範囲まで。。
解析の仕方は、前のエントリ http://d.hatena.ne.jp/chiakisugimoto/20110604/1307170484 とか。

$ mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-objdump -d libCube.so(以前物理エンジンサンプルとして作成したネイティブライブラリ)
/パス/libCube.so:     file format elf32-littlearm

Disassembly of section .plt:

0003531c <.plt>:
   3531c:       e52de004        push    {lr}            ; (str lr, [sp, #-4]!)
…略
0009a14c <Java_chiaki_test_cube_Cube_simulate>:
   9a14c:       b5f0            push    {r4, r5, r6, r7, lr}
   9a14e:       465f            mov     r7, fp
   9a150:       4656            mov     r6, sl
   9a152:       464d            mov     r5, r9
   9a154:       4644            mov     r4, r8
   9a156:       b4f0            push    {r4, r5, r6, r7}
   9a158:       4ac8            ldr     r2, [pc, #800]  (9a47c <Java_chiaki_test_cube_Cube_simulate+0x330>)
   9a15a:       b0f3            sub     sp, #460
…略
   9a178:       6123            str     r3, [r4, #16]
   9a17a:       6165            str     r5, [r4, #20]
   9a17c:       61a5            str     r5, [r4, #24]
   9a17e:       61e1            str     r1, [r4, #28]
   9a180:       1c07            adds    r7, r0, #0
   9a182:       2058            movs    r0, #88
   9a184:       468b            mov     fp, r1
   9a186:       f79b e970       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a18a:       1c21            adds    r1, r4, #0
   9a18c:       1c05            adds    r5, r0, #0
   9a18e:       f7b4 fd4d       bl      4ec2c <_ZN31btDefaultCollisionConfigurationC1ERK34btDefaultCollisionConstructionInfo>
   9a192:       48bb            ldr     r0, [pc, #748]  (9a480 <Java_chiaki_test_cube_Cube_simulate+0x334>)
   9a194:       f79b e968       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a198:       1c29            adds    r1, r5, #0
   9a19a:       1c06            adds    r6, r0, #0
   9a19c:       f7a9 fdac       bl      43cf8 <_ZN21btCollisionDispatcherC1EP24btCollisionConfiguration>
   9a1a0:       209c            movs    r0, #156
   9a1a2:       f79b e962       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a1a6:       2100            movs    r1, #0
   9a1a8:       4682            mov     sl, r0
   9a1aa:       f79f fb55       bl      39858 <_ZN16btDbvtBroadphaseC1EP22btOverlappingPairCache>
   9a1ae:       2080            movs    r0, #128
   9a1b0:       f79b e95a       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a1b4:       4681            mov     r9, r0
   9a1b6:       f7ec fe2b       bl      86e10 <_ZN35btSequentialImpulseConstraintSolverC1Ev>
   9a1ba:       2088            movs    r0, #136
   9a1bc:       0040            lsls    r0, r0, #1
   9a1be:       f79b e954       blx     35468 <_ZdvRK9btVector3S1_-0x18>
   9a1c2:       1c31            adds    r1, r6, #0
   9a1c4:       1c04            adds    r4, r0, #0
   9a1c6:       4652            mov     r2, sl
   9a1c8:       464b            mov     r3, r9
   9a1ca:       9500            str     r5, [sp, #0]
   9a1cc:       f7f5 f98a       bl      8f4e4 <_ZN23btDiscreteDynamicsWorldC1EP12btDispatcherP21btBroadphaseInterfaceP18btConstraintSolverP24btCollisionConfiguration>
   9a1d0:       6823            ldr     r3, [r4, #0]
   9a1d2:       4aac            ldr     r2, [pc, #688]  (9a484 <Java_chiaki_test_cube_Cube_simulate+0x338>)
…略