移动apk逆向入门

  • 一、apk格式简介
  • 二、apk逆向工具
  • (一)基本使用
  • (二)smali语言
  • 三、逆向实例
  • 1.搜索关键词“无效的用户名和密码”
  • 2.通过资源文件中name值查找ID值
  • 3.找到ID值,查看程序哪里进行了引用
  • 4.搜索ID值,找到注册失败代码处
  • 5.利用同样方法,查找注册成功代码处
  • 6.点击咖啡杯,查看源码
  • 7.在Java源码中查找关键代码,通过关键字查找
  • 8.转为为10进制,因为咖啡杯中使用的就是10进制
  • 9.发现对应Java中代码位置(咖啡杯的搜索不好用,有时搜索不到)
  • 10.返回smali语言查看,发现有条件语句cond 0,在该函数中寻找cond 0
  • 11.发现cond 0黄色高亮,此语句决定程序走向
  • 12.处理方式:
  • 1).通过修改代码逻辑(取反)
  • 2)修改v0值
  • 3)如果app无法修改业务逻辑(修改逻辑重新编译时报错,产生雪崩效应),则需要读懂程序算法。


一、apk格式简介

META-INF 签名文件,如果没有签名文件,可通过apk上上签工具生成签名文件

res 资源文件,包含不能打包进 resources.arsc 的一些资源文件,如图片、布局信息等

AndroidMainfest.xml 配置文件

classes.dex 代码块,包含了应用的整个代码逻辑

resources.arsc 应用资源文件。

android移动应用怎么运行_搜索

二、apk逆向工具

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

(一)基本使用

1.修改smali代码后,编译,安装到模拟器

android移动应用怎么运行_android移动应用怎么运行_02


2.查看Java源码(只能查看)

android移动应用怎么运行_android移动应用怎么运行_03


3.字符串搜索

android移动应用怎么运行_安全_04


4.AndroidMainfest.xml

安卓系统从配置文件中读取包名,将包名作为程序的进程名

android移动应用怎么运行_搜索_05

(二)smali语言

1.在一个文件内查找函数

.methon 函数开始

.end methon 函数结束

android移动应用怎么运行_android移动应用怎么运行_06


2.Smali语言基本类型映射表

android移动应用怎么运行_Java_07


3.查看工具自带提示v代表本土寄存器,存储程序中间运算结果

p0寄存器代表this自身

p1等寄存器代表参数寄存器

android移动应用怎么运行_android移动应用怎么运行_08


android移动应用怎么运行_搜索_09

三、逆向实例

android移动应用怎么运行_安全_10

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

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

android移动应用怎么运行_android移动应用怎么运行_11

android移动应用怎么运行_android移动应用怎么运行_12

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

android移动应用怎么运行_安全_13

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

android移动应用怎么运行_搜索_14

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

android移动应用怎么运行_Java_15

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

android移动应用怎么运行_Java_16

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

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

匿名内部类咖啡杯解析

android移动应用怎么运行_安全_17


原类咖啡杯解析

android移动应用怎么运行_安全_18

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

android移动应用怎么运行_Java_19

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

android移动应用怎么运行_搜索_20

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

android移动应用怎么运行_搜索_21

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

android移动应用怎么运行_android移动应用怎么运行_22

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

android移动应用怎么运行_资源文件_23

12.处理方式:

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

if-nez 修改为if-eqz

android移动应用怎么运行_搜索_24

2)修改v0值

android移动应用怎么运行_搜索_25

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

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

题外话:

JEB使用技巧

Tab键查看Java源码

函数双击进入

右键,通过交叉引用查看函数被谁调用

android移动应用怎么运行_Java_26

接下来我们继续看JEB翻译的代码

发现程序中将经过一系列运算后的v5值和我们的输入作比较,如果相等,返回true,否则返回false

android移动应用怎么运行_android移动应用怎么运行_27

因此我们只要运行程序,看v5值即可,通过打印日志即可

由于刚才分析的代码在checkSN函数中,我们在源smali代码中查找

android移动应用怎么运行_Java_28


根据前述分析,我们需要查看v6的值

android移动应用怎么运行_资源文件_29


那么如何打印v6值呢?我们应该插入到v6最后一次出现的位置,因为v6寄存器有可能被多次赋值。

方式:

双击v6,出现高亮,代码往上找,找到最后一个move-result-object,结果被赋值的地方

android移动应用怎么运行_android移动应用怎么运行_30


android移动应用怎么运行_android移动应用怎么运行_31


重新编译代码,查看日志

android移动应用怎么运行_资源文件_32