JS 逆向简单 DEMO & 流程

admin 2025年3月10日23:14:11评论18 views字数 3783阅读12分36秒阅读模式

JS 逆向简单 DEMO & 流程

前言

分享一下简单的加解密逻辑与步骤, 用Chrome & FireFox做一下比较, 用简单的AES做一下案例演示. 后续会随着复杂度难度逐渐递增并记载.

声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。

调试环境搭建

这里给出一个简单的本地环境, 代码如下:

<!DOCTYPE html>
<html>
<head>
<title>登录Demo</title>
<!-- 引入CryptoJS AES加密库 -->
<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>
<body>
<divstyle="margin: 20px;">
<h2>登录</h2>
<formid="loginForm">
<divstyle="margin: 10px 0;">
<label>账号:</label>
<inputtype="text"id="username"required>
</div>
<divstyle="margin: 10px 0;">
<label>密码:</label>
<inputtype="password"id="password"required>
</div>
<buttontype="button">登录</button>
</form>
</div>

<script>
document.getElementsByTagName('button')[0].addEventListener('click'function(){
            login(); // 登录逻辑
        });

// AES加密配置(实际应用中密钥应更复杂且安全存储)
const AES_KEY = CryptoJS.enc.Utf8.parse('1234567812345678'); // 16位密钥
const AES_IV = CryptoJS.enc.Utf8.parse('1234567812345678');  // 16位初始向量

functionlogin({
// 获取输入值
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;

// 创建待加密的JSON对象
const loginData = {
username: username,
password: password
            };

// 加密数据
const encryptedData = aesEncrypt(JSON.stringify(loginData));

// 发送加密后的数据
            fetch('checklogin.php', {
method'POST',
headers: {
'Content-Type''application/json'
                },
bodyJSON.stringify({ data: encryptedData })
            })
            .then(response => response.json())
            .then(data => {
                alert(data.message);
            })
            .catch(error => {
console.error('Error:', error);
            });
        }

// AES加密函数(CBC模式,PKCS7填充)
functionaesEncrypt(data{
const encrypted = CryptoJS.AES.encrypt(
                data,
                AES_KEY,
                {
iv: AES_IV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
                }
            );
return encrypted.toString();
        }
</script>
</body>
</html>

这里是一个登录 -> 加密 -> 发送JSON数据的简单 DEMO, 而后端使用 PHP 接收, 代码如下:

<?php
// 注意:需要安装php7.4+和openssl扩展
$secretKey = '1234567812345678'// 与前端一致的密钥
$iv = '1234567812345678';       // 与前端一致的初始向量

// 获取加密数据
$input = json_decode(file_get_contents('php://input'), true);
$encryptedData = base64_decode($input['data']);

// 解密数据
$decryptedData = openssl_decrypt(
    $encryptedData,
'AES-128-CBC',
    $secretKey,
    OPENSSL_RAW_DATA,
    $iv
);

if ($decryptedData) {
    $loginInfo = json_decode($decryptedData, true);
// 这里可以添加数据库验证逻辑
    $response = [
'status' => 'success',
'message' => '登录成功(模拟)',
'decrypted_data' => $loginInfo
    ];
else {
    $response = [
'status' => 'error',
'message' => '解密失败'
    ];
}

header('Content-Type: application/json');
echo json_encode($response);
?>

使用php://input来收到JSONPOST所发送的值, 进行AES解密的操作, 随后返回给前端, 而一次请求发送的内容如下:

JS 逆向简单 DEMO & 流程

FireFox 调试

这里笔者使用FireFox进行直接调试, 直接对登录按钮进行右键 -> 检查即可, 如下:

JS 逆向简单 DEMO & 流程

从这里我们可以进行对目标打上断点, 后续进行DEBUG调试出加密逻辑:

JS 逆向简单 DEMO & 流程

可以从中看到的是, 经过了aesEncrypt方法加密后, 得到了一串最终要发包的密文信息. 后续则是使用DEBUG步入等功能查看加解密逻辑即可, 这里不再赘述, 慢慢的进行单步,步入调试就行:

JS 逆向简单 DEMO & 流程

Chrome 调试

对于Chrome的调试不同于FireFox, 个人更喜欢Chrome的调试功能, 它对事件的查找也不同, 如下:

JS 逆向简单 DEMO & 流程

这里不像FireFox那样, 而是需要在事件监听器中进行定位到事件, 随后进入并进行DEBUG即可:

JS 逆向简单 DEMO & 流程

从中我们也可以看到最终的加密也是呗aesEncrypt进行处理了.

编写对应的解密脚本

实战中可能流程更加复杂, 不会出现这么简单的情况, 我们只需要细心慢慢跟入即可, 找到最终对其加密的方法就行.

而我们拿到AES-KEY后, 可以根据上述加密情况, 编写出对应的解密脚本如下:

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>Document</title>
<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>
<body>
<script>
let data = 'fwiCcQLoitBApt+MxIjLMtuFcCCLyBYEgDhzdWr28+gTHzeTYNhe73AawWX1ngBC';
const AES_KEY = CryptoJS.enc.Utf8.parse('1234567812345678');
const AES_IV = CryptoJS.enc.Utf8.parse('1234567812345678');

functionaesDecrypt({
const decrypted = CryptoJS.AES.decrypt(
                data,
                AES_KEY,
                {
iv: AES_IV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
                }
            );
return decrypted.toString(CryptoJS.enc.Utf8); // 指明 CryptoJS.enc.Utf8
        }

console.log("Key: " + data + " Value: " + aesDecrypt(data));
</script>
</body>
</html>

最终转换 Python 等, 编写爬虫脚本之类的不在此说明了, 语法上查一下API就行.

原文始发于微信公众号(Heihu Share):JS 逆向简单 DEMO & 流程

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月10日23:14:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JS 逆向简单 DEMO & 流程https://cn-sec.com/archives/3818337.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息