工具下载链接:
JEB反编译:JEB Decompiler by PNF Software 官方版本,官方demo版功能会受限,需要使用pro版,但是需要money,所以想办法整吧。
切记,jeb在中文目录下不能正常启动,会报错,如下:
Visual Studio Code:Visual Studio Code - Code Editing. Redefined
测试软件:UNcrackable-Level1.apk:https://github.com/OWASP/owasp-mstg
路径:
签名软件:apk签名工具(dodo APKSign)下载_apk签名工具(dodo APKSign)官方下载-太平洋下载中心
还需要下载模拟器
打包好的软件:复制本段内容,打开「阿里云盘」APP ,链接:https://www.aliyundrive.com/s/BGYGmU2KdeT
0x01 模拟器安装软件
在模拟中安装Uncrackable1.apk,然后打开。
提示该应用不能在root环境下运行,点击ok后退出,说明应用会检测当前环境是否是root权限。那么如何绕过root检测。
0x02 Jeb反编译分析软件代码
-
将Uncrackable1.apk使用JEB打开,然后进行分析。
可以直接将Uncrackable1.apk拖到jeb_wincon.bat上就可以打开软件进行反编译等操作,也可以双击jeb_wincon.bat,然后打开jeb软件,再打开Uncrackable1.apk进行相关操作。
tips:
Disassembly:反汇编
2. 我们先查看androidmainfest.xml文件,寻找程序的入口,即首页,这里是Mainfest文件,双击Mainfest文件打开,可以看到,这里程序的入口是MainActivity
3. 然后打开MainActivity,打开后是反汇编界面,按下TEB键,会进行反编译操作。
4. 结合进入软件时的界面与代码进行分析,可以看到代码进行了root检测。分别调用了a(),b(),c()函数,只要有一个检测成功,就会提示“Root detected”。(||表示或)
5. 我们双击a()函数,进行跟踪,看到a(),b(),c()三个函数的内容。
解读:
a(): 获取环境变量然后进行分隔,将获取的环境变量获取出来进行拼接,检查是否有su存在。root下,环境变量有su存在。
b(): 检测TAGS里面是否有test-keys.在安卓中。做开发调试的时候,是可以把root烧进去的,而release版本的时候通常会把root删掉。检测是否是在模拟器中运行或者开发人员自己build的模拟器,自己build的通常会带test-keys。
c():检测一些常见的文件路径是否存在。
然后双击b.a(this.getxxxxxx)中的a
a(Context arg0):检查flag是否是2,具体原因不清楚。
0x03 解包修改软件
-
通过分析代码,我们可以将检测代码删除从而绕过root检测
先使用apktool对Uncrackable1.apk进行反编译,命令:
java -jar apktool.jar d Uncrackable1.apk
-
然后使用 visual studio code打开反编译后的文件夹,然后对代码进行篡改。刚才在Jeb中看到MainActivity中有三个函数,将三个函数删除,以达到绕过的目的。
双击打开smali——uncrackable1——MainActivity.smali
通过与jeb中的代码对比,找出需要删除的部分:
删除后效果
-
然后使用apktool重新build包,命令:
java -jar apktool.jar b UnCrackable-Level1
然后会在 UnCrackable-Level1——dist目录下生成新的apk
0x04 软件签名
1. 对app包进行签名,APK文件不签名是无法进行安装的。
打开Dodo APKsign,选择需要制作签名的apk以及签名文件保存的目录,然后制作签名。
2. 制作成功后,卸载原app然后安转篡改后的app,成功绕过root检测。
0x06 总结
第一次做逆向分析,总的来说不是很难,在搜集软件上花费了很多时间,尤其是jeb,换了好几个版本才行,这个过程中发现demo版本代码反编译不全,故只能使用pro版本。
小白路过,大神勿喷,欢迎斧正。