js逆向中如何hook时间函数Date、随机函数random

文章介绍了在JavaScript逆向工程中遇到的加密问题,通过hook住Date和Math函数,以及修改crypto.getRandomValues,可以固定加密结果,便于调试。展示了如何控制这些函数的行为以保持加密输出不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

js逆向中会遇到加密结果存在随机值,无法很好的调试加密,这种情况大概率就是加密过程中用到时间戳和随机数,通过hook住Date函数、random随机函数,就可以实现加密结果不变,hook代码如下:

Date.now = function now() {
    return 1661986251253
};
Date.parse = function () {
    return 1661986251253
};
Date.prototype.valueOf = function () {
    return 1661986251253
};
Date.prototype.getTime = function () {
    return 1661986251253
};
Date.prototype.toString = function () {
    return 1661986251253
};
Performance.prototype.now = function now() {
    return Number('1661986251253'.slice(8))
}
Math.random = function random() {
    return 0.08636862211354912
};
window.crypto.getRandomValues = function getRandomValues(array32, ...args) {
    return array32;
}
### 关于 JavaScript 逆向工程、异步 Payload 加密及调试 #### JavaScript 逆向工程实践 对于 JavaScript逆向分析,通常涉及理解网站如何处理数据发送至服务器的过程。例如,在某些情况下,登录参数可能通过 `JSON.stringify()` 方法被序列化成字符串形式再提交给服务端[^1]。 为了拦截这些过程中的关键函数调用,可以采用 Hook 技术来监视特定 API 行为: ```javascript (function() { var originalStringify = JSON.stringify; JSON.stringify = function(params) { console.log("Intercepted call to JSON.stringify with parameters:", params); debugger; // 设置断点以便进一步调查 return originalStringify.apply(this, arguments); } })(); ``` 这段代码展示了怎样挂钩 `JSON.stringify` 函数以捕获其输入参数并暂停执行流程供开发者审查环境变量或对象结构。 #### 异步 Payload 加密实现方式 当涉及到敏感信息如用户名和密码时,许多应用会选择先对其进行加密后再上传。这里展示了一个基于 MD5 哈希算法的例子,它利用了第三方库 `CryptoJS` 来完成这一任务[^2]: ```javascript var CryptoJS = require('crypto-js'); function generateSecurePayload(inputData, userAgent) { const userHash = CryptoJS.MD5(userAgent).toString(); const timestamp = new Date().getTime(); const randomSalt = `${timestamp}${Math.floor(Math.random() * 10)}`; let secureSignature = CryptoJS.MD5( 'fixedPrefix' + inputData + randomSalt + 'secretSuffix' ).toString(); return { hashValue: userHash, timeSent: timestamp, saltUsed: randomSalt, signature: secureSignature }; } ``` 此函数接收原始数据与用户代理作为输入,并返回经过哈希运算后的安全负载,其中包含了时间戳和其他辅助字段用于验证目的。 #### 调试技巧与工具推荐 在实际项目中,除了浏览器内置的开发者工具外,还可以借助 Node.js 生态圈内的 ExecJS 库来进行跨平台的 JavaScript 解析和支持不同引擎间的互操作性[^3]。下面是一个简单的例子说明如何使用 Python 结合 ExecJS 执行一段预编译好的 JavaScript 文件: ```python import execjs def execute_js_code(): context = execjs.compile(""" function run(someInput){ // 这里放置待运行的具体逻辑... return someResult; } """) result = context.call('run', "exampleArgument"); print(result) ``` 此外,Web Worker 提供了一种有效的方式让后台线程独立工作而不干扰主线程性能,这对于长时间运行的任务尤其有用,比如复杂的数学计算或是大量 I/O 操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是花臂不花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值