2026/1/11 12:50:42
网站建设
项目流程
品牌网站建设有什么作用,什么网站免费做简历,网站建设优化汕头,wordpress 支付宝赞助文章目录概要整体架构流程技术名词解释小结概要 提示#xff1a;仅供学习#xff0c;不得用做商业交易#xff0c;如有侵权请及时联系
也是很久没有更新教学文章了#xff0c;这次就更新一波纯算和补环境 逆向#xff1a;某程 header请求头参数 w-payload-source 纯算、补…文章目录概要整体架构流程技术名词解释小结概要提示仅供学习不得用做商业交易如有侵权请及时联系也是很久没有更新教学文章了这次就更新一波纯算和补环境逆向某程 header请求头参数 w-payload-source 纯算、补环境分析URLaHR0cHM6Ly9mbGlnaHRzLmN0cmlwLmNvbS9vbmxpbmUvbGlzdC9vbmV3YXktc2hhLWJqcz9fPTEmZGVwZGF0ZT0yMDI1LTEyLTI2JmNhYmluPVlfU19DX0Y整体架构流程提示加密位置分析流程1、搜索关键词w-payload-source2、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!isNaNproperty!encodeURIproperty!Uint8Arrayproperty!undefinedproperty!JSONproperty!Number!no_print.includes(property)property!Symbol.for(nodejs.util.inspect.custom)typeofproperty!symbol){if(propertyglobal){returnundefined;}if(propertyBuffer){returnundefined;}AsObj.print(方法:,get,对象:,WatchName,属性:,property,属性类型:,typeofproperty,属性值:,typeoftarget[property]object?object:target[property],属性值类型:,typeoftarget[property]);}if(WatchNametop){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(varj0;jz_shuz.length;j){strcz_shuz[j];for(vari0;istrc.length;i){z_charcode_.push((255strc.charCodeAt(i)))}z_charcode_.push(0)}returnz_charcode_;}最后再将得到的这个数组通过base64编码形式转换回去也是随便更一下就可以更到z_charcodez_charCodeAt(z);// pxZ9ApPmFtj9fpToE0d4uJH7vOuCkVFJcuEB9Xm0pXbDt8U8qlKyDxhCD0pSgSXDN 固定字符串// 经过base64 by0EACXB4jiQKO7tNmrqF61G9zwThYUkdHlVaPuWgce3sDv5pnSL/2ZRIxJoMf8salt_by0EACXB4jiQKO7tNmrqF61G9zwThYUkdHlVaPuWgce3sDv5pnSL/2ZRIxJoMf8payload_source102!;varD0;while(Dz_charcode.length){varhz_charcode[D],k(Dz_charcode.length)?z_charcode[D]:NaN,b(Dz_charcode.length)?z_charcode[D]:NaN,p(h2);varT,F,K,V(3h);if(!isNaN(k)){if(!isNaN(b)){T((V4)|(k4)),F(((15k)2)|(b6)),K(63b);}else{T((V4)|(k4)),F((15k)2),K64}}else{To.tXtzd(V4),F64,K64}payload_source(((salt_[charAt](p)salt_[charAt](T))salt_[charAt](F))salt_[charAt](K))}小结提示学习交流主页星球持续更新中星球主页v