JEB 动态调试 加密
工具
JEB3
BurpSuite
Genymotion
操作
先准备一个模拟器或安卓手机,配置好BurpSuite
代理,可以抓取到如下数据包,Request和Response都已加密。
用Jeb3打开Apk,进入Bytecode菜单,点击下方的字符串,搜索dataStr
双击进入。(为啥要搜索它? 因为它在提交数据中是个协议头, 添加这些参数的时候想必都会在一个代码块, 所以加密函数也可能在附近。)
进入后我们可以看到smali
代码,在可疑的地方通过Ctrl+b可以下断点进行调试。
模拟器内需要先打开APP,然后点击上方虫子按钮,可以看到如下图所示,点击附上。
注意: 如果附加和调试对话框中没有模拟器的话, 你需要将模拟器目录下的adb.exe路径添加进系统环境变量path中, 如果已经添加却无法搜索到, 打开任务管理器结束adb.exe进程, 重启模拟器应该就可以了
在模拟器内点击登陆后,JEB模拟器右上方VM/局部变量会增加几个值,但是我们无法直接看懂。
我们需要修改Type类型,从int改为string
,修改后我们可以看到变量当前处在内存中的值,F6可以进行单步调试,局部变量的值也会随之改变。
我们已经了解了如何进行断点调试,通过分析java代码看下整个的加密过程
dataStr是我们的加密字符串,先是调用了getEncodeJsonStr,双击进入看一下
arg6是我们传入的值,我们设置断点看一下
如下图可以看到v6是我们传入的数据进行了json转换,那么我们只要跟着v6走就能找到加密过程。
我们继续往下,v6传入了encodeMesJsonByPassword中,传入了4个值分别为Token,requestAesKey,v6,TERMINAL_TYPE
如下图Token是#@!1234567890!@#,requestAesKey是1234567890123456,v6是json格式的明文
TERMINAL_TYPE还不知道我们双击进去,是afAndriod
几个变量都知道了那我们双击进入encodeMesJsonByPassword函数,可以看到v2是一个随机的AesSecretKey,将等于过滤为空,先不管他。
如下图signature=md5(terminalType+token+timestamp),terminalType=afAndriod、token=#@!1234567890!@#、timestamp为一个随机值,暂时无法构造。
继续往下看arg6,将×tamp=xxx+&signature=xxx进行了一次base64,和上面的arg6一起进入encryptPinfo函数。上面的arg6为requestAesKey=1234567890123456
接着进入encryptPinfo函数,arg3=base64(×tamp=xxx+&signature=xxx),arg4=1234567890123456,看下加密发现是AES/CBC/PKCS5Padding加密。
有了KEY,我们需要找到IV,点击进入IsIvParameter_Pinfo,如下图Iv值为0123456789abcdef
有了IV和KEY,还有加密算法我们需要对加密字符串进行解密,通过在线AES解密即可得到。
在进行一次base64,获得明文