JEB动态调试解密数据包加密字段
Posted ldhbetter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JEB动态调试解密数据包加密字段相关的知识,希望对你有一定的参考价值。
0x00 场景
在测试某个app的时候,抓取数据包,发现某些参数存在被加密的情况,或者有签名校验的情况,这个时候如果我们想直接去篡改数据包的内容往往是做不到的,那就来看看抓取的某个app登录数据包,如下所示,password字段明显进行了加密:
接下来,就开始通过JEB对apk进行反编译后动态调试定位关键加密函数。
0x01 对APP进行调试的前提
在android系统中,如果需要调试Android应用程序,需要满足以下两个条件之一:
- apk配置文件AndroidManifest.xml中显示的声明了android:debuggable="true"。
- 在安卓系统的根目录下的default.prop文件中ro.debuggable=1
对于上述的第一个可以调试android应用程序的条件,在android应用商店等下载的正式上架应用,通常不会遇到在AndroidMainfest中设置了android:debuggable="true"的情况,所以如果想要使用第一种方法,通常就需要对apk进行解包添加android:debuggable="true"再打包,随着加壳软件以及apk本身的校验等防护措施,再重新打包apk的过程往往容易出现异常,不容易成功,而第二种调试的条件在手机发布时或者官方的原版rom包中,ro.debuggable=0,也就是说默认不允许调试的,可以通过刷机的方式或者临时修改内存的方式进行修改:ro.debuggable=1
0x02 反编译apk文件
打开反编译工具JEB,直接将需要反编译的apk(未加壳)文件拖到JEB中即可进行反编译得到smali代码和java伪代码
等待一会儿,反编译结束如下:
0x03 通过关键字搜索打断点
根据截取到的登录数据包中的参数关键字(mobile_tel、op_station、mobile_uuid、terminal_os、terminal_platform、terminal_device、password、channel)在JEB的反编译文件Byecode中进行搜索,定位加密的关键函数的位置。
ctrl+F 开始进行搜索:
搜索到以下位置,不止一处位置类似与以下位置,将搜索到的此类似位置都打上断点
将可能的位置都打上断点过后,接着就开始进行调试了。
0x04 通过JEB调试找到加密函数位置
1、所有的断点都下好过后,点击调试按钮,附上设备程序,开始调试,如下:
2、当将手机上运行的应用附上JEB过后,操作app至登录界面,点击登录
如果刚才下的所有断点当中存在正确的,则点击登录过后jeb会直接停在正确断点位置,反正,没有任何效果,说明断点没有打在正确的地方,需要重新搜索。
在调试过程当中,会提示程序没有响应,记得点击等待
3、在断点处单击右键选择解析或者按tab键,跳转到当前断点位置的反编译的java源码处
发现password的值是由v0_2赋值而来
双击v0_2,跳转到如下位置处,说明v0_2的值在onClick()函数中得到:
继续在onClick()函数中找其他v0_2所在的位置
双击encrypt,跳转到加密函数所在位置
通过分析,基本可以确定此处就为password字段加密的函数位置所在
接下来可以再通过下断点加以确定,回到以下java源码位置,再按tab或者解析回到此位置对应的smali代码处并打下断点:
重新点击app应用的登录,成功跳转到调用加密函数的断点位置,如下:
4、双击加密函数encrypt,进入加密函数所在位置,分析加密函数以便解密:
实现加密的函数如下:
实现解密的函数如下:
解密需要用到的相关密钥被硬编码如下:
5、最后根据加密函数中的填充模式,加密模式、密钥,数据块,偏移量信息通过在线网站解密
将数据包中抓取到的加密字段进行url转码过后解密如下,得到加密之前的原始密码
以上是关于JEB动态调试解密数据包加密字段的主要内容,如果未能解决你的问题,请参考以下文章