吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2936|回复: 29
收起左侧

[Web逆向] 表哥,你也不想你扣的js代码被格式化检测吧

  [复制链接]
nangongxt07 发表于 2025-4-7 11:03

我们先来看一段代码

function TestCode(){
    return parseInt(1),parseFloat(0.3)
}
console.log(TestCode.toString().split("\n"));

运行之后你会发现,打印了一个长度为3位的数组,我来解释一下这个代码的意思,这个就是先申明一个简单的函数,然后将这个函数转为源代码(这个源代码跟你一开始写的这个函数是一样的,你压缩了转换之后也是压缩的,不是压缩的转换之后也不是压缩的),并以换行符进行分割

[
  'function TestCode(){\r',
  '    return parseInt(1),parseFloat(0.3)\r',
  '}'
]

我们再来看看压缩的代码运行的结果

function TestCode(){return parseInt(1),parseFloat(0.3)};
console.log(TestCode.toString().split("\n"));

结果

[ 'function TestCode(){return parseInt(1),parseFloat(0.3)}' ]

返回的是一个长度为1的数组
举了两个例子,我们现在进入正题
从上面的两个例子中我们不难发现格式化的代码和不格式化的代码的区别就是多了换行符,而格式化检测的原理便是通过换行符作为分割看看分割之后这个数组的长度是多少进而判断是否为格式化的代码
以下是一个简单的demo用于检测是否格式化了代码

function TestCode(){return parseInt(1),parseFloat(0.3)};
function TestCode_format() {
    return parseInt(1), parseFloat(0.3)
}
function isJsFormat(Code) {
    return Code.toString().split("\n").length > 2;
}

console.log("NoFormat=====>",isJsFormat(TestCode))
console.log("Format=====>",isJsFormat(TestCode_format))

运行代码的结果

NoFormat=====> false
Format=====> true

既然我们以及知己知彼了(了解原理了),那我们就能想到对坑格式化检测的思路,也就是通过hook split方法
hook split代码

(function() {
    // 保存原始的 split 方法
    const originalSplit = String.prototype.split;
    // 重写 split 方法
    String.prototype.split = function(separator, limit) {
        // 检查分隔符是否为 "\n"
        if (separator === "\n") {
            return [1]
        }
        // 调用原始 split 方法并返回结果
        return originalSplit.apply(this, arguments);
    };
})();

将此代码插入源代码的最前面

(function() {
    // 保存原始的 split 方法
    const originalSplit = String.prototype.split;
    // 重写 split 方法
    String.prototype.split = function(separator, limit) {
        // 检查分隔符是否为 "\n"
        if (separator === "\n") {
            return [1]
        }
        // 调用原始 split 方法并返回结果
        return originalSplit.apply(this, arguments);
    };
})();
function TestCode(){return parseInt(1),parseFloat(0.3)};
function TestCode_format() {
    return parseInt(1), parseFloat(0.3)
}
function isJsFormat(Code) {
    return Code.toString().split("\n").length > 2;
}

console.log("NoFormat=====>",isJsFormat(TestCode))
console.log("Format=====>",isJsFormat(TestCode_format))

运行的结果

NoFormat=====> false
Format=====> false

都为false,成功绕过.


免费评分

参与人数 4威望 +1 吾爱币 +21 热心值 +4 收起 理由
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
anwuzhu077 + 1 + 1 用心讨论,共获提升!
wzzjnb2006 + 1 你这标题太抽象了...
rhol + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

漁滒 发表于 2025-4-7 17:10
本帖最后由 漁滒 于 2025-4-7 17:12 编辑

那如果把isJsFormat稍微改一下呢?例如
[JavaScript] 纯文本查看 复制代码
function isJsFormat(Code) {
    return Code.toString().includes("\n");
}


或者在vmp中存在类似的函数
[JavaScript] 纯文本查看 复制代码
function isJsFormat(Code,Value) {
    return crc32(Code.toString()) === Value;
}

免费评分

参与人数 1热心值 +1 收起 理由
xiaopacI + 1 我很赞同!

查看全部评分

yx_robert 发表于 2025-4-8 10:06
Simwillbetter 发表于 2025-4-7 16:47
YouLii 发表于 2025-4-7 17:42
本帖最后由 YouLii 于 2025-4-7 17:45 编辑

(function() {
    const originalIncludes = String.prototype.includes
    String.prototype.includes = function(str) {
        if (str === "\n") {
            return false;
        }
        return originalIncludes.apply(this, arguments);
    };
})();
YouLii 发表于 2025-4-7 17:46
漁滒 发表于 2025-4-7 17:10
那如果把isJsFormat稍微改一下呢?例如
[JavaScript] 纯文本查看 复制代码
function isJsFormat(Code) {
[/quote]

同理吧includes也改一下可以嘛,第二个没看懂
[mw_shl_code=javascript,true](function() {
    const originalIncludes = String.prototype.includes
    String.prototype.includes = function(str) {
        if (str === "\n") {
            return false;
        }
        return originalIncludes.apply(this, arguments);
    };
})();
YouLii 发表于 2025-4-7 17:47
学习了,感谢分享
KaliHt 发表于 2025-4-7 17:53
YouLii 发表于 2025-4-7 17:46
同理吧includes也改一下可以嘛,第二个没看懂
[mw_shl_code=javascript,true](function() {
    const  ...

学习了,感谢分享
Yao2903 发表于 2025-4-7 17:54
本帖最后由 Yao2903 于 2025-4-7 18:01 编辑

好欸,以前只知道有反格式化这个概念但不知道具体实现,知道怎么实现才可能有破解的思路,感谢楼主
顺带还真没想到三楼的CRC比对,如果在混淆阶段后插一段这玩意该怎么破,蹲一位大仙
三滑稽甲苯 发表于 2025-4-7 18:04
这么做会不会误伤到其他的正常代码
lyyzs7742 发表于 2025-4-7 19:08
标题很吸引人
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-30 14:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表