[js逆向补环境专栏]过xhs的x2 x-s环境检测 -- part1

news2024/11/26 2:42:53

[补环境]过xhs的x2环境检测 – part1
Xhs的jsvmp用算法逆向确实容易头秃,扣代码对vmp而言也用处不大,此时补环境的重要性就出来了,通过把运行js的环境伪造得像浏览器一样,就能模拟出好像请求都是通过浏览器发起的一样。

这里要区分两个问题:

1.补环境是为了补充nodejs没有的一些方法,对象等

2.补环境同样是为了规避nodejs被检测

这两个听起来很类似但确实不同

比如如果node运行代码提示没有window对象,那么这个属于情况1

但是如果代码里有这么一段代码:

let nd = global==undefined
if (!nd){
X2=“此人不是浏览器”
//做一些见不得人的检测勾当,把你的调试引入歧途……
}

这样的代码即为检测nodejs的代码,这些代码悄悄地进行检测,然后把xhs的x2参数变得和浏览器不一样,让你无法得到正确的x2,

为了生动形象,加深对技术本质的理解,本着知其然还要知其所以然的态度,我们以xhs的代码为例,一步一步深入挖掘,看看补环境的是是非非……

故事开始……

今天我拿到了xhs的加密js源码,我直接一个Ctrl c把所有的代码,复制到本地,添加下面的代码测试加密函数:

var u = “/api/sns/web/v2/comment/page?note_id=648723c9000000001300a677&cursor=”;
function get_xsxt(url, json_data){
let ans = window._webmsxyw(url, json_data)
return ans
}
let ans = get_xsxt(u,“”)
console.log(ans)

保存为xhs.js,好!打开终端,输入node xhs.js,坐等结果,好!逆向真简单!
在这里插入图片描述

不出意外的话还是出意外了,提示没有window对象,这就是补环境的发源之地,行吧,那我就补上window对象!也就是说这份代码会使用到window对象里面的一些东西,包括但不限于使用里面的对象啊、方法啊、值啊等的,这个时候补充window=global、(或者window={},然后一步一步的补充需要的对象),但是window=global简单粗暴但是也容易被检测到你使用的js runtime和浏览器不一样,那么你就坐等被检测吧……,但是!我们由浅入深,就看看他妈的,他能怎么检测,我就用window=global试试先:
在这里插入图片描述

提示没有RegExp这个东西,但是明明global对象是有这个函数的啊:

在这里插入图片描述
在这里插入图片描述

不管他,我们按照浏览器的将RegExp补充在window对象上,我们补上:

window.RegExp = function RegExp(){};
再次运行:

在这里插入图片描述

好家伙,还是有问题,于是,我们一观察调用位置,也许_ace_0a916._ace_936这个对象就不是window呢?

于是我们直接打个断点来进行调试看看,到底是谁调用了RegExp属性!

在这里插入图片描述

我勒个去去,调用者936是undefined……,那肯定是没有RegExp属性的……,那么这条路走到这,是不是意味着走不下去了呢?如果就自己手动往上跟栈的话,是比较头疼的……那么,我们不妨试试一开始补window={}看看效果如何?

结果出乎意料的相似,是一样的,那么现在怎么办呢?打开思路,我们去浏览器同样断下来看看这个地方正确的应该是什么?
在这里插入图片描述

那么就奇了怪了,为什么我们补充了window对象却没有??

这时候,我们请出所谓的补环境框架,看看这框架到底是如何解决我们这些问题的?:

通过补环境的框架可知,它是因为有circle的引用,导致我们上面的补法出现问题,因为我们上面的补法,window下面并没有window,于是我们加上看看!:
在这里插入图片描述

let window = global
window.RegExp = function RegExp(){};
window.window = window
再次运行:

在这里插入图片描述

这个RegExp的报错我们就通过了,那么为什么这个补环境的框架能够捕捉到这种情况,而我们手动没法捕捉到呢?这就是得益于proxy的运用,每次一旦访问和设置proxy代理的对象的值,都会hook到,也就是链式的hook,于是,便有了补环境框架的由来。

书归正传,我们现继续手动补着看!

现在需要补充createElement,这个定义在了document上,我们直接补充:

let document = {};
document.createElement = function createElement(tagName) {
let tagname = tagName.toLowerCase() + ‘’
debugger;
return {}
}
运行看看:

在这里插入图片描述

还是这个错,借鉴上面的思路,我们需要把document作为window的属性加入进去,于是调整补充的代码:

