news 2026/4/16 5:47:32

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/12 0:51:57

SQL学习应用工作场景(2)--执行优先级+语法顺序+保留2位小数

前言&#xff1a;我们先看需求&#xff0c;拆解分析思考。然后再实操写SQL。然后分析我中途写的时候遇到的问题以及解决方法&#xff0c;最后在此基础上优化扩展~~~~想看哪个部分的根据目录跳转吧(*^▽^*)一、需求描述&#xff1a;我们需要计算在2025-12-24之后的2条listing的净…

作者头像 李华
网站建设 2026/4/15 12:17:10

Scala 数组

Scala 数组 概述 Scala 是一门多范式编程语言,它结合了面向对象和函数式编程的特性。在 Scala 中,数组是一种基本的数据结构,用于存储一系列有序的元素。本文将详细介绍 Scala 数组的概念、创建方法、操作方法以及一些高级特性。 创建数组 在 Scala 中,数组的创建主要有…

作者头像 李华
网站建设 2026/4/12 1:09:54

MySQL 知识点:函数索引(Functional Index)

MySQL 技术文档&#xff1a;函数索引&#xff08;Functional Index&#xff09; 1. 概述 在 MySQL 8.0.13 之前&#xff0c;索引必须关联到表的列或列的前缀。如果查询条件对列使用了函数&#xff08;如 WHERE UPPER(name) TOM&#xff09;&#xff0c;即使 name 字段有索引…

作者头像 李华
网站建设 2026/4/12 20:37:15

2026年AI产品经理进化论:当“业务直觉”遭遇“技术理性”

展望2026年&#xff0c;AI产品经理这一角色正站在一个关键转折点上。一边是传统产品领域赖以成功的深度用户洞察与敏捷迭代能力&#xff0c;另一边是驱动AI产品的复杂技术逻辑与数据依赖&#xff0c;两者之间正在形成一种深刻的张力。一位资深产品总监曾感慨&#xff1a;“过去…

作者头像 李华
网站建设 2026/4/9 22:15:02

2025最新!研究生必备8个AI论文工具:开题报告与文献综述全测评

2025最新&#xff01;研究生必备8个AI论文工具&#xff1a;开题报告与文献综述全测评 2025年研究生必备AI论文工具测评&#xff1a;功能与效率的双重考量 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的研究生开始依赖AI工具提升论文写作效率。然而&#xff0c…

作者头像 李华