Android反编译和代码安全
?
反编译工具
经过一轮的Google,找到了不少方法,当然有其中闻波老师提到的apktool,但是反编译出来的结果,只是一行一行的Java指令,如果Java不是很熟悉的话(like me),没办法看呀。
反复折腾,终于找到了强大的组合dex2jar+jdgui。
详细可以看 ?http://lytsing.org/wiki/android/decompile.html
三步教你apk反编译
0.准备java环境和反编译工具(dex2jar, jd-gui),下载你准备反编译的apk文件;
1.用解压缩软件打开apk文件,把里面的文件解压到一个目录;
2.运行dex2jar进行反编译;把classes.dex复制到与dex2jar相同的目录,在cmd下运行dex2jar classes.dex;其实用apktool反编译就行了,前面的工具编译后xml文件不能查看
3.打开jd-gui,把反编译出来的jar拖进去就可以看到java源代码了。
声明:反编译仅供学习之用,请勿作恶。
?
除了这个,还有layout目录下的二进制xml文件,可以使用AXMLPrinter工具将其转换为可读的xml文件,工具下载地址:http://code.google.com/p/android4me/downloads/list, 使用很简单:
java -jar AXMLPrinter2.jar AndroidManifest.xml AndroidManifest2.xml
很多xml一个个转化很麻烦,这样的工作,当然是用shell完成了。
$ cd res
$
for file in */*.xml; do java -jar AXMLPrinter2.jar $file > temp; echo $file; mv temp $file -f; done
如何防止自己的apk被反编译
当然是代码加密或者代码混淆了。
相应的工具有:ant, proguard
方法各式各样,这个要发挥自己的想象力和创造力了。
附上:
android应用开发杂谈
原文 http://blog.rebill.info/archives/techparty-back-talk-about-the-android-code-security.html
?
?
?
附:我的做法是用apktool反编译,附件中有上面链接博客封装的apktool反编译软件,用jd-gui浏览jar文件
?
目前反编译classes.dex比较好的另一个工具是 Dedexer,可以下载已经编译好的jar文件ddx1.11.jar.
mkdir src java -jar ddx1.11.jar --helpjava -jar ddx1.11.jar -o -D -r -d src classes.dex
然后在src目录下,又生成一坨东西。
注意: ddx1.11.jar 对应java 1.6版本,我用 1.5.0_18,就会遇到
[deli@athena tools-common]$ java -jar ddx1.11.jar Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
也可以下载源代码自行编译。
进入 src/com/himsn 目录
[deli@athena himsn]$ grep -i 7F080000 *
R$string.ddx:.field public static final app_name I = 2131230720 ; 0x7f080000
好家伙,回前面提到的 @7F080000,原来在 R$string。其他xml文件出现神秘的字符,grep 一下,就出来了。 xml还有其他神秘数字, 比如
<ImageView> android:scaleType="3"
这个3是啥意思? 开始我是用最原始的方式,我深信,一切尽在ApiDemos中,结果在ApiDemos的反编译文件里grep,一般80%都可以找到,然后跟源代码对比,就出来了。
android:scaleType="3" 就是android:scaleType="fitCenter" 类似的
| android:scaleType="7"| android:scaleType="centerInside"
android:scaleType="6"android:scaleType="centerCrop"android:ellipsize="4"android:ellipsize="marquee"android:ellipsize="3"android:ellipsize="end"后面发现用eclipse打开xml layout文件,在属性选项里,点击,在下拉菜单,都有相应的数字,从0开始,那么就好办多了。
还有一些情况,比如
android:textColor="?android:01010036" android:textColor="?android:01010212"
这个比较好办,看到有android字样,就知道是系统定义的常量,在android sdk Reference android.R.xxx 页面搜索01010036,找到:
"?android:01010036" 对应 "?android:attr/textColorSecondary" "?android:01010212" 对应 "?android:attr/textColorTertiary"
?
原文:http://hi.baidu.com/zhizhesky/blog/item/1b77fc03eb599afc09fa93ea.html
另一篇:http://morry.iteye.com/blog/776718