返回顶部
首页 > 资讯 > 精选 >JS逆向之怎么补浏览器环境
  • 276
分享到

JS逆向之怎么补浏览器环境

2023-07-05 08:07:49 276人浏览 独家记忆
摘要

这篇文章主要讲解了“js逆向之怎么补浏览器环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS逆向之怎么补浏览器环境”吧!一:什么是 “补浏览器环境”?浏览器环境: 是指 JS代码在浏览器

这篇文章主要讲解了“js逆向之怎么补浏览器环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS逆向之怎么补浏览器环境”吧!

一:什么是 补浏览器环境”?

浏览器环境: 是指 JS代码在浏览器中的运行时环境,它包括V8自动构建的对象(即ECMAScript的内容,如Date、Array),浏览器(内置)传递给V8的操作DOM和BOM的对象(如document、navigator);

Node环境:是基于V8引擎的Js运行时环境,它包括V8与其自己的内置api,如fs,Http,path;

Node环境浏览器环境 的异同点可以简单概括如图:

JS逆向之怎么补浏览器环境

所以我们所说的 “补浏览器环境” 其实是补浏览器有 而node没有的环境,即 补BOM和DOM的对象;

二:为什么要 补浏览器环境”?

对于逆向老手而言,“补环境” 这个词不会陌生,当我们每次把辛辛苦苦扣出来的 “js加密算法代码”,并且放在浏览器环境中能正确执行后,就需要将它放到Node环境 中去执行,而由于Node环境浏览器环境之间存在差异,会导致部分JS代码在浏览器中运行的结果 与在node中运行得到的结果不一样,从而影响我们最终逆向成果;eg:

function decrypt() {    document = false;    var flag = document?true:false;    if (flag) {        return "正确加密"    } else {        return "错误加密";    }}在浏览器环境运行时 flag为true,然后得到正常结果;在Node环境运行时 flag为false,然后得到错误结果;

所以我们需要 “补浏览器环境”,使得扣出来的 “js加密算法代码”Node环境中运行得到的加密值,与其在 浏览器环境中运行得到的加密值一致。 即对于这段 “js加密算法代码” 而言,我们补出来的环境与浏览器环境一致。

三:怎么 补浏览器环境”?

要想 “补浏览器环境”,首先我们得知道 “js加密算法代码” 到底使用了哪些浏览器环境API,然后再对应去补上这些环境;

那么我们该如何监测 “js加密算法代码” 对浏览器环境API的使用呢?

毫无争议:使用Proxy来监测浏览器环境API的使用,辅助补浏览器环境

Proxyes6提供的代理器,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。 它可以代理任何类型的对象,包括原生数组,函数,甚至另一个代理;拥有递归套娃的能力!!

也就是说 我们代理某个对象后,我们就成了它的中间商,任何JS代码对它的任何操作都可以被我们所拦截!!

# 对navigator对象进行代理,并设置拦截后的操作var handler = {set:funcA,get:funcB,deleteProperty:funcC,has:funcD ...};navigator = new Proxy(navigator,handler);# 对代理后的navigator进行各种操作都会被拦截并触发对应处理函数navigator.userAgent 会被拦截并触发 get  funcBnavigator.userAgent = "xx" 会被拦截并触发 set funcAdelete navigator; 会被拦截并触发 deleteProperty funC"userAgent" in navigator  会被拦截并触发 has funD ...等等... 任何操作都可以被拦截

基于Proxy的特性,衍生了两种补环境思路:

  1. 递归嵌套Proxy以此来代理浏览器所有的BOM、DOM对象及其属性,再配合node vm2模块提供的纯净V8环境,就相当于在node中,对整个浏览器环境对象进行了代理,JS代码使用任何浏览器环境 api都能被我们所拦截。然后我们针对拦截到的环境检测点去补。

  2. 搭建补环境框架,用JS模拟浏览器基于原型链去伪造实现各个BOM、DOM对象,然后将这些JS组织起来,形成一个纯JS丐版浏览器环境,我们补的纯JS丐版浏览器环境越完善,就越接近真实浏览器环境,能通杀的js环境检测就越多。最终完美通杀所有JS环境检测!!

第一种思路虽然实现简单,主要是对Proxy拦截器的使用 ,但是具备的环境监测能力有限,对较复杂的原型链等难以监测,即使是二次开发也上限不高;并且遇到JS使用了很多环境时手补也相当麻烦;

