news 2026/4/3 6:44:51

JS逆向 - 某程 w-payload-source 纯算、补环境分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JS逆向 - 某程 w-payload-source 纯算、补环境分析

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 小结

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

也是很久没有更新教学文章了,这次就更新一波纯算和补环境

逆向:某程 header请求头参数 w-payload-source 纯算、补环境分析

URL:aHR0cHM6Ly9mbGlnaHRzLmN0cmlwLmNvbS9vbmxpbmUvbGlzdC9vbmV3YXktc2hhLWJqcz9fPTEmZGVwZGF0ZT0yMDI1LTEyLTI2JmNhYmluPVlfU19DX0Y=

整体架构流程

提示:加密位置分析流程

1、搜索关键词:w-payload-source

2、window.c_sign.toString(i) 下断点,可以看到i其实就是表单进行md5加密,继续进入c_sign.toString函数

3、这里我们发现加密的函数是在window下面,而且这个函数是在一个单独的文件里面:c-sign.js

技术名词解释

提示:补环境和纯算分析解决

1、补环境:将c-sign.js文件代码全部复制出来,缺啥补啥

  • 代理吐环境:
AsObj={print:console.log,// print:function (){}}no_print=['Boolean','String','parseFloat','Array','Object'];functionwatch(object,WatchName){consthandler={get(target,property,receiver){if(property!=='isNaN'&&property!=='encodeURI'&&property!=="Uint8Array"&&property!=='undefined'&&property!=='JSON'&&property!=='Number'&&!no_print.includes(property)&&property!==Symbol.for('nodejs.util.inspect.custom')&&typeofproperty!=='symbol'){if(property==='global'){returnundefined;}if(property==='Buffer'){returnundefined;}AsObj.print("方法:","get","对象:",WatchName,"属性:",property,"属性类型:",typeofproperty,"属性值:",typeoftarget[property]=='object'?"object":target[property],"属性值类型:",typeoftarget[property]);}if(WatchName==='top'){returnwindow;}returnReflect.get(target,property,receiver);},set(target,property,value,receiver){AsObj.print("方法:","set","对象:",WatchName,"属性:",property,"属性类型:",typeofproperty,"属性值:",value,"属性值类型:",typeoftarget[property]);returnReflect.set(target,property,value,receiver);},has(target,property){AsObj.print("代理对象:",WatchName,"方法:","has","检查属性:",property);returnReflect.has(target,property);},ownKeys(target){AsObj.print("方法:","ownKeys","对象:",WatchName);returnReflect.ownKeys(target);}};returnnewProxy(object,handler);}
  • 检测点:
// bom dom 属性 in操作代理对象:window 方法:has 检查属性:callPhantom代理对象:Window.prototype 方法:has 检查属性:callPhantom代理对象:window 方法:has 检查属性:_phantom代理对象:Window.prototype 方法:has 检查属性:_phantom代理对象:window 方法:has 检查属性:phantom代理对象:Window.prototype 方法:has 检查属性:phantom代理对象:navigator 方法:has 检查属性:mimeTypes代理对象:Navigator.prototype 方法:has 检查属性:mimeTypes代理对象:navigator 方法:has 检查属性:__lookupGetter__代理对象:Navigator.prototype 方法:has 检查属性:__lookupGetter__代理对象:navigator 方法:has 检查属性:hardwareConcurrency代理对象:Navigator.prototype 方法:has 检查属性:hardwareConcurrency代理对象:navigator 方法:has 检查属性:__lookupGetter__代理对象:Navigator.prototype 方法:has 检查属性:__lookupGetter__代理对象:navigator 方法:has 检查属性:plugins代理对象:Navigator.prototype 方法:has 检查属性:plugins代理对象:navigator 方法:has 检查属性:__lookupGetter__代理对象:Navigator.prototype 方法:has 检查属性:__lookupGetter__代理对象:navigator 方法:has 检查属性:platform代理对象:Navigator.prototype 方法:has 检查属性:platform代理对象:navigator 方法:has 检查属性:__lookupGetter__代理对象:Navigator.prototype 方法:has 检查属性:__lookupGetter__.....
// 原型函数代理对象:HTMLElement.prototype 方法:has 检查属性:offsetHeight方法:get对象:HTMLCanvasElement.prototype 属性:toDataURL 属性类型:string 属性值:[Function:toDataURL]属性值类型:function方法:get对象:CanvasRenderingContext2D.prototype 属性:getImageData 属性类型:string 属性值:[Function:getImageData]属性值类型:function方法:get对象:CanvasRenderingContext2D.prototype 属性:toBlob 属性类型:string 属性值:[Function:toBlob]属性值类型:function方法:get对象:WebGLRenderingContext.prototype 属性:bufferData 属性类型:string 属性值:[Function:bufferData]属性值类型:function方法:get对象:WebGLRenderingContext.prototype 属性:getParameter 属性类型:string 属性值:[Function:getParameter]属性值类型:function方法:get对象:WebGL2RenderingContext.prototype 属性:bufferData 属性类型:string 属性值:[Function:bufferData]属性值类型:function方法:get对象:WebGL2RenderingContext.prototype 属性:getParameter 属性类型:string 属性值:[Function:getParameter]属性值类型:function方法:get对象:AudioContext.prototype 属性:createAnalyser 属性类型:string 属性值:[Function:createAnalyser]属性值类型:function方法:get对象:AudioContext.prototype 属性:getChannelData 属性类型:string 属性值:[Function:getChannelData]属性值类型:function方法:get对象:OfflineAudioContext.prototype 属性:createAnalyser 属性类型:string 属性值:[Function:createAnalyser]属性值类型:function方法:get对象:OfflineAudioContext.prototype 属性:getChannelData 属性类型:string 属性值:[Function:getChannelData]属性值类型:function....
  • 最后直接调用window.c_sign.toString(i)

2、纯算分析

  • 可以发现最后的值是在Bt函数里面生成

  • 进入到Bt函数发现是一个switch平坦流,无所谓,咱们直接找到return返回结果的地方(有能力的可以还原一下js)

  • 这里我们发现y就是最后的结果,只是拼接了一下102! ,那么我们就可以往后反推,这里我就不一步一步去反推了,直接告诉你们,其实有一个环境数组:j

  • 所以我们只需要观察j里面的字符串从哪里来的:**直接找j.push(**断点即可

  • 首先我们观察第一个怎么来:

这里可以看到,第一,二个就是F和K,直接搜索F =

可以发现F就是随机生成的8位字符串,而k等于 Rt(body的MD5+‘-’+F,31)

这里可以发现Rt加密出来也是32位,有可能是md5,经过校验发现是魔改的MD5,所以直接扣下面,然后再去分析魔改点

  • 继续找第三位

继续搜索I = ,var I = Ct.UdHwk(mt);也就是mt函数在干嘛

这里我们可以看到检测了一堆浏览器指纹,所以这个值我们可以写死

  • 后面的我就不一一带着去找了,说一下怎么来的
// 检测浏览器dom或者bom及原型 默认0z.push("536870911");// 浏览器插件拼接 - 如果没有就是空字符串z.push('');// 时间戳 毫秒 - 如果没有就是空字符串z.push(''+new_date.getTime());// 时间戳 秒z.push((-new_date.getTimezoneOffset()/60)+'')// 判断是否存在UBT_GLOBAL 0 : 1z.push("1")// 判断UBT_GLOBAL 中是否存在 clientId 默认空字符串z.push("09031147110931135002")// 判断UBT_GLOBAL 中是否存在 vid 默认空字符串z.push("1762910091356.7713RmwAJjow")
  • 得到这个数组之后会干嘛呢,猜一猜肯定是会去传charCodeAt,这里你们单独往下跟就可以看到
functionz_charCodeAt(z_shuz){varz_charcode_=[];for(varj=0;j<z_shuz.length;j++){strc=z_shuz[j];for(vari=0;i<strc.length;i++){z_charcode_.push((255&strc.charCodeAt(i)))}z_charcode_.push(0)}returnz_charcode_;}
  • 最后再将得到的这个数组通过base64编码形式转换回去,也是随便更一下就可以更到
z_charcode=z_charCodeAt(z);// pxZ9ApPmFtj9fpToE0d4uJH7vOuCkVFJcuEB9Xm0pXbDt8U8qlKyDxhCD0pSgSXDN 固定字符串// 经过base64 'by0EACXB4jiQKO+7tNmrqF61G9zwThYUkdHlVaPuWgce3sDv5pnSL/2ZRIxJoMf8='salt_='by0EACXB4jiQKO+7tNmrqF61G9zwThYUkdHlVaPuWgce3sDv5pnSL/2ZRIxJoMf8='payload_source="102!";varD=0;while(D<z_charcode.length){varh=z_charcode[D++],k=(D<z_charcode.length)?z_charcode[D++]:NaN,b=(D<z_charcode.length)?z_charcode[D++]:NaN,p=(h>>2);varT,F,K,V=(3&h);if(!isNaN(k)){if(!isNaN(b)){T=((V<<4)|(k>>4)),F=(((15&k)<<2)|(b>>6)),K=(63&b);}else{T=((V<<4)|(k>>4)),F=((15&k)<<2),K=64}}else{T=o.tXtzd(V<<4),F=64,K=64}payload_source+=(((salt_['charAt'](p)+salt_['charAt'](T))+salt_['charAt'](F))+salt_['charAt'](K))}

小结

提示:学习交流主页,星球持续更新中:(+星球主页+v)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 3:59:38

2025最新!9个AI论文平台测评:本科生毕业论文写作全攻略

2025最新&#xff01;9个AI论文平台测评&#xff1a;本科生毕业论文写作全攻略 2025年AI论文平台测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具辅助论文写作。然而&#xff0c;面对市场上五花八门的AI论文平…

作者头像 李华
网站建设 2026/3/27 10:02:45

【光的偏振与光功率 / 能量测量学习笔记】

光的偏振基础理论 偏振态核心分类 线偏光&#xff1a;电场振动方向固定&#xff0c;可拆解为相位一致的两束正交电场。圆偏光&#xff1a;电场振动轨迹呈圆形&#xff0c;由振幅相等、相位差 90 的两束垂直平面波叠加而成。椭圆偏光&#xff1a;电场振动轨迹为椭圆&#xff0c;…

作者头像 李华
网站建设 2026/3/27 18:54:09

大模型流式输出Streaming Output

1. 概述 1.1 什么是流式输出&#xff08;Streaming Output&#xff09; 流式输出&#xff08;Streaming Output&#xff09; 是一种服务端响应模式&#xff1a;服务端在大模型生成内容的过程中&#xff0c;将已生成的部分实时、分批次返回给客户端&#xff0c;而不是等待全部内…

作者头像 李华
网站建设 2026/3/17 8:26:53

Linux系统相关知识

查看软件包的类型 file sougou.deb软件源配置文件 方式一:/etc/apt/sources.list方式二&#xff1a;软件更新器修改完后 sudo apt udpate sudo apt install package-name 安装软件包 sudo apt remove package-name 移除软件包 sudo apt --purge remove pa…

作者头像 李华
网站建设 2026/4/1 0:02:05

当微电网遇上鲁棒优化:一场和不确定性硬刚的实战

微电网两阶段鲁棒优化经济调度程序 关键词&#xff1a;微网优化调度 两阶段鲁棒 CCG算法 经济调度 参考文档&#xff1a;《微电网两阶段鲁棒优化经济调度方法》 仿真平台&#xff1a;MATLAB YALMIPCPLEX 主要内容&#xff1a;构建了微网两阶段鲁棒调度模型&#xff0c;建立了mi…

作者头像 李华
网站建设 2026/3/28 5:27:06

国产数据库:从替代到引领,重塑数字经济核心底座

目录 一、市场爆发&#xff1a;3.3万亿信创浪潮下的国产崛起 二、技术破壁&#xff1a;从“二次开发”到“原生创新”的跨越 1. 分布式架构&#xff1a;支撑海量高并发场景 2. 云原生融合&#xff1a;实现极致弹性与成本优化 3. 多模与AI融合&#xff1a;拓展场景适配能力…

作者头像 李华