前言: 接上期简单介绍了ob混淆之后今天为大家带来进阶一点的ob混淆版本,
本博客仅供交流学习使用
若有侵权请联系作者删除
简介:octet-stream指任意类型的二进制流数据。
1.逆向目标
2.逆向分析
-
过无限debugger
var _constructor = constructor; Function.prototype.constructor = function(s) { if (s == "debugger") { console.log(s); return null; } return _constructor(s); }
-
可以看到他的数据是请求载荷是加密数据数据信息是octet-strea 的二进制数据
-
这种数据就没有办法进行关键字定位
-
先通过xhr断点他的发包,可以看一下再构造请求的时候是不是一个加密的数据
-
要是构造的请求对象是为未加密的,但是抓包数据的数据是加密的数据,那我们就需要思考一下他是不是会有请求拦截器,拦截进行加密的
-
找请求拦截器会比较麻烦,我们可以直接跟响应的数据解析,一般有请求拦截就会同时有响应拦截
-
一般拦截器会回在同一个文件,我们可以直接在当前文件搜索
axiosInstance
, 看他后方有没有跟上request
-
可以看到请求拦截器应该是在这个位置,我们可以下断点,看看有没有进行触发
-
接着往下跟就能看到数据生成的位置
-
接着就需要扣
c[o(428, 362, 660, 1118, "E&B*") + "e"]
这些代码的实现过程 -
实现函数是一个异步代码,我们需要扣出来
-
Writer.create
方法我们需要找到生成他的位置,在js代码中可以看到,当前数据是一个自执行方法,感觉还是一个webpack的形式 -
我们可以直接扣下来,执行看里面是否有我们需要的方法
-
现在就能执行得到我们想要的数据信息
-
执行完之后把
.finish().slice()
给补上 -
finish
是create的方法 -
slice
可以用来取数组的数据
3.逆向结果
-
JavaScript代码
function PolicyInfoByTypeIdParam$encode(m) {
w = xxx.Writer.create()
if (m.policyType != null && Object.hasOwnProperty.call(m, "policyType"))
w.uint32(10).string(m.policyType)
if (m.centralId != null && Object.hasOwnProperty.call(m, "centralId"))
w.uint32(18).string(m.centralId)
if (m.province != null && Object.hasOwnProperty.call(m, "province"))
w.uint32(26).string(m.province)
if (m.city != null && Object.hasOwnProperty.call(m, "city"))
w.uint32(34).string(m.city)
if (m.downtown != null && Object.hasOwnProperty.call(m, "downtown"))
w.uint32(42).string(m.downtown)
if (m.garden != null && Object.hasOwnProperty.call(m, "garden"))
w.uint32(50).string(m.garden)
if (m.sort != null && Object.hasOwnProperty.call(m, "sort"))
w.uint32(56).uint32(m.sort)
if (m.pageNum != null && Object.hasOwnProperty.call(m, "pageNum"))
w.uint32(64).uint32(m.pageNum)
if (m.pageSize != null && Object.hasOwnProperty.call(m, "pageSize"))
w.uint32(72).uint32(m.pageSize)
if (m.homePageFlag != null && Object.hasOwnProperty.call(m, "homePageFlag"))
w.uint32(80).uint32(m.homePageFlag)
return w.finish().slice().toString('base64');
}
m = {
"policyType": "3",
"province": "",
"city": "",
"downtown": "",
"garden": "",
"centralId": "",
"sort": 0,
"homePageFlag": 1,
"pageNum": 1,
"pageSize": 7
}
console.log(PolicyInfoByTypeIdParam$encode(m));
-
python代码
import requests
import execjs
import base64
class dsjpt():
def __init__(self):
self.url = 'http://www.spolicy.com/info_api/policyType/showPolicyType'
self.headers = {
'Content-Type':'application/octet-stream',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
}
self.js = execjs.compile(open('demo.js', encoding='utf-8').read())
def get_data(self):
data = {
"policyType": "3",
"province": "",
"city": "",
"downtown": "",
"garden": "",
"centralId": "",
"sort": 0,
"homePageFlag": 1,
"pageNum": 1,
"pageSize": 7
}
# 直接转bytes数据类型也可以
# print(bytes(data1['data']))
data1 = base64.b64decode(self.js.call('PolicyInfoByTypeIdParam$encode', data))
res = requests.post(self.url, headers=self.headers, data=data1)
print(res)
print(res.text)
def main(self):
self.get_data()
if __name__ == '__main__':
dsj = dsjpt()
dsj.main()