发一下牢骚和主题无关:
缘由:该游戏作者有点可爱,原来就是拿别人的游戏,还在游戏中参加积分的轨制,打到20层后,需要积分。看不惯,就把它破解了,打到20层后,直接跳过要积分进程。
本文不提供破解后的安装包!
进程:
首先下载目标apk,我是从这里下载的:http://www.wandoujia.com/apps/com.ss.magicTower
然后下载工具,apktool+jd-gui+dex2jar+android sdk+jdk/jre
部份链接如下:
apktool(把apk文件反编译成dalvik旁边码,smali):https://code.google.com/p/android-apktool/
jd-gui(查看jar源码文件):http://java.decompiler.free.fr/?q=jdgui
dex2jar(把dex转换成jar):https://code.google.com/p/dex2jar/
基本原理:首先把apk文件解压缩,然后提取其中的.dex文件,用dex2jar把dex文件转成jar文件,这样就能够用jd-gui打开jar文件,查看具体的java源码了。然后定位要修改的地方,再用apktool把apk文件转换成dalvik的旁边码,定位到之前要修改的位置,然后修改保存,再用apktool从新打包成apk文件。最后一步,用jarsigner给前面生成的apk文件签名,这样就能够把咱从新制造的apk安装到android系统上了。
具体进程:
解压apk文件,可以用rar或者7zip,都行。
转换成jar:dex2jar.bat classes.dex
这一步后,就会在当前目录下生成一个classes_dex2jar.jar文件。
用jd-gui打开,并定位,这个不详讲。
(一般的程序都会用proguard来进行代码混杂,所以你这里看到的都是一些稀奇古怪的变量名,类名和方法名,这对定位会造成影响。但是花点时光,还是能够找出来的。proguard现在已默认加到了android sdk里,在sdk/tools/proguard里,官网是http://proguard.sourceforge.net。在程序开发中,如果你希望用proguard来混杂自己的代码,只需在default.properties里添加一句"proguardproguard.config=proguard.cfg",就能够启用proguard)
apktool反编译:apktool.bat d mota50.apk mota50
命令完成后,会生成一个mota50的文件夹,定位到smali\com\ss\magicTower\k.smali文件,用文本编辑器打开它。然后修改相应的位置。我这里就是修改了判断条件那个地方,把if(a.h>180)改成if(a.h>-180),这样就永真了,所以就跳过验证了。
风,渐渐吹起,吹乱了我的发丝,也让我的长裙有些飘动。绿叶仿佛在风中起舞,离开了树,投向了大地,却不知这样会枯萎,我弯下腰,轻轻拾起一片树叶,那非常有序的茎脉,是一种美的点缀。我有些哀叹:绿叶啊,绿叶,你这般美丽地从树上轻轻飘下,随风起舞,却不知已被人称之为落叶!
(android用的是dalvik VM的旁边码,与pc端的java旁边码不同,smali文件就是dalvik的旁边码,你可以理解为汇编语言,具体关于dalvik旁边码定义,可以看这里http://source.android.com/tech/dalvik/dalvik-bytecode.html)
修改完以后,需要从新打包成apk文件:
apktool.bat b mota50(这个命令,会在mota50文件夹中生成build和dist,两个文件夹,apk文件存放在dist)
你也可以用这个命令:apktool.bak b -f mota50 newmota.apk
这个命令会在当前目录生成一个apk文件。
这样生成的apk文件并不带签名,而在android中,不带签名的文件,是无法安装的。所以我们需要给它从新添加签名。
签名需要密钥,可是我们手上没有,需要自己生成一个,命令如下:
keytool -genkey -v -keystore magic.keystore -alias magic.keystore -keyalg RSA -keysize 2048 -validity 10000
具体参数含义,请看这里https://developer.android.com/tools/publishing/app-signing.html
注意:-keystore和-alias参数后面跟的名字一定要一样,否则后面用这个密钥去签名apk的时候,会提示找不到证书链!
这个命令完成后,会在当前目录生成一个magic.keystore密钥文件
有了密钥,我们就能够通过上面的命令,给apk进行签名:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore magic.keystore -signedjar mota50_signed.apk newmota50.apk magic.keystore
这个命令就是用magic.keystore密钥给newmota50.apk签名,并生成一个mota50_signed.apk的文件,这就是终究的文件了。
注意:由于在jdk7中,默认的签名算法已改变了,所以你必须自己指定签名算法(-sigalg)和摘要算法(-digestalg)。否则签名无效,无法安装。
所以以前用的相似命令:jarsigner -verbose -keystore magic.keystore -signedjar mota50_signed.apk newmota50.apk magic.keystore虽然能够成功签名,但是无法安装。
当然,上面分析的是手动签名。你也可以通过eclipse,或者其他的IDE来进行签名,网上也有一个 auto_signed图形工具来签名。这里就不在复述。
安装的时候,你可以安装在android emulator里,或者真机里:
adb install mota50_signed.apk
总结:该文只是分析了端的破译的流程,对于真正症结的部份(修改smali文件),并没有做过多的分析,其实android下的smali文件跟平常碰到的汇编代码是一样的,只不过指令集不一样,名字不一样而已。如果之前干过c/c++逆向的话,是很容易上手的。
文章结束给大家分享下程序员的一些笑话语录: 腾讯的动作好快,2010年3月5日19时28分58秒,QQ同时在线人数1亿!刚刚看到编辑发布的文章,相差才2分钟,然后连专题页面都做出来了,他们早就预料到了吧?(其实,每人赠送10Q币,轻轻松松上两亿!)
--------------------------------- 原创文章 By
文件和签名
---------------------------------