记一次渗透过程中某APP的逆向分析过程
0x01 使用Reqable
抓包
使用Reqable
配合JustTrustMe++
Xposed模块对App进行抓包,发现响应加密,看起来像Base64
和AES
:
没办法只能尝试逆向APP了,用JEB
打开一看,竟然混淆了类名和方法名:
直接去找加密逻辑估计够呛,先用算法助手
尝试一波解密看看:
0x02 使用算法助手尝试解密
环境:光速虚拟机 + Magisk Delta
+ LSPosed
勾选对应APP:
一顿操作过后查看算法助手
的日志,找到上方抓到的密文了,密钥等信息也有:
0x03 使用JEB定位加密位置
但是依旧解密后乱码,虽然有的显示了一点明文,但估计后面还有一层处理,查看细节可以发现使用的加密类是javax.crypto.*
,而这个类使用的加密API是javax.crypto.Cipher
的doFinal
方法,再次使用Jeb
全局搜索doFinal
查看调用的地方(这里也可以看上方算法助手的调用堆栈也能定位到此处):
40处匹配,经过全部筛选后发现有一处看似网络拦截器的地方调用了doFinal
方法:
查看一番果然它对数据进行还进行了GZIP
解压缩:
为了验证一下是否如此,决定采用Xposed
的方式进行Hook(也可以使用frida
),Hooke0.m
的第二个参数:
0x04 使用Xposed拦截明文
这里使用的是YukiHookAPI
,相对于原始的Xposed API
调用更加简介方便。
编写模块:
启动APP开始Hook,成功获取明文:
使用在线网站尝试解密:
https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)AES_Decrypt(%7B'option':'UTF8','string':'ecfcgadhgegadgjm'%7D,%7B'option':'Hex','string':'00000000000000000000000000000000'%7D,'CBC','Raw','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)Gunzip()&input=aXNzS01FWkxrSFplTDZYOFh5Q3ErcTZSSnRzM2c3emVnZVMyWHkyVW5yM28veExSeVF3ZXIrTjZsaGZhaVpua3FBbTdGc0s0dUFydHhtbHd5TXhtWVlLUm1ZVnFPbExheS83aERKNWZtc009&oenc=65001
https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)AES_Decrypt(%7B'option':'UTF8','string':'ecfcgadhgegadgjm'%7D,%7B'option':'Hex','string':'00000000000000000000000000000000'%7D,'CBC','Raw','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)Gunzip()&input=RytXN0NDNnJIa2VHUlUwVWZCTkRkcWRMdmlFZ1kvQ09GNVhMTWVqVnYxZUhac0N3NDdPcHQrc1hnaFR0SE5sK09iTkpGRU05S2JTWVhORzhHZnkxY2NkYjBiZzhJSnlJRk90WlAzRjFybWRBSWZSMGY1L1Erd3NrWFl5KzNwUHRlWng3bnZ2YnlVbUFMVlcyUHFzRHBVTHBTNlNwVENEaHpOZmRNelB1cmhXWjJRaTY2WXdZOXJDajdqQzZNWDkrL1kyY1RzakpwQk9FUS93R0xyZ05SSlhnTjV5M1Z2WFJnd3FDVjh3WGZjMD0&oenc=65001
使用Python
脚本解密:
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
import gzip
from io import BytesIO
def decrypt_aes_cbc_pkcs7(key, iv, ciphertext):
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
return decrypted
def main():
while True:
try:
encrypted_data = input("密文: ")
key = b'ecfcgadhgegadgjm'
iv = b'\x00' * 16
encrypted_data = base64.b64decode(encrypted_data)
decrypted_data = decrypt_aes_cbc_pkcs7(key, iv, encrypted_data)
with gzip.GzipFile(fileobj=BytesIO(decrypted_data), mode='rb') as f:
decompressed_data = f.read()
print(decompressed_data.decode('utf-8'))
except Exception as e:
print(e)
if __name__ == "__main__":
main()
到此分析完毕!
0x05 总结
本次APP逆向过程需要熟练各种工具的使用以及环境的配置,如使用Magisk
,而大部分人的手机都没有root
,所以得使用虚拟环境,也就是光速虚拟机,还有一些诸如Reqable
、JEB
、算法助手、YukiHookAPI
这些大佬开发的工具或者技术,感谢这些大佬们开发的工具,如有需要这些工具可以直接关注公众号发消息,免费提供!
0x06 相关链接
Reqable:https://reqable.com/zh-CN/
算法助手:https://github.com/Xposed-Modules-Repo/com.junge.algorithmaide
YukiHookAPI:https://highcapable.github.io/YukiHookAPI/zh-cn/
JEB:https://www.pnfsoftware.com/
声明
本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。
转载须知:
如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。
感谢各位师傅们的理解与支持。
本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。