hawk解密分析

碰到了使用com.orhanobut.hawk对sp进行加密的应用,分析一下除了动态调试外如何直接解密

逆向的难度比较大,而且由于涉及到facebook的加密库,导致反编译后代码很难看,好在项目是开源的hawk

看一下这个项目的代码,本质上用的facebook的加密库conceal

截图

截图

这是封装在最外层的解密方法

截图

这是内一层的,cipherTextBytes就是密文,entity可以理解为密文在hawk2.xml文件中对应的键名

截图

这部分呢实际上是做了aes的GCM模式解密,需求的参数有key,iv,tag,data和密文

CryptoConfig中定义了密文各个参数的长度

截图

因此一开始的result的长度实际上就是真正的密文的长度,header则是前14个字节,iv是第3-14个字节,tag是最后16个字节

截图

截图

那么中间的部分,也就是第15个字节开始到tag之前,应该是真正的密文数据,现在就是不知道data到底是啥

根据之前的head进行定位,使用start方法对head进行处理,跟一下发现是native函数

截图

从这里可以看到,将header进行拆分,前2个字节是表示版本,其余的都是iv,最后又进行了update操作,将version和entity进行update,实际上这两个就是data

截图

截图

分析到这里也就清晰了,对于一段密文(字节数组m)来说,由5个部分组成

  1. iv,m[2:14]
  2. tag,m[-16:]
  3. key,sp中对应的键名
  4. enc_data(真正的密文),m[14:-16]
  5. data,m[:2]+key

最后在加上解密所需要的密钥即可解密,这里做一个演示,成功解密出数据

import base64
from Crypto.Cipher import AES

cipher_text = 'AQLqxQ/wZSQwUFgdOA6XjK0DKIcnneC4LCHBn9uMnIezNiWIX2FSc2Hl5Gi1LzjQttPI9P02h/lam+5kEXgtMwV3AdfRH6DkehmjCJy1bPGbUgA4JZ9lYGzgkPzg6k+lZrRGO1xJWK1ESKNIBm3oX+pvEy/nvWcxp64f/2X7/M17Gz29OZCFBp85Y7OXzGkJ0yVYGIYeLFxWjLwudWA='
cipher_key_name = '64_key_share_info'
key_text = 'rp6Fz0G8E6p7KzfJS0qg3Agyoek/GoRg12kAptH9VDo='

cipher_bytes = base64.b64decode(cipher_text.encode('utf8'))
entity_bytes = cipher_key_name.encode('utf8')
key_bytes = base64.b64decode(key_text.encode('utf8'))
iv = cipher_bytes[2:14]
tag = cipher_bytes[-16:]
data = cipher_bytes[:2]+entity_bytes
enc_data = cipher_bytes[14:-16]
cipher = AES.new(key_bytes,AES.MODE_GCM,iv)
cipher.update(data)
decrypt_data = cipher.decrypt_and_verify(enc_data,tag)
print(decrypt_data.decode('utf8'))
# {"appid":"1","content":"https://hideserver.kehuan.vip/info/share.html#您好请打开此条链接下载章鱼隐藏","status":2}

ForensicsTool已经集成

posted @ 2024-07-30 19:13  WXjzc  阅读(198)  评论(0编辑  收藏  举报