麗ちゃん10歩!
最近の麗ちゃん、
・10歩歩けるようになりました。
・麗ちゃんをフルネームで呼ぶと、「あーい」とおててあげてお返事します。
・携帯電話を操作して、背景画像やデスクトップアイコンを変えたり、暗証番号による操作ロックをかけたり、運転マナーモードにしたり…と、ばあちゃまの携帯電話を元に戻すのに一苦労しました。
・知らない間に固定電話でよそのおうちにかけちゃったりします。(ごめんなさい)
・口紅で落書きが大好きです。
・なんでもかんでもゴミ箱にIN!知らない間に大事なものもゴミと一緒に出してしまいました。。
・くしで髪をとかしてキレイキレイします。
・携帯電話持ってもしもしします。
・お風呂掃除や絨毯のコロコロお掃除の真似をします
・PS3の電源ボタンやコントローラ、テレビのリモコンを触って、画面が変化するのを楽しみます。
・パソコンをたたいたり、マウスの抜き差しして遊びます。
・お家の階段を手足を使って登ろうとします。
・麺棒をバラバラに出して、足の指でつまんだり、箱にしまうマネができます。
・やりたいことを阻まれると、強情に叫び倒します。
いーっぱいできるようになったね♪
「○○麗ちゃん。」「はーい」
リバースエンジニアリング検証
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>) …略
dalvikVM
こちらを参考にコンカレントGCの中を覗いてみました。
http://www.slideshare.net/akachochin/dalvikvm?from=download_email_for_pro&show_download_info=true#favsGroupsEvents
JITとhprofのON/OFF、シグナルのハンドリングとダンプについて、こちらが参考になりました。
http://blog.kmckk.com/archives/3076212.html
http://blog.kmckk.com/archives/3456418.html#more
http://java.dzone.com/articles/viewing-hprof-android