来谈一谈安卓应用的破解

之前有写过一篇博客介绍了下java字节码的查看和分析

其实除了分析java内部类、枚举等java语言的实现原理之外,在一些特定的场景也是比较有用的.

这篇文章做个死,给大家讲解通过字节码去破解某些安卓应用的原理.(现在一般都是通过修改smali去做的,但是其实基于字节码也是可以做到的,这篇文章基于之前的java字节码分析,所以只讲字节码的方式,smali的话大家可以自行搜索)

很多的单机游戏,甚至是一些网络游戏他们运行的时候逻辑运算都是放在本地的.服务端只是接收客户端上传的运算结果.还有一些收费应用,其实功能都在本地代码里面了,只不过是判断了下是否有付费,如果有付费才显示功能入口.

如果我们可以修改它的代码,将上传的结果或者是否付费的判断改成我们希望的,就可以为所欲为了.

反编译

要修改应用的代码逻辑,首先要先分析原来的代码逻辑是怎样的.

但由于应用的代码都是各家公司的私有财产,除非有人做大死泄露了出来,一般我们是拿不到的.所以这个时候我们就只能使用反编译技术了.

如果大家到网上搜索apk的反编译技术,大概率会搜到下面的方法:

  1. 使用apktool工具解压apk
  2. 使用dex2jar工具将安卓优化后的dex文件转换成java的class
  3. 使用jd-gui工具查看class里面的java代码

这么繁琐的操作其实已经过时了,我这边介绍个一键式傻瓜操作的工具给大家

jadx

jadx是个开源的安卓反编译工具,它的代码托管在github上,大家可以去下载来使用

用法很简单,下载之后解压,然后进入bin目录运行jadx-gui(linux/mac)或者jadx-gui.bat(windows),就可以启动一个可视化的界面了,然后点击"文件->打开",并且选择我们想要反编译的应用,就能看到apk里面的代码了

1.png
2.png

我这里反编译了一个demo应用,它的MainActivity.onCreate里面判断了一个flag变量,然后弹出Toast.

我们安装这个apk运行起来可以看到弹出toast: "hello world!"

0.png

其他应用也是类似的,可以这样查看它们的代码.

不过正式发布的应用一般都会做混淆操作,这个时候我们反编译处理看到的代码的类名、方法名、变量名就都会变成a,b,c这样无意义的字符.

但是只是名字变了,执行逻辑是完全一样的,所以只要够细心,还是可以理清楚它的代码逻辑的.

jadx有个厉害的功能就是可以导出gradle工程,点击"文件->另存为Gradle项目"就可以导出gradle项目了,然后改下目录结构,就可以用Android studio去打开工程并且编辑修改代码了.

如果修改之后编译成功,那么我们的目的就达到了,可以为所欲为,但是这个项目大概率是不能编译成功的,有很多奇奇怪怪的错误.

接下来我就带大家一步步破解这个apk,修改它的逻辑,不弹"hello world!"而是弹"hello java".

修改应用的字节码

我们可以用jadx去很方便的分析代码逻辑,但是如果重新编译失败的话我们就只有走别的路子了.

这里介绍直接编辑字节码的方式.走这条路的话就没有什么傻瓜操作可以用了.还是老老实实一步步来吧

1. 解压apk

apk其实是一种zip压缩包,我们可以将它的后缀改成.zip,然后直接解压

3.png

我们将解压出来的东西都放到app-release-unsigned目录里面:

4.png

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文件:

5.png

3. 修改class字节码

其实jar文件也是一种zip压缩包,我们依然可以直接把后缀改成zip,然后解压:

6.png

然后找到MainActivity.class

7.png

这个时候我们就能用上篇文章说的javap命令去查看里面的代码了:

javap -c MainActivity

8.png

这里第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

9.png

在图形界面打开MainActivity.class,并且找到我们的MainActivity.onCreate代码:

10.png

然后点击Code Editor选项就可以对字节码进行修改了,这里我们将if_icmpne改成if_icmpeq,然后点击Save method:

11.png

这样我们的逻辑修改就完成了

4. 重新打包dex

接下来我们将重新打包apk,首先将class压缩成zip,注意目录结构:

12.png

然后将后缀改成jar,并且使用jar2dex生成dex:

~/dex-tools-2.1-SNAPSHOT/d2j-jar2dex.sh classes-dex2jar.jar

接着用生成的dex替换原来的classes.dex,然后删除所有刚刚生成的临时文件,如classes-dex2jar.zip和classes-dex2jar目录

13.png

5.删除签名信息

一般我们拿到的应用都是签名过的应用,应用签名之后会将资源和代码的校验信息保存到apk里,如果我们修改了dex文件,就会导致校验失败,这样的话apk是不能安装的。

所以我们需要把原来的签名删掉,具体做法就是删除META-INF目录里面的三个文件:

CERT.RSA
CERT.SF
MANIFEST.MF

6. 重新打包apk

接下来同样的压缩文件生成zip压缩包,注意目录结构:

14.png

最后将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!":

16.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容