let document = {};
document.createElement = function createElement(tagName) {
let tagname = tagName.toLowerCase() + ‘’
debugger;
return {}
}

let window = global
window.RegExp = function RegExp(){};
window.document = document;

window.window = window
运行看看:

在这里插入图片描述

补充这个getAttribute,这个有过正向设计的经验的人都知道,这是HTML元素获取自己的属性的方法,那么假如你是没有正向设计的经验的人,也可以通过这个网站去查看,(不过我建议最好学习正向设计,后面看效益也会在星球发布教程,主打一融会贯通和深入理解)。

getAttribute 如下资料:

在这里插入图片描述

这个方法应该定义在被创建的元素的对象上,那么我们这次仅仅针对xhs就直接这样补:

let document = {};
document.createElement = function createElement(tagName) {
let tagname = tagName.toLowerCase() + ‘’
debugger;
return {
“getAttribute”:function getAttribute(attName){
debugger;
return “”
}
}
}

let window = global
window.RegExp = function RegExp(){};
window.document = document;

window.window = window
运行看看:

在这里插入图片描述

也不行,这个就奇怪了……,
那么答案只可能有一个就是,调用者不是创建的元素,而是另有其人!
那么我们可以,在这个地方打上断点,去浏览器看是什么元素调用的getAttribute属性:

通过断点能看到是documentElement,查资料如下:

因此补充为:

document.documentElement = {}
document.documentElement.getAttribute = function getAttribute(attName) {
console.log(“getAttribute->”,attName)
}

再次运行:

在这里插入图片描述

这里也是老方法,打上断点对比浏览器得出,8721是getContext方法,于是补充:

let window = global;
let document = {};

document.documentElement = {}
document.documentElement.getAttribute = function getAttribute(attName) {
console.log(“getAttribute->”,attName)
}
document.createElement = function createElement(tagName) {
let tagname = tagName.toLowerCase() + ‘’
console.log(“createElement->”,tagname)
const canvas = new (function () { })
canvas.getContext = function getContext(pixs) {
console.log(“getContext->”, pixs)
debugger;
return {}
}
return canvas
}
window.RegExp = function RegExp(){};
window.document = document;
window.window = window;
再次运行:

在这里插入图片描述

终于输出值了,很明显值不对,此时的x2为:

在这里插入图片描述

而浏览器的x2为:x2=0|0|0|1|0|0|1|0|0|0|1|0|0|0|0,显然是不正确的

肯定是某些环境检测没有通过,导致的,就比如我们的cookie是必须的,但是手动补的方法,从头到尾对于我们来说对cookie的关键性都是无感知的,因此,这种错误驱动型的补环境策略并不靠谱。

因此,我们需要引入proxy代理,便于对那些不抛出异常的检测点进行捕捉,然后补上环境,我们放在下一篇part2中介绍。
记得加入我们的学习群呀!
529528142

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光模块温度报警的原因及解决措施

光模块是数据中心网络中的关键组件,它们在高温环境下可能会受到影响。如果光模块的温度超过正常范围,可能会导致网络故障和光模块损坏。因此,了解光模块的温度报警并采取相应的解决措施非常重要。 一、光模块温度报警的原因 光模块温度报警通…

Linux之虚拟主机功能

目录 虚拟主机功能 概述 基于 IP 地址的虚拟主机 原理 案例 --- 增加多个IP地址,实现基于不同IP地址的虚拟主机功能 基于端口号的虚拟主机 原理 案例 --- 基于不同端口号的虚拟主机 基于域名的虚拟主机 原理 域名解析 案例 --- 使用2个域名建立虚拟主机网…

2023年6月GESP C++ 二级试卷解析

2023年6月GESP C 二级试卷解析 一、单选题(每题2分,共30分) 1.高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点…

问ChatGPT如何优雅地分手/离婚,然后由心理学专家验证它说对了什么

ChatGPT是一种由AI驱动的写作生成器,它利用互联网上的各种信息回复人类问题与要求。它可以回答问题、讲笑话、创意写作和整理研究。 ChatGPT可以取代艺术家吗?ChatGPT可以创作交响曲吗?ChatGPT的内容是否都合乎伦理?面对AI的完全…

iTOP-2K1000开发板挂载U盘和固态到开发板

1.挂载固态硬盘分区 输入命令 mount /dev/sdb1 /mnt/将固态硬盘的分区挂载到/mnt 目录下,/dev/sdb1 为开发板实际识 别的固态硬盘节点 ,大家一定要根据自己开发板的实际情况决定,如下图所示: 2.挂载 U 盘分区 输入命令 fdisk -…

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…

