内容简介:之前有写过一篇博客介绍了下java字节码的查看和分析其实除了分析java内部类、枚举等java语言的实现原理之外,在一些特定的场景也是比较有用的.这篇文章做个死,给大家讲解通过字节码去破解某些安卓应用的原理.
之前有写过一篇博客介绍了下 java 字节码的查看和分析
其实除了分析java内部类、枚举等java语言的实现原理之外,在一些特定的场景也是比较有用的.
这篇文章做个死,给大家讲解通过字节码去破解某些安卓应用的原理.
很多的单机游戏,甚至是一些网络游戏他们运行的时候逻辑运算都是放在本地的.服务端只是接收客户端上传的运算结果.还有一些收费应用,其实功能都在本地代码里面了,只不过是判断了下是否有付费,如果有付费才显示功能入口.
如果我们可以修改它的代码,将上传的结果或者是否付费的判断改成我们希望的,就可以为所欲为了.
反编译
要修改应用的代码逻辑,首先要先分析原来的代码逻辑是怎样的.
但由于应用的代码都是各家公司的私有财产,除非有人做大死泄露了出来,一般我们是拿不到的.所以这个时候我们就只能使用反编译技术了.
如果大家到网上搜索apk的反编译技术,大概率会搜到下面的方法:
- 使用apktool工具解压apk
- 使用dex2jar工具将安卓优化后的dex文件转换成java的class
- 使用jd-gui工具查看class里面的java代码
这么繁琐的操作其实已经过时了,我这边介绍个一键式傻瓜操作的 工具 给大家
jadx
jadx是个开源的安卓反编译工具,它的代码托管在 github 上,大家可以去 下载 来使用
用法很简单,下载之后解压,然后进入bin目录运行jadx-gui(linux/mac)或者jadx-gui.bat(windows),就可以启动一个可视化的界面了,然后点击”文件->打开”,并且选择我们想要反编译的应用,就能看到apk里面的代码了
我这里反编译了一个demo应用,它的MainActivity.onCreate里面判断了一个flag变量,然后弹出Toast.
我们安装这个apk运行起来可以看到弹出toast: “hello world!”
其他应用也是类似的,可以这样查看它们的代码.
不过正式发布的应用一般都会做混淆操作,这个时候我们反编译处理看到的代码的类名、方法名、变量名就都会变成a,b,c这样无意义的字符.
但是只是名字变了,执行逻辑是完全一样的,所以只要够细心,还是可以理清楚它的代码逻辑的.
jadx有个厉害的功能就是可以导出gradle工程,点击”文件->另存为Gradle项目”就可以导出gradle项目了,然后改下目录结构,就可以用Android studio去打开工程并且编辑修改代码了.
如果修改之后编译成功,那么我们的目的就达到了,可以为所欲为,但是这个项目大概率是不能编译成功的,有很多奇奇怪怪的错误.
修改应用的字节码
我们可以用jadx去很方便的分析代码逻辑,但是如果重新编译失败的话我们就只有走别的路子了.
这里介绍直接编辑字节码的方式.走这条路的话就没有什么傻瓜操作可以用了.还是老老实实一步步来吧
1. 解压apk
apk其实是一种zip压缩包,我们可以将它的后缀改成.zip,然后直接解压
我们将解压出来的东西都放到app-release-unsigned目录里面:
2. 将dex转换成jar
我们都知道安卓的虚拟机不是普通的java虚拟机,它不能直接运行java的class文件,需要优化成dex文件.
而我们修改字节码的时候就需要将它转换回来了,这里使用的就是 dex-tools工具 的dex2jar功能:
这里我只介绍 Linux 下命令的用法,就不介绍Windows上的使用了,其实是类似的使用.bat的版本,大家可以自行搜索.
将classes.dex转换成jar文件:
~/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh classes.dex
它会生成classes-dex2jar.jar文件:
3. 修改class字节码
其实jar文件也是一种zip压缩包,我们依然可以直接把后缀改成zip,然后解压:
然后找到MainActivity.class
这个时候我们就能用上篇文章说的javap命令去查看里面的代码了:
javap -c MainActivity
这里第16行的意思就是付过栈顶的两个变量不相等就跳到第32行代码,否则继续执行
16: if_icmpne 32
而我们可以看到,继续执行的话会输出hello world!,如果跳的32行的话就会输出hello java!
这里我们可以直接将if_icmpne改成if_icmpeq,在相等的时候跳到32行,否则继续执行,这样原来的”hello world!”提示就会变成”hello java!”了
如果直接用编辑器打开class文件,里面是一些二进制的值.
那我们要怎么修改呢?
这里我们会用到另外一个工具 jbe ,全称是java bytecode editor
下载了之后解压,进入bin目录使用下面命令打开图形界面:
java ee.ioc.cs.jbe.browser.BrowserApplication
在图形界面打开MainActivity.class,并且找到我们的MainActivity.onCreate代码:
然后点击Code Editor选项就可以对字节码进行修改了,这里我们将if_icmpne改成if_icmpeq,然后点击Save method:
这样我们的逻辑修改就完成了
4. 重新打包dex
接下来我们将重新打包apk,首先将class压缩成zip, 注意目录结构 :
然后将后缀改成jar,并且使用jar2dex生成dex:
~/dex-tools-2.1-SNAPSHOT/d2j-jar2dex.sh classes-dex2jar.jar
接着用生成的dex替换原来的classes.dex,然后删除所有刚刚生成的临时文件,如classes-dex2jar.zip和classes-dex2jar目录
5. 重新打包apk
接下来同样的压缩文件生成zip压缩包, 注意目录结构 :
最后将zip后缀改成apk,我们的apk就打包好了
重签名
由于我们重新打包的apk和原来不一致了,如果直接安装是会失败的,需要我们重新给它签名.
创建签名
可以用下面命令创建alias为android.keystore,文件名也是android.keystore的签名文件
keytool -genkeypair -alias android.keystore -keyalg RSA -validity 400 -keystore android.keystore
按下回车之后它会让你输入一些密码、开发者信息等,完成之后就能得到一个android.keystore文件
签名应用
然后我们使用得到的android.keystore去给应用重新签名:
jarsigner -keystore android.keystore -signedjar release.apk app-release-unsigned.apk android.keystore
得到签好名的release.apk
大功告成!
让我们安装进去运行看看,toast已经变成了”hello java!”:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 破解“不可能三角”,Fantom加速“杀手级”应用到来
- Frida应用基础及APP https证书验证破解
- H5 应用加固防破解:js 虚拟机保护方案浅谈
- 破解非完美信息场景应用,微软公布专业十段麻将AI技术细节
- RFID实战应用之常见射频卡扇区数据分析及破解
- 苹果企业开发者证书成漏洞:盗版商发布破解版iPhone应用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员面试宝典(第5版)
欧立奇、刘洋、段韬 / 电子工业出版社 / 2015-10 / 55.00
容提要 《程序员面试宝典(第5版)》是《程序员面试宝典》的第5 版,在保留第4 版的数据结构、面向对象、程序设计等主干的基础上,修正了前4 版近40 处错误,解释清楚一些读者提出的问题,并使用各大IT 公司及相关企业最新面试题(2014-2015)替换和补充原内容,以反映自第4 版以来两年多的时间内所发生的变化。 《程序员面试宝典(第5版)》取材于各大公司面试真题(笔试、口试、电话面试......一起来看看 《程序员面试宝典(第5版)》 这本书的介绍吧!
MD5 加密
MD5 加密工具
UNIX 时间戳转换
UNIX 时间戳转换