长亭百川云 - 文章详情

WEB前端逆向反反调试一例

青衣十三楼飞花堂

63

2024-07-13

创建: 2024-06-28 16:14https://scz.617.cn/web/202406281614.txt

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都是同一套路,才来寻找一次性解决方案。

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

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2