第二种思路虽然实现较为复杂,但是上限极高,且可以完美兼容第一种思路,具备可成长的通杀潜质。

所以业内补环境框架几乎都是基于第二种思路,先搭建一个补环境框架的骨架,将常见浏览器环境BOM、DOM对象补齐,如:window、location、Document、navigator等,等空闲时或工作遇到其他浏览器环境BOM、DOM对象,再将它补进来。补的越完善,我们能通杀JS环境检测越多。

优点:

  • 补的越完善,能通杀JS环境检测越多。最终完美通杀所有JS环境检测!!;

  • 一键运行输出目标JS中所有环境检测点;

  • 生成的最终代码可直接用于生产环境(可直接供nodejs、v8使用);

  • 告别玄学补环境,不再一行行去debugger,极大提高工作效率。

  • 可以在Chrome浏览器进行无浏览器环境调试。

  • 新人弯道超车必备

  • …

四:补环境框架”实战

传统补环境格式:

// 环境头:window = global;navigator= {userAgent:"Mozilla/5.0 (windows NT 1";}// 扣出来的JS..............

传统补环境太简陋,而且不够通用,代码组织混乱,我们最好将其组织为一个项目

补环境框架项目整体结构:

JS逆向之怎么补浏览器环境

那么实现这么一个浏览器补环境框架需要哪些步骤哪些考虑呢?

  • 先确定框架运行主流程,即入口文件 。

  • 每个BOM、DOM对象的实现都使用一个单独的js文件,便于定位及维护。

  • 将这些BOM、DOM文件按照原型链的优先顺序进行读取,拼接成整个浏览器环境。

  • 思考如何去实现一个BOM、DOM对象使其和浏览器一致;(这个是影响框架上限的重要因素,同时也包含大量重复性人力工作)

  • 事件的处理(对行为验证码有帮助)

  • 思考如何保证JS中使用到的所有浏览器环境都能被我们所检测;(这个是影响框架上限的重要因素)

  • 如何设计优化补环境框架项目的可扩展、可维护性;(非常必要)
    …
    还有一些其他细节思考,我们的目标框架就是 一个易于可扩展与维护、能检测到JS中所有浏览器环境API的使用、实现了常见浏览器环境方法等,让我们在之后补环境中,达到通杀效果。

如果对于原理及实现方向 思考不够全面、深入,那么实现的框架上限会有限,出现玄学的概率就大了,我也是经历了很长时间打磨,多次推倒重来、借鉴多个课程,最终实现这个理想的框架。

下面就是一些具体的实现:

以下就是主流程入口骨架:

var  fs = require('fs');var catvm2 = require('./CatVm2/catvm2.node.js');const {VM,VMScript} = require('vm2'); //看作纯净V8var catvm2_code = catvm2.GetCode();  //获取所有代码(工具代码、补的所有BOM、DOM对象)var WEB_js_code = fs.readFileSync(`${__dirname}/target/get_b_fz.js`) ; // 获取目标网站js代码var log_code = "\r\ncatvm.print.getAll();debugger;\r\r";var all_code = catvm2_code+web_js_code+log_code;fs.writeFileSync(`${__dirname}/debugger_bak.js`,all_code);const script = new VMScript(all_code,`${__dirname}/debugger.js`); //真实路径,浏览器打开的就是该缓存文件const vm = new VM(); // new 一个纯净v8环境debuggervm.run(script); // 在V8环境中运行调试debugger

骨架搭好之后我们就要去补对应的BOM、DOM对象,比如补Navigator

先在浏览器环境观察该对象:Navigator

能否进行new Navigator,不能的话则在其构造函数定义中抛出异常,能的话不抛;

