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动态调试解密数据包加密字段的更多相关文章

  1. 【转】安卓逆向实践5——IDA动态调试so源码

    之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...

  2. 转:使用IDA动态调试WanaCrypt0r中的tasksche.exe

    逆向分析——使用IDA动态调试WanaCrypt0r中的tasksche.exe 转:http://www.4hou.com/technology/4832.html 2017年5月19日发布 导语: ...

  3. 动态调试smali代码学习记录

    预备知识 DDMS Dalvik Debug Monitor Serivce,Dalvik调试监控服务,为Android SDK提供的一款拥有监控Dalvik虚拟机的调试软件,启动文件位于<An ...

  4. 动态调试Android程序

    最近好几天来一直在看动态调试.首先是这一篇(http://www.52pojie.cn/forum.php?mod=viewthread&tid=293648)里面介绍了多种IDA动态调试的情 ...

  5. Java 动态调试技术原理及实践

    本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...

  6. 安卓动态调试七种武器之离别钩 – Hooking(下)

    0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是活的,如果能搞懂工具的原理再结合上自身的经验,你也可以创造出属于自己的调试 ...

  7. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

  8. 安卓动态调试七种武器之长生剑 - Smali Instrumentation

    安卓动态调试七种武器之长生剑 - Smali Instrumentation 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是 ...

  9. mybatis动态调用表名和字段名

    以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...

随机推荐

  1. JS Switch

    JS Switch switch 语句用于基于不同的条件来执行不同的动作. switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; defa ...

  2. 详解 DNS 与 CoreDNS 的实现原理

    域名系统(Domain Name System)是整个互联网的电话簿,它能够将可被人理解的域名翻译成可被机器理解 IP 地址,使得互联网的使用者不再需要直接接触很难阅读和理解的 IP 地址. http ...

  3. MongoDB的模糊查询操作(类关系型数据库的 like 和 not like)

    1.作用与语法描述 作用: 正则表达式是使用指定字符串来描述.匹配一系列符合某个句法规则的字符串.许多程序设计语言都支持利用正则表达式进行字符串操作.MongoDB 使用 $regex 操作符来设置匹 ...

  4. bay——RAC 关闭和启动顺序,状态查看.txt

    oracle 11g rac 关闭和启动顺序,状态查看https://www.cnblogs.com/hellojesson/p/4501112.html----------------------- ...

  5. request请求参数与http请求过程

    request请求参数

  6. centos7删除MariaDB怎么操作

    有时我们要在centos上安装一些组件,需要先把原来的数据库删除,比如MariaDB,不然就出现冲突错误,那么如何删除数据库呢?首先查询所安装的MariaDB组件: [root@localhost l ...

  7. ACWING 844. 走迷宫

    地址 https://www.acwing.com/problem/content/description/846/ 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以 ...

  8. Theory of Storage

    https://www.intelligenteconomist.com/theory-of-storage/ The Theory of Storage describes features obs ...

  9. vue-cil3 运行报错

    warnings potentially fixable with the `--fix` option. 将一下部分:"lint": "vue-cli-service ...

  10. 【LOJ6620】「THUPC 2019」不等式 / inequality(线段树)

    点此看题面 大致题意: 给你两个长度为\(n\)的数组\(a_i\)和\(b_i\),定义\(f_k(x)=\sum_{i=1}^k|a_ix+b_i|\),对于\(k=1\sim n\)的每个\(f ...