ob混淆(2)

前言: 接上期简单介绍了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()
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值