Android反编译从零到一

640?wx_fmt=png


今日科技快讯


7月15日消息,谷歌本周将面临一项创纪录的欧盟罚款,这一罚款源于谷歌借助自己的安卓智能手机系统保护自己搜索引擎的垄断行为。这一罚款决定很可能在周二或者周三公布,这一次的罚款很可能超过谷歌去年缴纳的滥用垄断的21亿英镑罚款。去年谷歌由于在网络购物领域的垄断和导致硅谷与布鲁塞尔之间的战争升级而遭到欧盟处罚。


作者简介


新的一周又开始了。本篇来自 OpenDreamer 的投稿,分享了反编译的相关知识,一起来看看!希望大家喜欢。

OpenDreamer 的博客地址:

https://www.jianshu.com/u/ec7d4b8dd871


前言


反编译与防反编译的0到1系列第一篇。该篇目的是让读者了解反编译的基本过程,可以完全没有基础,也不用了解smali语法。文章里面demo提供所有 需要使用的apk以及相应的修改代码。只需傻瓜式的模仿就能够学会。

反编译与防反编译的0到1系列主要用于增加反编译技术栈,避免一些低级的错误让软件被有心者破解。因此后续还会有smali语法的介绍和smali的修改。 在.so文件中添加签名验证。项目地址如下所示:

https://github.com/onlybeyond/crack


正文


工具

工具说明:工具存放在tools文件夹下,这里仅提供Mac版,其他版本可以根据网址下载

  • ApkTool

下载地址

https://ibotpeaches.github.io/Apktool/

集成:appt、apktool、apktool.jar,这三个文件拷贝到/usr/local/bin,升级的时候只需替换jar包

功能

  • 获取apk资源文件、AndroidManifest.xml文件、smali文件 apktool d xxx/xxx/crack.apk(生成文件在命令当前位置)

  • 重新打包 apktool b xxx/xxx/crack -o new_crack.apk

可能存在问题

Exception in thread "mainbrut.androlib.AndrolibExceptionCould not decode arsc file
at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:56)
at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:491)
at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:74)
at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:66)
at brut.androlib.Androlib.getResTable(Androlib.java:50)
at brut.androlib.ApkDecoder.getResTable(ApkDecoder.java:189)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:114)
at brut.apktool.Main.cmdDecode(Main.java:146)
at brut.apktool.Main.main(Main.java:77)

解决方案:https://ibotpeaches.github.io/Apktool/ 下载最新jar包替换即可。

  • DexToJar

下载地址

https://sourceforge.net/projects/dex2jar/

功能

dex转jar。使用 mac,将d2j-dex2jar.sh 托人命令行 将反编译apk拖入命令行

/Users/xxx/Desktop/xxx/xxx/d2j-dex2jar.sh /Users/xxx/Desktop/xxx/crack.apk

  • JD-GUId

下载地址

http://jd.benow.ca/

功能

读取jar文件

界面工具

下载地址

https://github.com/Jermic/Android-Crack-Tool

反编译思路

  • dexToJar 获取jar包

  • 使用JD-GUI分析代码,定位位置

  • 修改变量的值,或方法返回后重置返回值

  • 重新打包,签名,安装

如何加大破解难度

  • 加固

  • 混淆

  • 尽量别在代码中直接写中文,这样相当于完全暴露意图,尽量放在String.xml文件中

  • 在.so文件中验证签名

第一个demo

功能

修改打印工具类,实现输出打印日志

影响

日志完全暴露。

建议

敏感性的日志尽量使用完就删除,一旦工具类被修改,日志也会完全暴露

具体复现

使用该demo

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

这里简单的写了一个日志工具类,很可能和大家使用的不一样,但大多数日志都有一个开关逻辑。用这个开关去控制所有日志是否打印。

使用DexToJar 获取jar包(参照工具中获取jar的方法),然后分析

640?wx_fmt=jpeg

640?wx_fmt=jpeg

这里的中文可以说为定位文件起来不小作用,我们只用去找a类中的a方法。使用ApkTool反编译apk(参照工具中的方法),然后修改

640?wx_fmt=jpeg

Log.d 能很轻松的定位修改位置。

if-eqz v0, :cond_0  #这句话的含义如果v0==0执行cond_0分支,执行cond_0分支就方法就结束了所以把v0值修改即可

640?wx_fmt=jpeg

“#“ 代表注释返回值赋值给v0 注释掉,重新给v0赋值

重新打包(参考工具)

签名(签名工具在assets中,key也准备好了,密钥就在项目里,自己找吧

安装打印

640?wx_fmt=jpeg

如果日志是这样的,那恭喜你,你成功了。

第二个demo

插入一个开始页

影响

app 可能被插入广告

建议

进行签名校验

步骤

生成demo_two.apk和demo_two_2.apk

640?wx_fmt=jpeg

运行得到demo_two.apk,将assets的demo_two文件已经写好Activity和布局文件,添加到相应位置运行得到demo_two_2.apk         也可以直接使用文件夹中两个apk

反编译demo_two.apk

命令:apktool d demo_two.apk(文件真实路径)

反编译demo_two_2.apk

命令:apktool d demo_two_2.apk(文件真实路径)

合并smali文件

640?wx_fmt=jpeg

demo_two_2.apk反编译smali文件夹中的a.smali(TimerTask的匿名内部类产品)和InsertActivity.smali拷贝到demo_two.apk反编译的文件中。

修改AndroidManifest.xml文件

640?wx_fmt=jpeg

去掉默认的启动标志,添加新的启动Activity

修改资源id

640?wx_fmt=jpeg

布局文件id可能在public.xml(res/values中)也有可能在R$layout.smali文件中(smail文件夹下)有可能是不同编译器版本造成的,

不在本篇讨论范围。layout id 最大的是0x7f04002e,在它的基础上加1即可(注意采用的是16进制)

640?wx_fmt=jpeg

过程中有可能遇到上面的错误,上面原因很明显id重复,说明新加的id不对。

修改smail文件的id

640?wx_fmt=jpeg

找到setContentView()可以快速定位,将id替换成步骤3.6中添加的id

重新打包

命令:apktool b demo_two(文件真实路径) -o demo_two_new.apk   

签名安装

如果先显示“这是一个注入的页面”恭喜你成功了。如果没见到这个页面可以反编译demo_two_crack.apk查看一下原因。


欢迎长按下图 -> 识别图中二维码

或者 扫一扫 关注我的公众号

640.png?

640?wx_fmt=jpeg

猜你喜欢

转载自blog.csdn.net/c10wtiybq1ye3/article/details/81059232
今日推荐