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

admin 2024年8月13日23:26:22安卓app逆向hook加解密基础案例保姆级教程已关闭评论13 views字数 2668阅读8分53秒阅读模式

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

         

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

         

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

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

         

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

  

   一般面对这种情况 除了对安卓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逆向hook加解密基础案例保姆级教程

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

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

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

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

  

   在搜索框内输入decry

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

  

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

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

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

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

   之后写入我们的hook代码

安卓app逆向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 黄色来显示

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


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


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


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


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


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

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


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

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

之后 我们直接调用

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


   到这里我们发现 他的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))


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

运行后我们得到了我们最终的秘钥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";


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


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

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

然后我们可以看到 他最后返回的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


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

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

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

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

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

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

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

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

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

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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月13日23:26:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓app逆向hook加解密基础案例保姆级教程https://cn-sec.com/archives/3064725.html