【JS逆向案例】某产业大数据平台进制流参数逆向

声明

本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

本文未经许可禁止转载,禁止任何形式的修改后进行二次传播,若有侵权,请联系作者删除!

逆向目标

  • 目标:aHR0cDovL3d3dy5zcG9saWN5LmNvbS8=

抓包分析

这里需要右键检查打开开发者工具F12不行的已被网站禁用,出现无限debugger

解决无限debugger的方法可以进行hook将debugger函数置空,注入方式有很多,这里选择控制台注入如下代码

var AAA=Function.prototype.constructor

Function.prototype.constructor=function(n){
    if(n!="debugger"){
        return AAA(n)
    }
    return function(){};
}

控制台注入

转到源代码页面点击跳过,即可正常调试网页

开始抓包

加载了一个数据接口

点击进去,发现请求参数是进制流,需要逆向分析,数据明文响应

复制路径进行XHR断点调试

点击切换,加载数据成功断住

进制流数据已加载出来

继续分析,查找数据是在哪里实现进制流的,点击跳出当前函数找到如图所示位置

axiosInstance[sr(918, 893, 289, 785, "&8n(") + sK(1381, "NujK", 1269) + "rs"][sK(639, "l*hm", 1046) + sB("l*hm", 2190, 1697, 2005)][sr(493, 860, 346, 780, "auGk")]

像这种进制流是由拦截器生成的,拦截器分为requestresponse,这种是在request里生成的,我们先还原一下上面这段代码

axiosInstance[sr(918, 893, 289, 785, "&8n(") + sK(1381, "NujK", 1269) + "rs"][sK(639, "l*hm", 1046) + sB("l*hm", 2190, 1697, 2005)][sr(493, 860, 346, 780, "auGk")]
//axiosInstance['interceptors']['response']['use']

我们看到还原后是response,我们要找的是requestctrl+f搜索一下axiosInstance,找到如下位置

axiosInstance[sd(83, "&8n(", 207, 214, 527) + sr(1006, 562, 915, 902, "zj&U") + "rs"][sK(1548, "WAuM", 1535) + "st"][sY(247, "FDww")]
//axiosInstance['interceptors']['request']['use']

这里就是我们要找的request,打上断点,再删掉之前的XHR断点,放掉断点再次点击切换

成功在断点处断住,明文数据如下图

点击下图位置进行调试

多次调试发现数据在经过断点处代码后变成进制流

把代码扣出来

n[a(502, 444, 578, 484, "NujK")] = u[s(412, "K*ER", -308, 112) + "e"](n[i(774, "A!hb")])[r(642, 1123, 1176, "6#7Q") + "h"]()[r(466, 755, 569, "!X^n")]()
//n["data"] = u["encode"](n["data"])["finish"]()['slice']()

n["data"]就是请求参数明文

n["data"] = {
    "policyType": "6",
    "province": "",
    "city": "",
    "downtown": "",
    "garden": "",
    "centralId": "",
    "sort": 0,
    "homePageFlag": 1,
    "pageNum": 1,
    "pageSize": 7
}

接下来需要找到u["encode"],选中后跳进去,扣出如下代码

补全代码后本地运行调试

function PolicyInfoByTypeIdParam$encode(m,w){
  if(!w)
  w=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
}
data = {
    "policyType": "6",
    "province": "",
    "city": "",
    "downtown": "",
    "garden": "",
    "centralId": "",
    "sort": 0,
    "homePageFlag": 1,
    "pageNum": 1,
    "pageSize": 7
}
data = PolicyInfoByTypeIdParam$encode(data)["finish"]()['slice']()

出现以下错误

Writer显示未定义,继续扣代码

发现是一个webpack,找到此处将整个加载器抠出来

这里代码很长,直接折叠代码,很方便就扣下来了,如果不能折叠自行搜索方法或更换浏览器,也可以不折叠但很费眼睛!!!

扣下来是这样的,这里可以再删掉一下多余的代码

直接改为这样

这两个是一样的效果,可以直接删掉外面的自执行函数

然后定义变量全局导出

导出后使用如下

w=red.Writer.create()

然后运行会报如下错误

commonjsGlobal变量没有定义,在js中搜索一下

找到如下代码,直接补到本地即可

commonjsGlobal = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {};

到此全部逆向完毕

最后疑问

那上图逆向出来的东西如何使用呢,这里提供一个方法,其余自行思考+百度(gpt也可以,还更方便哦)

data = execjs.compile(open("XXX.js","r",encoding="utf-8").read()).call("XXX")
data_list = data['data']
byte_array = bytes(data_list).decode()

结果验证

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嗨!对于爬虫中的 JavaScript 逆向案例,我可以给你提供一个简单的示例。请注意,这个示例只是为了帮助你理解逆向过程,真实的应用中可能涉及法律和伦理问题,请合法使用爬虫技术。 假设我们要爬取一个网站上的某个页面数据,但是该页面通过 JavaScript 动态生成。我们可以通过分析网页的 JavaScript 代码来逆向工程,获取所需数据。 首先,打开 Chrome 浏览器并进入开发者工具(按 F12 键或右键点击页面并选择“检查”)。然后切换到“网络”选项卡。 接下来,在浏览器地址栏中输入目标网页的 URL 并按下回车,浏览器将开始加载页面。在网络选项卡中,你将看到所有请求和响应的列表。 查找其中一个请求,该请求可能包含我们所需的数据。点击该请求并查看其请求头、响应头和响应体。 在响应体中,你可能会看到一些 JavaScript 代码,这些代码负责生成页面上的内容。你可以仔细阅读该代码,并找到生成目标数据的部分。 如果你发现目标数据是通过 Ajax 请求获取的,你可以查看该 Ajax 请求的 URL 和参数,然后使用 Python 的 requests 库或其他适当的方法模拟该请求,并解析响应获取数据。 如果你发现目标数据是在 JavaScript 代码中直接生成的,你可以尝试分析代码逻辑并编写相应的 Python 代码来模拟该过程。这可能涉及到使用 JavaScript 解释器或库来执行 JavaScript 代码。 需要注意的是,JavaScript 逆向工程是一项复杂的任务,需要对 JavaScript 和网络协议有一定的理解。同时,网站所有者可能会采取一些反爬虫措施来阻止你的行为,所以请务必遵守法律法规和网站的使用规则。 希望这个示例能够帮助你入门 JavaScript 逆向工程。如果你有任何其他问题,欢迎继续提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Red sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值