Skip to content

标题: WEB前端逆向反反调试一例

创建: 2024-06-28 16:14 更新: 链接: https://scz.617.cn/web/202406281614.txt https://www.52pojie.cn/thread-1939114-1-1.html https://mp.weixin.qq.com/s/JTrHW_dObw0Pkg8zHG9PCA

WEB前端逆向初学者的若干备忘。

某案例,几乎每个js都用同一套路混淆过,就反调试而言,主要干几件事:

a. 美化检测 b. 无限debugger c. 屏蔽console对象各函数 d. 清Console

先说c,大致意思如下:


function any () { };

let pobj = typeof window !== "undefined" ? window : global; let obj = pobj.console; let name = 'log'; let func = obj[name]; let func_ = any.constructor.prototype.bind( any ); func_.toString = func.toString.bind( func ); obj[name] = func_;

console.log('invisible');

上例是某js替换(屏蔽)console.log的代码。接着说b。


let x = function () {return true;}.constructor; let y = x( "console.log('ok')" ); x === Function.constructor; x === Function.prototype.constructor; y instanceof Function; y.call(); y();

(function () {return true;}).constructor("console.log('ok')").call(); (function () {return true;}).constructor("console.log('ok')").apply();


上述代码用Function.constructor构造匿名函数并执行之。正常编程不会出现这种代 码,却是反调试常用手段之一,比如:


(function(){}).constructor("debugger").call(); (function(){}).constructor("debugger").apply();


该案例中a+b+c+d组合遍布各个js,一招鲜吃遍天,没啥质量,以数量取胜。虽然都 在js混淆掩护下进行,但套路化之后固定模式太明显,不反混淆时肉眼可Overrides。 由于数量实在不少,逐个Overrides显然不是最佳方案,尝试寻找一次性解决方案。


// ==UserScript== // @name BypassDebugger // @namespace http://tampermonkey.net/ // @version 2024-06-28 // @description Anti Anti Debug // @author Me // @match https:/// // @grant none // @run-at document-start // ==/UserScript==

(function() {

'use strict';

console.clear   = function () {};

function HookObjectMethod ( object, attr ) {
    let func        = object[attr];
    let func_       = function () {
        let ret;
        if ( arguments.length === 1 && arguments[0].startsWith( "debugger" ) ) {
            ret = function() {};
        }
        else {
            ret = func.apply( object, arguments );
        }
        return ret;
    }
    func_.prototype = func.prototype;
    func_.toString  = func.toString.bind( func );
    object[attr]    = func_;
}

HookObjectMethod( Function.prototype, 'constructor' );

function HookObjectProperty ( object, attr ) {
    Object.defineProperty( object, attr, {
        enumerable: false,
        writable: false,
        configurable: false
    });
}

let funcarray   = ["log", "warn", "info", "error", "exception", "table", "trace"];
for ( let i = 0; i < funcarray.length; i++ ) {
    HookObjectProperty( console, funcarray[i] );
}

})();

现在反调试都是在js混淆掩护下进行,无论如何,AST反混淆有百利而无一害。我是 反混淆了两个js之后,意识到其余js都是同一套路,才来寻找一次性解决方案。

逆向工程主要是思路,对抗双方是场猫鼠游戏,没有永远的胜者。