接着上次的写,这次跟一下响应数据的解密

响应

看过这么多广告sdk,他们的流量数据,基本都是放在 JSONObject 中,所以直接从  JSONObject 中下手hook就稳稳的

其调用栈为如下:

根据上面的调用栈对  com.bytedance.sdk.openadsdk.core.q 的 g 函数 hook

其参数如下:

发现该函数的参数还是密文,说明密文就是在 g 函数内部进行解密的,其解密函数就是下面的 b 函数:

在 b 函数中先对密文进行切割,然后将切割的字符串传入 a.b 函数中

其中参数三还被函数a处理过

由上面可知 a.b 函数的三个参数依次为:

参数一为:密文的第50位到结尾

参数二为:密文第34位到49位

参数三为:密文第2位到33位,前16位与后16位对换

a.b 函数为如下:

函数具体解密逻辑为:

1 对参数一先用base64解密

2 由参数三生成密钥

3 设置解密模式为 "AES/CBC/PKCS5Padding"

4 初始化解密参数,写入参数三生成的密钥,并由参数二生成初始化向量

5 对参数一base64解密后的数据进行解密

到这里穿山甲流量的解密就完成了,直接copy代码写了一个解密的jar包

CSJDcrypt.java
package com.yooha;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.FileReader;
import java.io.IOException;public class CSJDcrypt {public static void main(String[] args) throws IOException {String s = readfile(args[0]);System.out.println(decrypt(s));}public static String readfile(String filename) throws IOException {FileReader fileReader=new FileReader(filename);int length=0;char[] cfile = new char[0X1000 * 100];int index = 0;while((length=fileReader.read())!=-1) {cfile[index++] = (char)length;}char[] newstr = new char[index + 1];for(int i = 0; i < index; i++){newstr[i] = cfile[i];}newstr[index] = 0;fileReader.close();return new String(newstr);}public static String a(String str, int i2) {if (str == null || str.length() != i2) {return null;}int i3 = i2 / 2;return str.substring(i3, i2) + str.substring(0, i3);}public static String decrypt(String str) {if (isEmpty(str) || str.length() < 49) {return str;}String a = a(str.substring(1, 33), 32);String substring = str.substring(33, 49);return (substring == null || a == null) ? str: _decrypt(str.substring(49), substring, a);}public static String _decrypt(String str, String str2, String str3) {if (isEmpty(str)) {return null;}try {byte[] decode = MyBase64.decode(str.getBytes());System.out.println("str3 = " + str3);SecretKeySpec secretKeySpec = new SecretKeySpec(str3.getBytes(), "AES");System.out.println("str3 = " + secretKeySpec.getEncoded());Cipher instance = Cipher.getInstance("AES/CBC/PKCS5Padding");instance.init(2, secretKeySpec, new IvParameterSpec(str2.getBytes()));String ret = new String(instance.doFinal(decode), "utf-8");return ret;} catch (Exception e2) {System.out.println("_decrypt -> error = " + e2.getMessage());return null;}}public static boolean isEmpty(String str){if (str.length() == 0){return true;}return false;}}

MyBase64.java

这个是网上找的一个Base64,你们自己找个能跑起来就行

后来想想,之前有个沙箱当时就是用python调用jar包解密,搞的有点麻烦,沙箱越轻越好,还是直接用python解算了,然后了解了一下Crypto,挺好用的,写了个python的解密脚本

# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AES class AES_CIPHER(object):#解密函数 ("AES/CBC/PKCS5Padding");@classmethoddef _decrypt(cls, str1, str2, str3):cryptor = AES.new(str3.encode("utf8"), AES.MODE_CBC, str2.encode("utf8"))plain_text = cryptor.decrypt(base64.b64decode(str1))unpad = lambda s: s[0:-ord(s[-1:])]return unpad(plain_text)@classmethoddef decrypt(cls, info):if len(info) < 49:return infoelse:return cls._decrypt(info[49:], info[33:49], info[1:33][16:32] + info[1:33][0:16]).decode('utf-8')if __name__ == '__main__':with open("flow.txt", "r", encoding='utf-8') as out:info = out.readline()print(AES_CIPHER.decrypt(info))

没错,用python写代码就是这么少。下面是解密内容

后面我写了一个广告sdk自渲染广告的监控工具,链接:https://github.com/YoooHaaa/renderAd

有兴趣可以去看看,工具拿来把js脚本改改,就能复用到其他业务上

