安卓app逆向hook加解密基础案例保姆级教程

文摘   2024-08-13 14:01   北京  

     起因 朋友在群里发了个智能XX锁的段子 于是感觉好玩 就去淘宝上搜了下 看见还真有这玩意 而且还可以远程控制 于是想着是不是有啥漏洞 可以越权玩玩 · · · · ·

         

   由于没找到小程序以及远程控制的网站,于是本次直接去官网下载了app

         

   安装好app 对其抓包时才发现 所有的请求参数 以及返回参数均为加密状态的

         

         

  

   一般面对这种情况 除了对安卓app进行逆向 已经别无他法了。于是我们进行了逆向,apk逆向工具JEB Decompiler 3.19.1破解版(下载链接:https://www.52pojie.cn/thread-1192412-1-1.html)或者 jadx-1.4.6(下载链接:https://github.com/skylot/jadx/releases/download/v1.4.6/jadx-1.4.6.zip) ,此处我选用的apk逆向工具是jadx-1.4.6

         

   双击jadx-gui 打开(windows可双击底下的 jadx-gui.bat 文件)

         

   将我们下载好的安卓app安装包拖入至 打开的 jadx-gui 界面 我们就能看到左边是一堆文件夹以及文件列表,点击相关文件选择后,右边界面就会出现相应的反编译出来的代码

   点击中间的放大镜按钮 就是搜索按钮

  

   在搜索框内输入decry

  

   然后我们双击进去查看相关代码,看代码大概是不是相关的函数调用过程,感觉像的时候就进行hook相关代码进行验证 ,比如我觉得XXXXX.XXXXXX.com.util.EncryptUtil 里的f函数过程比较像

   那么我们就新建一个txt文本,然后将文件名后缀改为 .js

   之后写入我们的hook代码

         

   Ctrl+s 保存一下,这样 我们的hook脚本就做好了 我们运行下试试 使用 frida -U -f 安卓包名 -l hook脚本文件路径名 --no-pause 语句运行 frida 这里的语句就是

         

frida -U -f XXXXXXXX.com -l /路径/1.js  --no-pause

         

   运行后我们发现 得到了几行数据  EncryptUtil.f is called: 后面跟着的就是返回的加密数据

         

   EncryptUtil.f result 就是我们得到的明文数据 这里我用了console.warn 黄色来显示

         

   一般情况下 这里只要在Hook得到加密结果,如果实在找不到加解密函数的过程,按照这个也是可以进行渗透测试的,但是会比较麻烦。这里我们选择继续分析

         

         

   我们可以看见f返回的解密结果是调用了 e10.toString() 这个过程 那么这个e10 又是个什么东西呢?我们继续往上翻 同样在 XXXXXXXX.com.util.EncryptUtil 这个文件里 我们发现了e函数

         

         

   这里应该就是我们要找的加解密方式 是aes cbc  pkcs5 的模式 但是这里的秘钥key 以及偏移iv值 我们不知道,只能继续看代码。我们可以看到这个e函数过程的第一句就是

SecretKeySpec secretKeySpec = new SecretKeySpec(bArr2, "AES");

         

   这里的bArr2就是e函数调用过程中传递过来的第二个参数,那么我们直接hook这段代码 应该就能获取到加密的秘钥key值了,我们直接hook下这个e函数过程,这里的步骤跟前面一样,我们直接在脚本里更改为e函数

  

之后 我们直接调用

  

         

   到这里我们发现 他的bArr2值都是一样的 都是 56,55,100,81,95,80,53,70,35,57,38,75,42,71,54,98,57,38,102,37,56,33,100,38,48,54,64,40,99,95,42,97 应该就是秘钥key无疑,但是需要注意,我们这里是byte字节型,所以我们需要转成字符串string

         

   这里我们用python写了个小脚本来转字符串

         

def byte_to_string(byte_array):

    string = ""

    for byte in byte_array:

        string += chr(byte)

    return string

                 

# Example usage

h = [56,55,100,81,95,80,53,70,35,57,38,75,42,71,54,98,57,38,102,37,56,33,100,38,48,54,64,40,99,95,42,97]

print(byte_to_string(h))

         

运行后我们得到了我们最终的秘钥key87dQ_P5F#9&K*G6b9&f%8!d&06@(c_*a

         

然后我们继续分析偏移iv

IvParameterSpec ivParameterSpec = new IvParameterSpec(f10971a.getBytes("UTF-8"));

         

         

这里的iv值为 f10971a.getBytes 那么f10971a 又是什么呢?我们直接双击他,然后我们就跳到了这个加密函数的开头第一句

         

public static final String f10971a = b.a() + "_8";

         

         

这里的意思就是f10971a 是由 b.a()过程 拼接 _8 字符串得到的,那么b.a()又是什么呢?我们继续双击b.a 然后跳到了b文件的a函数过程内

然后我们可以看到 他最后返回的return 是个字符串 3*1&f6O%6&Pa5d ,拼接前面的_8,于是我们就得到偏移iv值为 3*1&f6O%6&Pa5d_8

         

   现在加密方式知道了是AES CBC PKCS5 模式,秘钥key也得到了:87dQ_P5F#9&K*G6b9&f%8!d&06@(c_*a 偏移iv值也得到了:3*1&f6O%6&Pa5d_8

         

   下面我们就是抓包后,使用这些得到的信息对数据包进行解密,看看是否正确

我们找到在线加解密网站,依次填入key值和iv值,数据格式选择 文本 填充模式选择pkcs7

之后我们把请求数据包内的密文zLBTNJivGBiLw5E9kSTPbM6iE7LMu3TkE7zEEVQAJMVwk+k7N6ogR5xnC+Fz1POA

填入到第一个加密/解密的内容格子内 点击解密 我们就得到了明文数据了

再将返回数据包内的密文vyQ6GPwiJqTHYVRE7s6d3P3+aEhcENSRYL0XCc2mzrb3db7Wsh+6OY573QF3RloUZ4vgU5d67DtkBl34Y7eGtQ== 填入进去 点击解密,我们就得到了返回数据的明文数据

至此,整个过程到此就结束了,我们也可以愉快的进行渗透测试了

嗨嗨安全
提供网络安全资料与工具,分享攻防实战经验和思路。
 最新文章