今天刚好在看某甲广告sdk,发现他请求跟响应的数据都是加密的,于是跟了一下,做个记录。
样本的话,随便那个apk都行,现在基本99%应用都集成了穿山甲
先找一个sdk中请求广告的函数开始跟(sdk文档更新日志 - 穿山甲广告平台)
可以看到反射调用com.bytedance.sdk.openadsdk.TTC5Proxy类的loadFeed函数,通过对该函数进行静态追踪,在com.bytedance.sdk.openadsdk.core.r类中看到几个打包函数,其中a函数较为可疑,如下:
发现其数据很可能就是发包的参数,先抓包验证一下
果然,a函数的返回数据就是发包的参数,现在对a函数进行详细分析:
通过上面的代码能看到,发包参数中加密字段message的值就在str3中
str3 是由 2 拼接上 k2 再拼接上 a2 所得,现在先来解析k2,k2由函数k返回所得
从k函数可知,a.a函数返回若不为空则a.a函数的返回值就是k,若a.a函数返回空,则b.a的返回值为k,现在hook a.a函数
上过上图能看到,k确实是由a.a函数返回所得,对a继续追踪,发现其会产生一个8位的随机数然后将该随机数传进j.a处理
如下图,可知,通过for循环依次去除每一个随机数,然后将随机数进行切割,先取出随机数的低字节,然后以低字节的前4位为下标和后4位为下标 依次从{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}中取出两个数放进新的数组,这样8位随机数,就会取出16个数字组成一个新的数组,然后以字符串形式返回
现在开始跟踪a2的获取过程
通过上图能看到,a2由a.a函数返回,该函数接受2个参数,第一个是jSONObject2,第二个是以k2作为参数的 f 函数的返回值
通过下图的代码能看出,f 函数的返回值为将k2的前8位与后八位对换后的字符串
第一个参数 jSONObject2 的内容具体为如下
{
"abtest":{
"version":"3372976",
"external_ab_vid":"",
"param":"{\"settings\":{\"enable_go_endcard_detail_page\":true}}",
"tob_ab_sdk_version":""
},
"request_id":"60fcd629-057b-4405-b9ff-3f006c21e289",
"ad_sdk_version":"3.3.0.1",
"source_type":"app",
"app":{
"appid":"5052795",
"name":"一键清理管家",
"package_name":"com.xiaoniu.master.cleanking",
"version_code":"41",
"version":"2.7.0",
"is_paid_app":false,
"apk_sign":"B2:65:82:41:27:BC:27:92:F7:BC:53:5F:39:D8:E9:C8:59:2D:0B:76"
},
"device":{
"android_id":"8d44a9d0a44d2c5a",
"uuid":"09309f69-4db0-449e-9c65-31276727f541",
"ssid":"",
"wifi_mac":"02:00:00:00:00:00",
"power_on_time":"595812973",
"rom_version":"miui_V11_V11.0.3.0.QFLCNXM",
"sys_compiling_time":"1605014317000",
"type":1,
"os":1,
"os_version":"10",
"vendor":"Xiaomi",
"model":"Redmi 7",
"language":"zh",
"conn_type":1,
"mac":"BC:7F:A4:DF:75:D4",
"screen_width":720,
"screen_height":1369,
"oaid":"eafdf6a207b5b8b",
"free_space":9662951424,
"applog_did":"2296200784252815",
"sec_did":"",
"orientation":2
},
"user":{
},
"ua":"Mozilla\/5.0 (Linux; Android 10; Redmi 7 Build\/QKQ1.191008.001; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/83.0.4103.101 Mobile Safari\/537.36",
"ip":"10.251.203.124",
"adslots":[
{
"id":"945974395",
"prime_rit":"",
"show_seq":0,
"adtype":5,
"render_method":1,
"accepted_size":[
{
"width":640,
"height":320
}
],
"pos":3,
"is_support_dpl":true,
"is_origin_ad":true,
"ad_count":1
}
],
"ts":1636350263,
"req_sign":"098fc4d6f21607923d46622664f7e35d"
}
在a 函数中 首先对参数二,进行AES加密得到密钥,然后用此密钥对参数一进行加密,加密规则为如下
通过以上加密得到的值即为 a2