某广告SDK流量加解密-响应相关推荐

  1. 某广告SDK流量加解密-请求

    今天刚好在看某甲广告sdk,发现他请求跟响应的数据都是加密的,于是跟了一下,做个记录. 样本的话,随便那个apk都行,现在基本99%应用都集成了穿山甲 请求 先找一个sdk中请求广告的函数开始跟(sd ...

  2. 移动安全-Burpy自动化加解密APP报文

    文章目录 前言 Burpy实战 演示环境 插件简介 RPC脚本 Burpy效果 手动加解密 自动加解密 总结 前言 我在前面一篇博文 移动安全-Brida加解密数据 中介绍了如何使用 Brida 插件 ...

  3. 软件安全加解密,程序授权管理控件CrypKey SDK

    CrypKey SDK 为软件开发者提供极为灵活的执行副本保护和自定义许可策略.通过 CrypKey SDK,函数调用被开发者嵌入到被保护程序的源码中. 具体功能: 创建自定义对话框 保护程序的特定方 ...

  4. android 中动态加载广告sdk

    关于动态加载sdk的话题,网上介绍比较多:今天通过第三方工具来取个巧,虽然方法也有点不太靠谱,但终归是一个思路. 项目里面接入了穿山甲sdk和广点通sdk广告,结果放到应用市场时说被拒了,因为有广告, ...

  5. Popular MVC框架请求响应数据加解密@Decrypt和@Encrypt的使用示例

    简介 此项目用于演示popularmvc如何提供统一全自动化的API隐私数据保护,并且可以做到业务无感和灵活指定数据加解密算法. 请求数据加密使用@Decrypt注解,响应信息加密使用@Encrypt ...

  6. 自动加解密请求包响应包插件(autoDecoder)

    之前所立的一个flag:明文传,明文响应:密文传,密文响应 0x01 背景 当数据包里都是密文,我们无从下手:就算是获得了加解密的一些关键信息,能解密出来,但是每个数据包我们都需要慢慢解密,请求包需要 ...

  7. 微信加解密流程,证书作用讲解,官方SDK使用教程

    微信支付接口常用参数及证书区分 1. 私钥和证书 1.1 商户API证书 1.1.1 功能介绍 API证书,是指由商户申请的,用来证实商户身份的证书.API证书由证书授权机构Certificate A ...

  8. 警惕!国内某广告SDK内置“后门”功能,Google Play商店已强制下架

    本文讲的是警惕!国内某广告SDK内置"后门"功能,Google Play商店已强制下架, 新闻摘要 Lookout安全团队近日发现了个信的广告软件开发工具包(SDK),可以通过下载 ...

  9. android广告SDK原理详解(附源码)

    广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告 ...

最新文章

  1. 上传图片配置控制大小_esp32-cam拍照上传云平台,http协议传输
  2. Datawhale实验室
  3. 分布式系统,session共享方案
  4. 使用Canvas进行验证码识别
  5. K - 老鼠走迷宫(DFS)
  6. Open vSwitch实验常用命令
  7. 中希尔排序例题代码_超全面分析十大排序算法
  8. CentOS6/CentOS7系统配置IPv6地址的方法
  9. vc2010c语言,VC2010下载_VisualC++2010官方下载「vc2010」-太平洋下载中心
  10. thought works培训总结
  11. .net mvc笔记3_Understanding Razor Syntax
  12. Pandas数据分析实战(1)——探索Chipotle快餐数据
  13. waterfall 上拉加载 下拉刷新
  14. Qt官方示例-QLineEdit编辑器
  15. AMD RX 7700XT、7800XT和7600显卡参数 RX 7700XT、7800XT和7600相当于什么水平
  16. java中的双冒号操作符
  17. 教师资格证科目二客观题汇总
  18. 上班族最常用数据图表分析软件有哪些
  19. [论文阅读]A Joint Training Dual-MRC Framework for Aspect Based Sentiment Analysis
  20. 软件安装和点亮流水灯

热门文章

  1. 【json】json文件中文乱码
  2. 阿里云国际站云服务器可以用来做什么业务?
  3. 优秀的html布局,优秀的网页设计中常见的六大布局
  4. Calcite优化规则之ProjectAggregateMergeRule
  5. 《当下的启蒙》的概述和精华
  6. iPhone 导入照片显示时间不是拍摄时间
  7. c 语言提取左右声道数据
  8. 菏泽话务员机器人方案_智能打电话机器人让电话营销变得更简单
  9. iOS Xcode提交IPA时收到苹果邮件ITMS-90338: Non-public API usage
  10. org.apache.dubbo 2.7.7 服务端处理请求及时间轮(失败重试)