WEB前端逆向反反调试一例
```创建: 2024-06-28 16:14
```
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;
let func_ = any.constructor.prototype.bind( any );
func_.toString= func.toString.bind( func );
obj = 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
// @descriptionAnti 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;
let func_ = function () {
let ret;
if ( arguments.length === 1 && arguments.startsWith( "debugger" ) ) {
ret = function() {};
}
else {
ret = func.apply( object, arguments );
}
return ret;
}
func_.prototype = func.prototype;
func_.toString= func.toString.bind( func );
object = 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 );
}
})();
```
现在反调试都是在js混淆掩护下进行,无论如何,AST反混淆有百利而无一害。我是反混淆了两个js之后,意识到其余js都是同一套路,才来寻找一次性解决方案。
逆向工程主要是思路,对抗双方是场猫鼠游戏,没有永远的胜者。 悦来客栈的老板 发表于 2024-6-30 09:29
反混淆后替换,不需要任何hook代码。我调试分析的时候,基本不用hook,对js逆向而言,属于落后的技术。
我说的overrides就是替换,你可能没仔细看。之所以hook,是因为几乎每一个js都混淆了,我手工overrides了近十个,这还是没有继续使用其他功能的情况。所以才用hook将所有的反调试一次性过了。那你是觉得我不会反混淆并overrides? 你这个我油猴脚本hook一下就行了,无限debugger legendweb 发表于 2024-6-29 00:35
你这个我油猴脚本hook一下就行了,无限debugger
油猴脚本能分享学习一下吗,感谢 legendweb 发表于 2024-6-29 00:35
你这个我油猴脚本hook一下就行了,无限debugger
能分享学习一下吗?谢谢 遇到无限debugger,新手弟弟不知所措 值得借鉴参考,还需研究,谢谢您 逆向小白前来学习 厉害学到了,还搞了原型链 对抗与反对抗 看看再说。。。。。。。。。。。
页:
[1]
2