news 2026/5/11 1:56:27

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/5/9 16:11:49

数据交易中的数据基础设施与云服务

数据交易中的数据基础设施与云服务 关键词:数据交易、数据基础设施、云服务、数据安全、数据流通 摘要:本文深入探讨了数据交易中数据基础设施与云服务的相关内容。首先介绍了数据交易的背景以及数据基础设施和云服务在其中的重要性,接着详细解释了数据基础设施和云服务的核…

作者头像 李华
网站建设 2026/5/10 8:01:44

2025下半年软考纸质证书领取时间表来啦!

2025年下半年计算机技术与专业技术资格考试纸质证书各地领取时间已出炉&#xff01;部分地区有领取时间限制&#xff0c;通过考试了的同学们抓紧时间领取~一、各地软考纸质证书领取时间汇总1.上海现场领取时间&#xff1a;12月29日快递邮寄时间&#xff1a;12月22日开始2.重庆现…

作者头像 李华
网站建设 2026/5/9 10:14:45

C156D飞腾加固计算机在国产化计算体系中的应用定位

在国产化计算平台逐步落地的过程中&#xff0c;移动计算设备既需要满足自主可控要求&#xff0c;也需要具备在复杂环境中稳定运行的能力。 C156D飞腾加固计算机&#xff0c;正是在这一应用背景下形成的国产化加固计算设备方案。一、产品定位&#xff1a;面向国产化应用的加固计…

作者头像 李华
网站建设 2026/5/9 10:14:54

KAIST AI团队革命性突破:无需深度估计也能让视频自由变换视角

这项由韩国科学技术院&#xff08;KAIST&#xff09;人工智能实验室的金敏晶、金正豪、陈昊英、郑俊河以及朱在乙教授团队完成的研究&#xff0c;于2025年12月18日发表在计算机视觉顶级会议arXiv上&#xff0c;论文编号为arXiv:2512.17040v1。有兴趣深入了解的读者可以通过该编…

作者头像 李华
网站建设 2026/5/10 11:35:16

CRMEB WxJava,微信生态开发外挂来袭!

“CRMEB技术圈大事件”——CRMEB多商户系统Java版接入WxJava&#xff0c;实现微信生态开发升级&#xff01;&#x1f680; 用户体验&#xff0c;丝滑到飞起~ ✅ 快速登录不卡壳&#xff1a;告别登录转圈圈/授权失败&#xff0c;将复杂技术验证流程打包简化&#xff0c;丝滑登录…

作者头像 李华