JEB 动态调试 加密

工具

JEB3

BurpSuite

Genymotion

操作

先准备一个模拟器或安卓手机,配置好BurpSuite代理,可以抓取到如下数据包,Request和Response都已加密。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled.png

用Jeb3打开Apk,进入Bytecode菜单,点击下方的字符串,搜索dataStr双击进入。(为啥要搜索它? 因为它在提交数据中是个协议头, 添加这些参数的时候想必都会在一个代码块, 所以加密函数也可能在附近。)

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%201.png

进入后我们可以看到smali代码,在可疑的地方通过Ctrl+b可以下断点进行调试。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%202.png

模拟器内需要先打开APP,然后点击上方虫子按钮,可以看到如下图所示,点击附上。

注意: 如果附加和调试对话框中没有模拟器的话, 你需要将模拟器目录下的adb.exe路径添加进系统环境变量path中, 如果已经添加却无法搜索到, 打开任务管理器结束adb.exe进程, 重启模拟器应该就可以了

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%203.png

在模拟器内点击登陆后,JEB模拟器右上方VM/局部变量会增加几个值,但是我们无法直接看懂。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%204.png

我们需要修改Type类型,从int改为string,修改后我们可以看到变量当前处在内存中的值,F6可以进行单步调试,局部变量的值也会随之改变。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%205.png

我们已经了解了如何进行断点调试,通过分析java代码看下整个的加密过程

dataStr是我们的加密字符串,先是调用了getEncodeJsonStr,双击进入看一下

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%206.png

arg6是我们传入的值,我们设置断点看一下

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%207.png

如下图可以看到v6是我们传入的数据进行了json转换,那么我们只要跟着v6走就能找到加密过程。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%208.png

我们继续往下,v6传入了encodeMesJsonByPassword中,传入了4个值分别为Token,requestAesKey,v6,TERMINAL_TYPE

如下图Token是#@!1234567890!@#,requestAesKey是1234567890123456,v6是json格式的明文

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%209.png

TERMINAL_TYPE还不知道我们双击进去,是afAndriod

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2010.png

几个变量都知道了那我们双击进入encodeMesJsonByPassword函数,可以看到v2是一个随机的AesSecretKey,将等于过滤为空,先不管他。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2011.png

如下图signature=md5(terminalType+token+timestamp),terminalType=afAndriod、token=#@!1234567890!@#、timestamp为一个随机值,暂时无法构造。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2012.png

继续往下看arg6,将&timestamp=xxx+&signature=xxx进行了一次base64,和上面的arg6一起进入encryptPinfo函数。上面的arg6为requestAesKey=1234567890123456

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2013.png

接着进入encryptPinfo函数,arg3=base64(&timestamp=xxx+&signature=xxx),arg4=1234567890123456,看下加密发现是AES/CBC/PKCS5Padding加密。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2014.png

有了KEY,我们需要找到IV,点击进入IsIvParameter_Pinfo,如下图Iv值为0123456789abcdef

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2015.png

有了IV和KEY,还有加密算法我们需要对加密字符串进行解密,通过在线AES解密即可得到。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2016.png

在进行一次base64,获得明文

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2017.png