迷失 - JavaScript
type: channel
link: https://blog.tx.sb/tag/JavaScript/
items: JS逆向常见问题解决方式

JS逆向常见问题解决方式
type: item
date: 2025-02-13T06:24:00+00:00
description: web js逆向 web页面大家都不陌生，在web开发过程中后端负责程序架构和数据管理，前端负责页面展示和用户交互，有种不严谨的说法是：前端代码给浏览器看，后端代码给服务器看。 有开发经验的同学对前后端交互的理解会更深一点，在这种前后端分离的开发方式中，以接口为标准来进行联调整合。为了保证接口在调用时数据的安全性，也是为了防止请求的参数被篡改，大多数接口都进行了请求签名、身份认证、动态Cookie等机制。另外部分网站会对返回的数据进行加密，通常利用AES、RSA等加密方式，也有在传输时对数据进行序列化，比如Protobuf等，这些会在后面进行详细讲解。 请求签名十分常见，比如URL中的加密参数sign，身份认证也有很多例子，比如动态Cookie。这些参数的生成方法都是Js来控制的，如果想要直接从接口上获取数据，就要去调试分析JavaScript的调用逻辑、堆栈调用关系来弄清楚网站加密的实现方法，根据网站的参数生成规则还原加密参数，可以称这个过程为Js逆向。 我们总结了一下目前加密参数的常用逆向方式，一种是根据源码的生成逻辑还原加密代码，另一种是补环境Copy源码模拟加密参数生成，还有一种是通过RPC的方式远程调用。 在一些逆向案例中，其中的关键就是将浏览器环境移植到Node环境中，Node Js采用的内核也为V8引擎，该引擎调用对方Js的可行性并不是100%，同时由于Node没有界面渲染，因此在浏览器中可使用的例如window、navigator、dom等操作在node中是不存在的，所以对于Node Js的环境搭建和浏览器环境补齐也是Js逆向需要掌握的。 还有就是Chrome作为Js逆向的核心工具，熟练掌握Chrome的控制台、插件编写就足够应对绝大多数的抓包、调试、Hook等，这些内容都会在后续进行讲解。 第一章 逆向基础 1.1 语法基础 Js调试相对方便，通常只需要chrome或者一些抓包工具、扩展插件，就能顺利的完成逆向分析。但是Js的弱类型和语法多样，各种闭包，逗号表达式等语法让代码可读性变得不如其他语言顺畅。所以需要学习一下基础语法。 基本数据类型 字符串 String 数字 Number 布尔 Boolean 空值 Null 未定义 Undefined 独一无二的值 Symbol 引用数据类型 对象 Object 数组 Array 函数 Function 语句标识符 在条件为true时重复执行 do……while 在条件为true时执行 while 循环遍历 for 条件判断 if……else 根据情况执行代码块 switch 退出循环 break 异常捕获 try……catch……finally 抛出异常 Throw 声明固定值的变量 const 声明类 class 停止函数并返回 return 声明块作用域的变量 let 声明变量 var 断点调试 debugger 当前所属对象 this 算数运算符 加 + 减 - 乘 * 除 / 取余 % 累加 ++ 递减 – 比较运算符 等于 == 相等值或者相等类型 === 不等于 != 不相等值或者不相等类型 !== 大于 > 小于 < 大于等于 >= 小于等于 <= 在JavaScript中将数字存储为64位浮点数，但所有按位运算都以32位二进制数执行。在执行位运算之前，JavaScript将数字转换位32位有符号整数。执行按位操作后，结果将转换回64位JavaScript数。 Javascript 函数 JavaScript 中的函数是头等公民，不仅可以像变量一样使用它，同时它还具有十分强大的抽象能力 定义函数的 2 种方式 在JavaScript 中，定义函数的方式如下： function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述 abs() 函数的定义如下： function 指出这是一个函数定义； abs 是函数的名称； (x) 括号内列出函数的参数，多个参数以，分隔； {……} 之间的代码是函数体，可以包含若干语句，甚至可以没有任何语句。 请注意，函数体内部的语句在执行时，一旦执行到 return 时，函数就执行完毕，并将结果返回。因此，函数内部通过条件判断和循环可以实现非常复杂的逻辑。 如果没有 return 语句，函数执行完毕后也会返回结果，只是结果为 undefined。 由于JavaScript的函数也是一个对象，上述定义的 abs()函数实际上是一个函数对象，而函数名 abs可以视为指向该函数的变量。 因此，第二种定义函数的方式如下： var abs = function (x) { if (x >= 0) { return x; } else { return -x…