hiiamgood 发表于 2021-3-24 12:51

从JAVA到SO加密过程分析

此APP正常情况下fd是无法抓到包。开启了justtrustme插件也抓不到。但是可以在模拟器中登录app,使用Http Debugger抓到提交的数据包。、

从提交的数据包初步分析,只有sign需要解密。

数据包有了,接下来进行初步的静态分析,使用jadx搜索"sign",比较方便的找到了sign的出处。

一步步跟踪方法调用后发现,是在so里面进行了加密工作:

结合抓包数据,以及分析sign的前后代码发现:参数str 为空,参数token为空,参数3为时间戳。
下面开始so的分析,看看so中进行了哪些加密操作。
首先解压apk,拖出wtf.so

将so文件拖入IDA,第一步既是查看Exports,由于JNI是静态注册的,所以很容易就定位到了加密函数:

F5转换为伪C代码,整理好代码,进行so文件的初步静态分析。由于代码还算清晰,比较容易定位到了加密函数,初步判断是一个MD5

一路跟下去,发现此函数具有典型的MD5加密特征:

到这里基本明白,传入的数据在SO中进行了MD5加密。所以接下来动态调试看看此加密函数的三个参数分别是什么。

新开启一个IDA。

为嘛要新开启一个IDA呢,因为动态调试状态下,IDA会简化很多解析,让代码看起来更加难懂。比较方便的是一个IDA做静态分析,一个IDA做动态调试,可以互相参考。

开启IDA的debugger,选择安卓远程调试 Attach(debugger——>Attach——>Remote ARMLinux/Android debugger)将host设置为本地,端口默认

点OK后在进程列表里选择要调试的进程包名。这个的前提是,已在设备上启动了要调试的APP

再次点击OK后等待附加进程完毕。进程附加完毕后,F9让程序继续运行起来。

接下来查康Module选项卡,找到要分析的so文件

双击跟入,一直到要调试的函数汇编代码处。F5转换成伪C代码,

这里可以看出来动态调试的时候,和静态分析时看到的代码差别很大。IDA在动态调试状态下不会将所有东西解析出来。

结合另外一个IDA进行的静态分析,确定需要在哪个BLX下断点.双击进入后,按C,将代码解析成汇编代码。

可以看到被识别出来的函数名。(静态分析的时候能识别出来的就能显示出来)将函数名重命名,方便后继使用。

回到汇编代码处,下断点,然后进行触发断点的运行,成功断下。

依据静态分析得知,我们需要得到此函数的三个参数,所以分别是R0,R1,R2寄存器的值。

查看寄存器的值,分别得出了参数1,参数2的值。

R1(即参数2)的值:2D ,(十六进制)转换成十进制为45,与参数1长度相符。

接下去分析r0值的构成:

由于在java层静态分析中得知,传入so层加密的三个参数中,前两个参数是空,只有第三个参数有值,是时间戳。

而so层的加密函数中,r0的值却是一串字符串+传进来的时间戳组成,必须找到这个字符串的来源。

加密函数中这个getAppSign很可疑。这是通过回调java层函数获得appsign,初步猜测,由于我们并没有修改过app,所以这个函数获得的appsign基本可以确定是正确的,而也是固定的。

本着追根朔源的精神,返回java层寻找getAppSign()函数求证。

由java层分析得知,前面的猜想正确。

最后单步运行让加密函数运行完毕,然后查看R2寄存器的值已经存在,即是函数运行完毕的返回值。

将r0的值进行MD5加密,与从R2获得的值对比,正确。

至此,调试完毕。分别获得了加密所需要的参数,和运行流程。后期进行加密还原即可。

F浮尘 发表于 2021-3-24 19:42

577159380 发表于 2021-3-25 00:27

楼主哒哒学了多久了   这么溜

yuhan520 发表于 2021-3-25 20:32

谢谢分享!!

xl798510059 发表于 2021-3-27 18:46

学习下感谢   

operation 发表于 2021-3-29 07:08

感谢楼主分享, 学习学习

a8152070 发表于 2021-3-31 11:16

学习一下,谢谢分享

fcguo800 发表于 2021-4-1 08:54

这个厉害了,感谢楼主分享。

a576931586 发表于 2021-4-7 09:21

可以绕过ssl双向吗?

3448797081 发表于 2021-5-3 23:43

谢谢分享!!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 从JAVA到SO加密过程分析