Apk破解方案
一、准备工作
a) 安装jdk:用于创建数字证书与签名
b) apktool工具:反编译apk文件,得到资源文件、配置文件、smali文件、dex文件
c) dex2jar工具:将dex文件转换成jar文件
d) Jd-jui工具:查看jar文件源码
e) 配置环境变量,不配置也可以,不过操作麻烦(不配置环境变量的话,使用每个命令/工具要到命令的当前文件夹才能执行),你懂得……
f) 下载地址:
i. 官方下载:
1. Jdk:
http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe
2. Apktool:http://code.google.com/p/android-apktool/
3. Dex2jar:http://code.google.com/p/dex2jar/
4. Jd-jui:http://java.decompiler.free.fr/?q=jdgui
ii. 我使用的:http://download.csdn.net/download/wangfayinn/4836532
二、反编译
a) apktool d iapk.apk iapkFile(可选,默认在当前目录下)
i. 执行此操作后,会在iapkFile文件夹下得到一个iapk文件夹,默认是在当前目录下
ii. Apktool d -s xx.apk
1. 可以获取dex文件,但是没有出现smali文件
三、修改
a) 根据需求修改iapk文件夹下内容
i. 修改res资源
ii. 修改manifest配置文件
1. 案例如:http://tieba.baidu.com/p/1272897204
iii. 修改smali汇编代码
1. smali文件其实就是dalvik虚拟机运行的dex字节码对应的汇编文件,更多介绍请看:http://code.google.com/p/smali/
2. 案例如:http://blog.csdn.net/cloudwu007/article/details/6851800
四、重新打包签名
a) 编译打包
i. apktool b IAPK
ii. 这时会在IAPK文件夹下生成两个文件夹:build(存放中间文件)、dist(存放打包生成的apk文件)
iii. 注意:此时dist文件夹下的iapk.apk文件还没有签名,所以无法安装运行。
b) 使用jdk提供的kyetool与jarsigner签名
i. 准备签名文件(数字证书)
1. keytool -genkey -alias tony.wang.keystore -keyalg RSA -validity 20000 -keystore tony.wang.keystore
2. 参数说明:alias:别名 keyalg:算法 validity:有效期 keystore:密钥库名称
详细使用说明请参看:http://blog.csdn.net/Mr_Von/article/details/3089839
ii. 签名:
1. jarsigner -verbose -keystore tony.wang.keystore -signedjar newiapk.apk iapk.apk tony.wang.keystore
2. 参数说明:
[-keystore <url>] 密钥库位置
[-storepass <口令>] 用于密钥库完整性的口令
[-storetype <类型>] 密钥库类型
[-keypass <口令>] 专用密钥的口令(如果不同)
[-sigfile <文件>] .SF/.DSA 文件的名称
[-signedjar <文件>] 已签名的 JAR 文件的名称
[-digestalg <算法>] 摘要算法的名称
[-sigalg <算法>] 签名算法的名称
[-verify] 验证已签名的 JAR 文件
[-verbose] 签名/验证时输出详细信息
[-certs] 输出详细信息和验证时显示证书
[-tsa <url>] 时间戳机构的位置
[-tsacert <别名>] 时间戳机构的公共密钥证书
[-altsigner <类>] 替代的签名机制的类名
[-altsignerpath <路径列表>] 替代的签名机制的位置
[-internalsf] 在签名块内包含 .SF 文件
[-sectionsonly] 不计算整个清单的散列
[-protected] 密钥库已保护验证路径
[-providerName <名称>] 提供者名称
[-providerClass <类> 加密服务提供者的名称
[-providerArg <参数>]] ... 主类文件和构造函数参数
五、反破解
a) 第一种办法:将核心代码用JNI写进so库中。由于so库的反编译和破解的难度加大,所以这种方式防止反编译效果不错。缺点是,对于Java层的代码没有保护作用,同样可以被篡改。
b) 第二种办法:在线签名比较。在程序初始化时,联网将运行的程序的签名与服务器上的官方标准签名进行比较,从而达到让反编译后的程序无法正常运行的效果。缺点是,如果此部分联网检验的代码被篡改跳过,则整套机制失效。
c) 第三种办法:代码混淆。为了加大反编译后代码分析的难度,对代码进行混淆。缺点是,治标不治本,同样可以修改(甚至据说还有反混淆工具,没用过,不多做评论)。
d) 声明:反破解技术均摘自网上,另外请参看我转载的另外四篇反破解博客
六、参考文章:
a) http://blog.csdn.net/cloudwu007/article/details/6851800
b) http://www.cnblogs.com/lovelili/archive/2011/10/19/2217259.html
c) http://tieba.baidu.com/p/1272897204
d) http://www.cnblogs.com/wangvsa/archive/2012/10/09/2717089.html
声明:本技术文件旨在技术交流,请勿用于商业违法活动。