移动apk逆向入门

一、apk格式简介

META-INF 签名文件,如果没有签名文件,可通过apk上上签工具生成签名文件
res 资源文件,包含不能打包进 resources.arsc 的一些资源文件,如图片、布局信息等
AndroidMainfest.xml 配置文件
classes.dex 代码块,包含了应用的整个代码逻辑
resources.arsc 应用资源文件。
移动apk逆向入门

二、apk逆向工具

Android Killer(需要jdk环境),可实现动态调试

(一)基本使用

1.修改smali代码后,编译,安装到模拟器
移动apk逆向入门
2.查看Java源码(只能查看)
移动apk逆向入门
3.字符串搜索
移动apk逆向入门
4.AndroidMainfest.xml
安卓系统从配置文件中读取包名,将包名作为程序的进程名
移动apk逆向入门

(二)smali语言

1.在一个文件内查找函数
.methon 函数开始
.end methon 函数结束
移动apk逆向入门
2.Smali语言基本类型映射表
移动apk逆向入门
3.查看工具自带提示

v代表本土寄存器,存储程序中间运算结果
p0寄存器代表this自身
p1等寄存器代表参数寄存器
移动apk逆向入门
移动apk逆向入门

三、逆向实例

移动apk逆向入门

1.搜索关键词“无效的用户名和密码”

开始时在字符串搜索框中搜索不到,于是利用工程搜索该字符串,在资源文件中找到,此程序采用了硬编码方式。
移动apk逆向入门移动apk逆向入门

2.通过资源文件中name值查找ID值

移动apk逆向入门

3.找到ID值,查看程序哪里进行了引用

移动apk逆向入门

4.搜索ID值,找到注册失败代码处

移动apk逆向入门

5.利用同样方法,查找注册成功代码处

移动apk逆向入门

6.点击咖啡杯,查看源码

发现代码有些异常,不完整,且多了$1,原因是使用了匿名内部类,而匿名内部类和原类类命名冲突,故多加了$1,此时,应找到他对应的原类。

匿名内部类咖啡杯解析
移动apk逆向入门
原类咖啡杯解析
移动apk逆向入门

7.在Java源码中查找关键代码,通过关键字查找

移动apk逆向入门

8.转为为10进制,因为咖啡杯中使用的就是10进制

移动apk逆向入门

9.发现对应Java中代码位置(咖啡杯的搜索不好用,有时搜索不到)

移动apk逆向入门

10.返回smali语言查看,发现有条件语句cond 0,在该函数中寻找cond 0

移动apk逆向入门

11.发现cond 0黄色高亮,此语句决定程序走向

移动apk逆向入门

12.处理方式:

1).通过修改代码逻辑(取反)

if-nez 修改为if-eqz
移动apk逆向入门

2)修改v0值

移动apk逆向入门

3)如果app无法修改业务逻辑(修改逻辑重新编译时报错,产生雪崩效应),则需要读懂程序算法。

读算法时,注意onClick(按钮点击)、getText(获取前端输入)等关键函数,也可定位关键代码。
研究程序代码,建议使用JEB(静态分析工具),Android Killer自带的咖啡杯对smali代码的Java翻译存在一定局限性。

题外话:
JEB使用技巧
Tab键查看Java源码
函数双击进入
右键,通过交叉引用查看函数被谁调用
移动apk逆向入门

接下来我们继续看JEB翻译的代码
发现程序中将经过一系列运算后的v5值和我们的输入作比较,如果相等,返回true,否则返回false
移动apk逆向入门

因此我们只要运行程序,看v5值即可,通过打印日志即可
由于刚才分析的代码在checkSN函数中,我们在源smali代码中查找
移动apk逆向入门
根据前述分析,我们需要查看v6的值
移动apk逆向入门
那么如何打印v6值呢?我们应该插入到v6最后一次出现的位置,因为v6寄存器有可能被多次赋值。
方式:
双击v6,出现高亮,代码往上找,找到最后一个move-result-object,结果被赋值的地方
移动apk逆向入门
移动apk逆向入门
重新编译代码,查看日志
移动apk逆向入门