吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4479|回复: 23
收起左侧

[Android 原创] 一个安卓应用的逆向分析

  [复制链接]
weakptr 发表于 2021-9-10 23:17

待分析应用的名字不透露了,避免引火烧身。

需要准备的工具包括

  • mumu 模拟器(或者别的什么有 root 权限、能装 xposed 的模拟器)
  • FDex2 脱壳
  • jadx 反编译 dex 源码
  • apktools 拆解 apk
  • mitmproxy 中间人拦截网络请求

<!-- more -->

0x01 目标和方向选择

首要的目标是分析这个软件的 api 加密。

使用 mitmproxy 抓到 https 流量,发现请求体全部是 base64 ,解码发现乱码。基本断定是加密了。

01

搜了一圈没有什么现成的对这个 App 的分析的文章,于是决定自己动手。

0x02 解包和脱壳

先确认下电脑上装了 JDK 或者 JRE ,没有的话就装好。

推荐一个 vscode 的插件,apklab。会帮你装好 jadx 和 apktools / signer 这些工具。

接下来直接用 apklab 打开需要分析的 apk 文件。

02

03

04

apklab 会自动用 apktools 和 jadx 完成拆包和反编译。

然后简单观察...

05

应该是被 360 加固了。

apk 加固的基本原理就是把易被反编译的 java 字节码转译或者加密后保存,运行的时候再释放出来。用过 upx 一类的软件应该会联想到,就是加壳、反调试什么的这一套。

xposed 提供了一个在安卓包加载时设置钩子的机会,将 ClassLoader Hook 掉,以此获得真正的应用字节码。

安装 xposed 框架和 FDex2 之后启动目标应用,即可获得对应的字节码 dex 文件。

06

07

接着把这些 dex 文件复制出来,即可使用 jadx 反编译到 java 了。

jadx -d out *.dex

将反编译的结果用 vscode 打开,可以看到目标已经被我们脱干净了。

08

0x03 寻找加解密代码

目标是解密 Api 请求的内容,所以下一步就是找到哪里保存了加密代码。

幸运的是这个 App 没有做过混淆,完成脱壳后就已经是全身赤裸的站在我们面前了。

直接在代码里搜索之前我们观察到的 url:index_des.php,仅有一个结果。

09

相关函数非常短,这个 HTTP 框架我没有使用过,不过从函数名看应该是一个中间件模式,对所有 Web 请求进行加密处理。

10

getOverPost2 源码如下

11

从代码里可以得出:

  • g 的含义是 Get 请求的参数,应该就是 QueryString。函数名 getOverPost2 字面意义就是把 GET 请求以 POST 方式发送出去。
  • p 的含义大概就是 Post 的参数了。
  • 加密代码在 encryptByte

如此看来已经接近终点了,再点开 encryptByte 的定义

12

密钥保存在 DesLib.sharedInstance().getAuthKey() 中。

接着点开 getAuthKey 的定义:

13

native 关键字一出,得,白高兴了。差点劝退成功。

还是先看下怎么加密的。

14

再往回翻一下响应解密的代码,免得拆除密钥来又白高兴一场。

15

16

很好,也是 DES 。

其实到这一步已经基本完成解密了,唯一欠缺的就是密钥。

抱着试一试的心情,还是找到了 libencry.so ,用 IDA 打开分析了一下。

17

一通操作猛如虎,结果发现看不懂汇编。=w=

按下 F5,看看伪代码。

18

还是看不懂。这都调的什么函数... a1 + 668 这个蜜汁偏移也不知道是在算什么。

网上搜索了一圈,说道可以手动改一下函数签名,IDA 就能提示出函数了。试试看。

先把函数签名纠正

19

20

再关掉类型转换

21

最终关键代码清晰了很多,看起来就是个直接返回字符串常量的函数。

22