【数据库技术】NineData数据复制,加速实时数仓构建

8 月 30 日,由 NineData 和 SelectDB 共同举办的主题为“实时数据驱动,引领企业智能化数据管理”的线上联合发布会,圆满成功举办!双方聚焦于实时数据仓库技术和数据开发能力,展示如何通过强大的生态开发兼容性&#xf…

项目:智慧教室(cubemx+webserver)

一。项目需求 二。实现外设控制 1.cubemx创建工程 (1)RCC配置为外部时钟,修改时钟参数 (2)SWD配置:为了不引脚冲突,使用 (3)串口的使用(USART1,…

打破时空限制:海外网红营销中的直播与虚拟互动

随着全球互联网的普及和技术的迅速发展,传统的商业模式也在不断演变。其中,海外网红直播带货成为了一种引人注目的全新营销方式。近年来,虚拟技术的蓬勃发展为海外网红直播带货提供了新的可能性,不仅丰富了消费者的购物体验&#…

2023UTONMOS斯珂塔全球电竞大赛在粤举办

8月28日,2023 UTONMOS斯珂塔全球电竞大赛于中国广东举办。 此次大赛是由上海和数信息科技集团有限公司与广东关氏集团共同主办的全球性电子竞技盛会,其汇聚国内外头部行业嘉宾、全球的电竞爱好者参与,以和数集团旗下的3D国风玄幻MMORPG链游《…

【遮天】李小曼回归,新形象无差云曦,短板竟是身材?

Hello,小伙伴们,我是小郑继续为大家深度解析遮天 最新一集《遮天》已经更新,在成功卖掉段德之后,叶凡便离开妖帝坟冢,毕竟他身上拥有庞博从妖帝坟冢带出来的道经和被誉为中州至宝的绿铜 虽然这两样物品都在叶凡的苦海中&#xff0…

轴向磁通电驱动解析

轴向磁通电机的技术创新和量产应用,或将有效解决电动汽车领域目前所面临的一些突出难题,比如轻量化、扭矩密度和人们最为关心的续航里程等。在奔驰汽车刚刚发布的Vision One Eleven概念车,以及此前已经面世的法拉利SF90 Stradale、296GTB和迈…

突破5G封锁!逆风翻盘!华为新机Mate60王者归来 | 百能云芯

外界关注的华为Mate60系列手机「低调」上线,于29日突然开卖最新款旗舰手机Mate 60 Pro,多项实测数据显示,这台智能手机支持5G网络,意味华为与中芯国际携手突破美国的5G芯片封锁。但华为拒绝证实,表示要等9月发布会。 华…

c++图论免费ppt,简单深度理解图论

本篇博文想分享一个ppt,是帮助大家简单深度理解c图论. 作者承诺:分享的东西没有病毒,是资料。 分享的东西一个是ppt,ppt里面是150页的,里面将带领大家简单深度理解c图论,还有一个就是里面例题的数据,大家可以按照数据…

5年测试在职经验之谈:2年功能测试、3年自动化测试,从入门到不可自拔...

毕业3年了,学的是环境工程专业,毕业后零基础转行做软件测试。 已近从事测试行业8年了,自己也从事过2年的手工测试,从事期间越来越觉得如果一直在手工测试的道路上前进,并不会有很大的发展,所以通过自己的努…

Elasticsearch终端命令行用法大全

API作用使用场景curl localhost:9200/_cluster/health?pretty查看ES健康状态curl localhost:9200/_cluster/settings?pretty查看ES集群的设置其中persistent为永久设置,重启仍然有效;trainsient为临时设置,重启失效curl localhost:9200/_ca…

2023蓝帽杯初赛取证方向

案情介绍 2021年5月,公安机关侦破了一起投资理财诈骗类案件,受害人陈昊民向公安机关报案称其在微信上认识一名昵称为yang88的网友,在其诱导下通过一款名为维斯塔斯的APP,进行投资理财,被诈骗6万余万元。接警后&#xf…

冠达管理:市盈率公式?

市盈率是一种用来衡量公司股票价格相对于每股收益的目标。市盈率公式为市场价格除以每股收益。市盈率既能够用来衡量某个股票的价值,也能够用来比较不同公司之间的股票价格。本文将从市盈率的定义、计算方法、运用范围以及市盈率的局限性等多个角度来分析市盈率公式…

解决paramiko库在密码为空的情况下登陆失败的问题

发现源码client.py文件中缺少了在该情况下的逻辑进入,添加以下内容即可

c语言练习题--5

以上是valgrind的安装