var dsf_tmp_context = catvm.memory.variable.Navigator = {};var Navigator = function Navigator() { // 构造函数throw new TypeError("Illegal constructor");}; catvm.safefunction(Navigator);//13

查看其原型Navigator.prototype 的属性、方法、原型链,

发现Navigator原型属性、方法不能通过原型调用,即
Navigator.appVersion 会抛出异常。

发现 其原型链只有一层,即Navigator.prototype.__proto__ === Object.prototype

在浏览器环境观察其实例对象:navigator

查看其属性、方法与 原型上的差异,发现差不多,基本都是继承原型的。

因此可以简单补成下面这样:

Object.defineProperties(Navigator.prototype, {    [Symbol.toStringTag]: {value: "Navigator",    configurable: true}});var navigator = {};navigator.__proto__ = Navigator.prototype;Navigator.prototype.plugins = [];Navigator.prototype.languages = ["zh-CN", "zh"];Navigator.prototype.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/95.0.4638.69 Safari/537.36';Navigator.prototype.platfORM = 'Win32';Navigator.prototype.maxTouchPoints = 0;Navigator.prototype.onLine = true;for (var _prototype in Navigator.prototype) {    navigator[_prototype] = Navigator.prototype[_prototype];    if (typeof (Navigator.prototype[_prototype]) != "function") {        Navigator.prototype.__defineGetter__(_prototype, function () {            debugger;            var e = new Error();            e.name = "TypeError";            e.message = "Illegal constructor";            e.stack = "VM988:1 Uncaught TypeError: Illegal invocation \r\n " +                "at <anonymous>:1:21";            throw e;            // throw new TypeError("Illegal constructor");        });    }}// 加上代理navigator = catvm.proxy(navigator);

注:上面实例只是一种补环境思路,是基于对象.属性粒度我个人用的是另一种思路,基于对象.属性.特性粒度即Object.getOwnPropertyDescriptor 的value,writable..等,虽然需要补代码更多,但是模拟的效果更完美,理论上限极高。

浏览器对象及属性实在太多了,我们不可能手动补那么对象属性,因此要想补出一个完美浏览器环境,我们需要编写浏览器环境自吐脚本。即在浏览器执行该脚本,它会将某个浏览器环境对象的所有属性与方法,拼接成我们框架所需要的补环境代码,我们直接粘贴进来,稍微改改即可。

我们可以借助:Reflect.ownKeys(real_obj)来获取该对象的所有属性与方法,
然后对其 attr进行各种判断、处理,最终拼接成我们需要的样子。

var all_attrs = Reflect.ownKeys(real_obj);var continue_attrs = ["prototype", "constructor"];for (let index = 0; index < all_attrs.length; index++) {    let attr_name = all_attrs[index];    // 暂时不处理在 continue_attrs 中的属性    if (continue_attrs.indexOf(attr_name) != -1) {        console.log(`遇到 ${attr_name},跳过`);        continue    }        if (attr_name == Symbol.toStringTag) {            result_code = `Object.defineProperties(${repair_obj}, {    [Symbol.toStringTag]: {value: "${real_obj[Symbol.toStringTag]}",    configurable: true}});//23\n`;            symbol_code_ls.push(result_code);            continue        }    }    ..........太长,略过(下面框架源码中有)

每补完一个浏览器对象之后,可以运行起来与真实浏览器进行对比,逐步优化,最终达到完美效果。

五:补环境框架”成品源码

补环境框架俨然成为JS逆向人员的大杀器,也是众多面试官的考察点。我们已经了解了 它的原理及实现步骤,接下来我们可以尝试自己从头实现一个完善的补环境框架,但是这会花费很长一段时间来进行开发,而且其中有很多重复性工作比较无聊(复制粘贴对比等)。

部分成果展示(以头条 sign值为例):

监测到的检测点,做过的靓仔可以看看是不是都有

JS逆向之怎么补浏览器环境

与真实浏览器对比

JS逆向之怎么补浏览器环境

感谢各位的阅读,以上就是“JS逆向之怎么补浏览器环境”的内容了,经过本文的学习后,相信大家对JS逆向之怎么补浏览器环境这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: JS逆向之怎么补浏览器环境

本文链接: https://lsjlt.com/news/350426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS逆向之怎么补浏览器环境
    这篇文章主要讲解了“JS逆向之怎么补浏览器环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS逆向之怎么补浏览器环境”吧!一:什么是 “补浏览器环境”?浏览器环境: 是指 JS代码在浏览器...
    99+
    2023-07-05
  • JS逆向之浏览器补环境图文详解
    目录前言一:什么是 “补浏览器环境”?二:为什么要 “补浏览器环境”?三:怎么 “补浏览器环境”?四:&ldq...
    99+
    2023-03-01
    js浏览器补环境 浏览器javascript js逆向工具
  • 浏览器运行环境是怎样的
    这篇文章主要讲解了“浏览器运行环境是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“浏览器运行环境是怎样的”吧!国际五大浏览器品牌:按照全球使用率降序排...
    99+
    2024-04-02
  • 怎么判断是浏览器还是node环境
    这篇文章将为大家详细讲解有关怎么判断是浏览器还是node环境,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。node中window是未定义;setImmediate是定义的...
    99+
    2024-04-02
  • js使用navigator.userAgent判断当前浏览器所处的环境
    目录场景1:判断页面是在手机端还是PC端打开场景2:判断页面是在手机端,平板端还是PC端打开场景3:获取操作系统类型,判断是Android或者IOS场景4:判断当前环境是否是微信环境...
    99+
    2023-05-17
    js navigator.userAgent浏览器环境 js navigator.userAgent浏览器
  • js怎么获取浏览器的参数
    本篇内容主要讲解“js怎么获取浏览器的参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js怎么获取浏览器的参数”吧!实例如下:function ge...
    99+
    2024-04-02
  • windows谷歌浏览器怎么禁用js
    今天小编给大家分享一下windows谷歌浏览器怎么禁用js的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。谷歌浏览器禁用js的...
    99+
    2023-07-01
  • 怎么理解浏览器事件循环
    本篇内容介绍了“怎么理解浏览器事件循环”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么要有事件循环JS...
    99+
    2024-04-02
  • 浏览器崩溃提示此网页包含重定向循环怎么办?
    当某个网站浏览的出现崩溃,“此网页包含重定向循环”的解决办法。 奇虎360安全卫士 V10.0.0.2001 官方正式版类型:系统安全大小:70.59MB语言:简体中文时间:2015-04-23查...
    99+
    2023-06-17
    浏览器崩溃怎么办 ie浏览器崩溃怎么办 谷歌浏览器崩溃怎么办 网页 重定向 浏览器
  • Android逆向之旅—反编译利器Apktool使用教程(Apktool的安装使用)建议新手浏览
    文章目录 一、下载软件第一步(apktool.bat)第二步(apktool.jar) 二、安装软件三、使用软件解包修改文件重打包签名生成keystore文件 进行签名 四、使用 一、下载软件 首先下载a...
    99+
    2023-08-17
    android android studio
  • JS兼容所有浏览器的DOMContentLoaded事件怎么用
    小编给大家分享一下JS兼容所有浏览器的DOMContentLoaded事件怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实...
    99+
    2024-04-02
  • js关闭浏览器时退出账号怎么处理
    这篇文章主要讲解了“js关闭浏览器时退出账号怎么处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“js关闭浏览器时退出账号怎么处理”吧!经典做法众所周知,为了账户安全,用户未主动点击注销系统...
    99+
    2023-06-21
  • 浏览器事件循环与vue nextTicket怎么实现
    小编给大家分享一下浏览器事件循环与vue nextTicket怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!同步:就是在...
    99+
    2024-04-02
  • js中startsWith函数不能在任何浏览器兼容怎么办
    小编给大家分享一下js中startsWith函数不能在任何浏览器兼容怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在做js...
    99+
    2024-04-02
  • css布局中怎么用JS判断浏览器类型及版本
    这篇文章主要讲解了“css布局中怎么用JS判断浏览器类型及版本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css布局中怎么用JS判断浏览器类型及版本”吧!...
    99+
    2024-04-02
  • IE浏览器中值得关注的JS问题是怎么样的
    IE浏览器中值得关注的JS问题是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。刚才在调试js,在mozilla中一切正常,但是在ie中却报告有configuration...
    99+
    2023-06-03
  • JavaScript【浏览器环境概述(BOM)、回流和重绘 、定时器之 setTimeout()、定时器之 setInterval()、定时器实操、防抖(debounce)】(十六)
    目录 浏览器环境概述(BOM) 代码嵌入网页的方法  加载使用的协议来源地址:https://blog.csdn.net/m0_58719994/article/details/132259180...
    99+
    2023-08-31
    html 回流 javascript 定时器 防抖 原力计划
  • 怎么解决各个浏览器之间的兼容问题
    怎么解决各个浏览器之间的兼容问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。各个浏览器之间的兼容性问题,同样的HTML5和CSS5样式,但是浏览器表现的效果不一样。一,什...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作