比较具有迷惑性的是上面的 v5-v9,可以看到 v5-v9 地址是增长、连续的,只有 v5 和 v6 有值。v7/v8/v9 都是 0 。而 v5 的地址被用作 NewStringUTF 函数的参数。查阅 JNI 接口也可以看到这个参数应该是 const char* 类型。

所以 ...

把数值转换成 16 进制再做观察。

23

发现很有规律,每个字节的值都在 ASCII 范围内。于是右键转换成字符串,再按字节序翻转一下,即可得到密钥。

到此,解密方法的探索已经完成。

0x04 mitmproxy 解密

mitmproxy 支持使用 python 脚本扩展,用法很简单就是 mitmweb.exe -s decrypt.py

可以参考 mitmproxy 的例子

最终效果应该是这样

24

核心的解密代码就一句,利用 mitmproxy 的扩展即可对每个请求进行统一的处理。

from pyDes import des, PAD_PKCS5

def decrypt(data: Union[str, bytes]) -> bytes:
    return des(key).decrypt(data, padmode=PAD_PKCS5)

0x05 总结

这个分析的最大意义还是完成了一次完整的安卓逆向,算是点亮了新技能。

免费评分

参与人数 6威望 +1 吾爱币 +24 热心值 +5 收起 理由
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
KeleZander + 1 用心讨论,共获提升!
zhuzhuxia111 + 1 + 1 我很赞同!
风绕柳絮轻敲雪 + 1 + 1 我很赞同!
emp + 1 热心回复!
ongp1347 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| weakptr 发表于 2021-9-11 11:57
带俗 发表于 2021-9-11 10:57
执行Open an APK后提示这个:Downloading file: apktool_2.5.0.jar
Downloading file: uber-apk-signer-1. ...

请求超时,可以临时挂个梯{和谐}子,再打开vscode,让apklab下载。或者也可以手动下载这三个工具,放进家目录下的.apklab,目录结构如下所示。

[Plain Text] 纯文本查看 复制代码
    目录: C:\Users\weakptr\.apklab


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2021/9/11     11:52                jadx-1.2.0
-a----         2021/9/11     11:52       19300357 apktool_2.5.0.jar
-a----         2021/9/11     11:52       15434528 jadx-1.2.0.zip
-a----         2021/9/11     11:52        1861628 uber-apk-signer-1.2.1.jar
带俗 发表于 2021-9-11 10:57
执行Open an APK后提示这个:Downloading file: apktool_2.5.0.jar
Downloading file: uber-apk-signer-1.2.1.jar
Downloading file: jadx-1.2.0.zip
Error: connect ETIMEDOUT 192.30.253.112:443
Can't download/update dependencies!
Error: connect ETIMEDOUT 192.30.253.112:443
Error: connect ETIMEDOUT 192.30.253.112:443。怎么处理啊?
三滑稽甲苯 发表于 2021-9-11 07:36
ongp1347 发表于 2021-9-11 07:49
学习了 谢谢楼主分享
Ichild 发表于 2021-9-11 08:35
修改类型为JNIEnv*后,(*a1)->NewStringUTF这里右键NewStringUTF,force call就可以正确显示参数列表
liu流年 发表于 2021-9-11 08:47
工具能分享一下吗
tedytao 发表于 2021-9-11 09:16
很好的技术贴,学到了方法
 楼主| weakptr 发表于 2021-9-11 11:47
Ichild 发表于 2021-9-11 08:35
修改类型为JNIEnv*后,(*a1)->NewStringUTF这里右键NewStringUTF,force call就可以正确显示参数列表

谢谢分享小技巧,我还不知道能这样。

试了下在 IDA 7.5 和 IDA 7.0(论坛下的)打开 x86 的 so ,在 NewStringUTF 上右键都没有这个 force call,是需要特定版本的 IDA 或者装什么插件吗?
 楼主| weakptr 发表于 2021-9-11 11:49
liu流年 发表于 2021-9-11 08:47
工具能分享一下吗

您好,麻烦看帖子内容,工具都已经列出来了。

IDA可以在论坛找,mitmproxy可以到 github 找。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表