基础

如何判断apk文件是32还是64:

ARM 32位对应的是armv7架构、armv6架构、armv5架构

ARM 64位是armv8架构

常用的abi:

armeabi: armv5架构和armv6架构 (32位)

armeabi-v7a:armv7架构 (32位)xxx

armeabi-v8a:armv8架构 (64位)

x86:x86架构 (32位)

x86_64:x86_64架构 (64位)

签名:

签名的算法一般用消息摘要算法(不可逆)

md5、、、

签名的源数据一半来自于数据包

签名之前对源数据进行排序,头尾可能会有固定字符串

常用方法与流程

1.一般会先抓包,分析参数名,查看待会逆向分析需要找哪些字段

2.抓包细节:清除缓存、cookie等

3.DevicesId的处理细节:找出关键请求

4.常规手段:

静态分析:搜索链接、参数、算法关键字

Log输出 DDMS 用处:一打开APP就加密了的数据 (也可用hook)

JEB动态调试

通过解密获取参数

APP资源ID

通过定位加密函数解决问题

零散

看到StringBuilder要找toString:输出的地方

log输出、匿名管道、smali插桩

smali插桩:大概就是调试代码,插入代码,打印出想看到的东西

1
2
3
4
5
6
7
8
9
10
11
输出byte

invoke-static {vx}, Lcrack;->convertByteArrayToString([B])Ljava/lang/String;

输出string

invoke-static {vx}, Lcrack;->log(Ljava/lang/String;)V

输出tag

==Debug-Info==

最主要的是理清它的加密思路,适当记录

做算法逆向分析的时候,要结合流量包来看是否可逆验证

**Hook:**顾名思义,就是“钩子”,也称作“钩子技术”,其原理是先将需要修改的函数“钩住”,然后使用自定义的函数替换原函数,让程序在运行时执行自定义函数,从而达到动态修改软件的目的。

拿到一个加密的,也可以先自己试试是否是MD5等

多抓两个同样的包,对比一下加密后的字段,哪些在改变,哪些没变

然后判断算法:比如分组算法分为对称和非对称

app中的加密方式一般都是相通的,不一定要找登录的,如果登录的太困难,也可以从注册下手分析。

动态调试对比静态分析的好处在于:当一个加密字段由多个参数构成时,jeb动态调试可以直接看到用了哪些参数,然后再回去静态分析

jeb分析时,回溯到类时,要注意是否是重载函数,确定好参数对应的个数

算法分析

xx镇江静态分析与log输出案例

xx15圈静态分析案例

案例4:xx合伙人.apk

搜链接:/App/Login/login
搜参数:”apisign”

这个app搜的话,只能搜到这一个位置,所以很确定就是它。

下一步,就是反编译进入分析函数

对比后发现,就是我们抓包得到参数,data=...&apisign=....

代码解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
label_35:
v7.add("data", v2.toString());
// 将字段指向data,加入v7

v7.add("apisign", MD5Util.ToMD5("d367f4699214cec412f7c2a1d513fe05", v2.toString()));
// 这里相当于就是拼接字符串了,"..."md5加密后的字符串 + v2的内容 指向apisign

L.d("请求地址RequestUrl=====", v8.url().toString()); // 不用管
L.d("请求参数Params=========", v2.toString()); // 这里可以看到v2的内容

L.json(v2.toString());
// L.json我猜测是按照js的语言去编码,相当于格式转化v2的内容

return v7.build();
// 对v7进行创建并返回
}

目标明确:

1.找到v2的内容,看了一下,应该是好几个字段拼接的(这里可以直接看到)

2.v7拼接后的样子

3.L.json后的v2

v2的内容

L.d("请求参数Params=========", v2.toString());

ddms抓包就可以看到,v2.toString是什么东西

但是其实自己分析也可以找到,往上回溯,发现很复杂

但是想了一下,这个简单的apk,应该不会这么复杂,而且抓包看到的是明文,说明我可能找的不对

抓包可看到。data的值为:

{"password":"12345678","phone":"12324354523"}

查找data可能存在的地方,

找了好多地方,都不对,摆烂,放弃。。。。。。

题外话:

这里的v7是一个集合,方便存储

L.d安卓端的一种输出方式

toMD5加密函数

update()可以使用多次

digest()只能使用一次

hook的缺点:

密钥和加密是分开的

有可能抓不到最后的加密结果和初始的明文

RSA_No_Padding四种加密方式:

明文倒序 + {0}

{0} + 明文倒序

明文正序 + {0}

{0} + 明文正序

脱壳