您的位置:402cc永利手机版 > 互联网动态 > 【www.402.com】反调试技巧,JavaScript反调试技巧

【www.402.com】反调试技巧,JavaScript反调试技巧

2019-08-10 11:29

//Then apply the hook

consthandler= {

apply: function(target,thisArg,args){

console.log("Intercepted a call to with args: " args);

returntarget.apply(thisArg,args)

}

}

document.= newProxy(document.,handler);

//Callour not-so-virgin-after-that-party

try{

document..toString();

}catch(e){

console.log("I saw your proxy!");

}

js经验分享 JavaScript反调节和测量检验技巧,js经验共享

以前,小编平昔都在探讨JavaScript相关的反调节和测量试验技术。但是当自个儿在英特网查找相关质地时,作者发觉互连网并不曾稍微有关那方面的篇章,並且就算有也是丰富不完全的这种。所以在那篇小说中,笔者准备跟大家计算一下有关JavaScript反调试技术方面包车型客车剧情。值得一说的是,个中有个别措施已经被互连网犯罪分子布满应用到黑心软件之中了。

www.402.com 1

对此JavaScript来讲,你只要求花一点时间举行调护诊疗和深入分析,你就可见理解到JavaScript代码段的功力逻辑。而大家所要商量的从头到尾的经过,能够给那个想要分析你JavaScript代码的人充实一定的难度。可是大家的本事跟代码混淆无关,我们首要针对的是什么给代码主动调试扩大困难。

正文所要介绍的才干措施大约如下:

  1. 检测未知的执行情状(大家的代码只想在浏览器中被实行);

  2. 检验调节和测量试验工具(举个例子DevTools);

  3. 代码完整性调节;

  4. 流完整性调整;

  5. 反模拟;

简易,要是大家检查实验到了“不健康”的境况,程序的周转流程将会转移,并跳转到伪造的代码块,并“掩饰”真正的效率代码。

一、函数重定义

那是一种最基本也是最常用的代码反调节和测量试验手艺了。在JavaScript中,大家能够对用于收罗音讯的函数进行重定义。例如说,console.log()函数可以用来访谈函数和变量等音信,并将其出示在调整新竹。要是大家再度定义了那个函数,大家就足以修改它的一坐一起,并掩盖特定音讯或呈现伪造的新闻。

大家能够直接在DevTools中运作这么些函数来打探其效劳:

console.log("HelloWorld");
var fake = function() {};
window['console']['log']= fake;
console.log("Youcan't see me!");

运转后大家将会看到:

VM48:1 Hello World

您会发觉第二条新闻并未呈现,因为我们再一次定义了这么些函数,即“禁止使用”了它原本的法力。不过大家也能够让它显得伪造的音讯。举例说那样:

console.log("Normalfunction");
//First we save a reference to the original console.log function
var original = window['console']['log'];
//Next we create our fake function
//Basicly we check the argument and if match we call original function with otherparam.
// If there is no match pass the argument to the original function
var fake = function(argument) {
  if (argument === "Ka0labs") {
    original("Spoofed!");
  } else {
    original(argument);
  }
}
// We redefine now console.log as our fake function
window['console']['log']= fake;
//Then we call console.log with any argument
console.log("Thisis unaltered");
//Now we should see other text in console different to "Ka0labs"
console.log("Ka0labs");
//Aaaand everything still OK
console.log("Byebye!");

就算一切不奇怪的话:

Normal function
VM117:11 This is unaltered
VM117:9 Spoofed!
VM117:11 Bye bye!

事实上,为了调整代码的推行方式,我们仍可以够以特别聪明的点子来修改函数的效果。例如说,大家得以依据上述代码来创设二个代码段,同仁一视定义eval函数。我们得以把JavaScript代码传递给eval函数,接下去代码将会被计算并执行。假设大家重定义了那么些函数,我们就足以运作区别的代码了:

//Just a normal eval
eval("console.log('1337')");
//Now we repat the process...
var original = eval;
var fake = function(argument) {
  // If the code to be evaluated contains1337...
  if (argument.indexOf("1337") !==-1) {
    // ... we just execute a different code
    original("for (i = 0; i < 10;i  ) { console.log(i);}");
  }
  else {
    original(argument);
  }
}
eval= fake;
eval("console.log('Weshould see this...')");
//Now we should see the execution of a for loop instead of what is expected
eval("console.log('Too1337 for you!')");

运行结果如下:

1337
VM146:1We should see this…
VM147:10
VM147:11
VM147:12
VM147:13
VM147:14
VM147:15
VM147:16
VM147:17
VM147:18
VM147:19

正如以前所说的那样,就算这种措施充足抢眼,但那也是一种极其基础和大面积的章程,所以比较易于被检查测量检验到。

二、断点

为了支持我们通晓代码的效果与利益,JavaScript调试工具(比方DevTools)都足以通过设置断点的办法阻挠脚本代码试行,而断点也是代码调节和测量试验中最大旨的了。

只要您研讨过调节和测量检验器或许x86框架结构,你大概会比较理解0xCC指令。在JavaScript中,大家有多少个称呼debugger的类似指令。当大家在代码中申明了debugger函数后,脚本代码将会在debugger指令这里结束运转。举例说:

console.log("Seeme!");
debugger;
console.log("Seeme!");

广大生意产品会在代码中定义几个无限循环的debugger指令,可是有些浏览器会掩盖这种代码,而有一些则不会。这种艺术的首要性指标正是让这一个想要调节和测量检验你代码的人倍感反感,因为特别循环意味着代码会不断地弹出窗口来询问你是不是要一连续运输维脚本代码:

setTimeout(function(){while (true) {eval("debugger")

三、时间距离

那是一种从守旧反逆向本事那里借鉴过来的依照时间的反调节和测量试验技术。当脚本在DevTools等工具意况下实施时,运营速度会比比较慢(时间久),所以我们就足以依靠运转时刻来判别脚本当前是否正在被调理。举例说,大家得以由此度量代码中四个设置点之间的运维时刻,然后用那么些值作为参谋,就算运维时刻超越这些值,表明脚本当前在调节和测验器中运营。

示范代码如下:

set Interval(function(){
 var startTime = performance.now(), check,diff;
 for (check = 0; check < 1000; check  ){
  console.log(check);
  console.clear();
 }
 diff = performance.now() - startTime;
 if (diff > 200){
  alert("Debugger detected!");
 }
},500);

四、DevTools检测(Chrome)

那项技巧运用的是div元素中的id属性,当div成分被发送至调整台(举例console.log(div))时,浏览器会自动尝试获得在那之中的要素id。要是代码在调用了console.log之后又调用了getter方法,表达调节台当前正值周转。

简易的定义验证代码如下:

let div = document.createElement('div');
let loop = setInterval(() => {
  console.log(div);
  console.clear();
});
Object.defineProperty(div,"id", {get: () => {
  clearInterval(loop);
  alert("Dev Tools detected!");
}});

五、隐式流完整性调控

当大家尝试对代码进行反混淆管理时,大家第一会尝试重命名有些函数或变量,可是在JavaScript中大家得以检查测量检验函数名是不是被修改过,或然说我们能够直接通过储藏室追踪来获取其固有名称或调用顺序。

arguments.callee.caller可以支持大家创制贰个库房追踪来囤积此前施行过的函数,演示代码如下:

function getCallStack() {
  var stack = "#", total = 0, fn =arguments.callee;
  while ( (fn = fn.caller) ) {
    stack = stack   ""  fn.name;
    total  
  }
  return stack
}
function test1() {
  console.log(getCallStack());
}
function test2() {
  test1();
}
function test3() {
  test2();
}
function test4() {
  test3();
}
test4();

细心:源代码的歪曲程度越强,这些本领的作用就越好。

六、代理对象

代理对象是现阶段JavaScript中最低价的四个工具,这种对象能够帮助大家理解代码中的其余对象,包罗修改其作为以及触发特定意况下的对象活动。比如说,大家得以创制多少个嗲呢对象并跟踪每叁回document.createElemen调用,然后记录下有关消息:

const handler = { // Our hook to keep the track
  apply: function (target, thisArg, args){
    console.log("Intercepted a call tocreateElement with args: "   args);
    return target.apply(thisArg, args)
  }
}

document.createElement= new Proxy(document.createElement, handler) // Create our proxy object withour hook ready to intercept
document.createElement('div');

接下去,大家得以在调控桃园著录下有关参数和音信:

VM64:3 Intercepted a call to createElement with args: div

我们得以应用那一个新闻并经过拦截有些特定函数来调度代码,不过本文的根本指标是为了介绍反调节和测验手艺,那么我们怎样检查实验“对方”是或不是利用了代理对象啊?其实那就是一场“猫抓老鼠”的游乐,比方说,大家得以采纳一样的代码段,然后尝试调用toString方法并抓获格外:

//Call a "virgin" createElement:
try {
  document.createElement.toString();
}catch(e){
  console.log("I saw your proxy!");
}

音讯如下:

"function createElement() { [native code] }"

而是当大家利用了代办之后:

//Then apply the hook
consthandler = {
  apply: function (target, thisArg, args){
    console.log("Intercepted a call tocreateElement with args: "   args);
    return target.apply(thisArg, args)
  }
}
document.createElement= new Proxy(document.createElement, handler);

//Callour not-so-virgin-after-that-party createElement
try {
  document.createElement.toString();
}catch(e) {
  console.log("I saw your proxy!");
}

是的,大家实在能够检查实验到代办:

VM391:13 I saw your proxy!

作者们还足以增加toString方法:

const handler = {
  apply: function (target, thisArg, args){
    console.log("Intercepted a call tocreateElement with args: "   args);
    return target.apply(thisArg, args)
  }
}
document.createElement= new Proxy(document.createElement, handler);
document.createElement= Function.prototype.toString.bind(document.createElement); //Add toString
//Callour not-so-virgin-after-that-party createElement
try {
  document.createElement.toString();
}catch(e) {
  console.log("I saw your proxy!");
}

现在大家就无法检查实验到了:

"function createElement() { [native code] }"

就如自个儿说的,那正是一场“猫抓老鼠“的娱乐。

总结

但愿小编所搜聚到的那个工夫可以对我们全部援助,假诺您有更加好的本领想跟大家享受,能够直接在作品下方的讨论区留言,或许在推特(TWTR.US)上艾特笔者(@TheXC3LL)。

* 参照他事他说加以考察来源:x-c3ll,FB小编Alpha_h4ck编译,转发请申明来源FreeBuf.COM

JavaScript反调节和测验本领,js经验分享从前,笔者一贯都在钻探JavaScript相关的反调节和测验技术。不过当自身在网络查找相关材料时,笔者发...

"function () { [native code] }" style="font-size: 16px;">

代办对象是眼下Java中最平价的多少个工具,这种对象足以支持大家询问代码中的其余对象,富含修改其行事以及触发特定条件下的靶子活动。举例说,我们能够创造贰个嗲呢对象并追踪每贰遍document.createElemen调用,然后记录下相关新闻:

就如自身说的,这正是一场“猫抓老鼠“的娱乐。

正如从前所说的那么,即使这种格局十分神奇,但那也是一种极度基础和广阔的点子,所以相比较轻易被检测到。

运转结果如下:

示范代码如下:

四、DevTools检测(Chrome)

VM391:13 I saw your proxy!

1337

VM146:1Weshould see this…

VM147:10

VM147:11

VM147:12

VM147:13

VM147:14

VM147:15

VM147:16

VM147:17

VM147:18

VM147:19

  1. 检验调节和测量检验工具(比方DevTools);

  2. 代码完整性调控;

  3. 流完整性调整;

  4. 反模拟;

console.log("Seeme!");

debugger;

console.log("Seeme!");

写在前方的话:

*宣示:内容与图片均出自互联网(部分内容有修改),版权归原来的著作者全体,世尊自新闻有误或侵害权益,请联系大家删除或授权事宜。

没有错,我们真正能够检查评定到代办:

您会发觉第二条新闻并不曾体现,因为我们再一次定义了这些函数,即“禁止使用”了它原先的机能。可是大家也可以让它彰显伪造的新闻。比方说那样:

骨子里,为了调控代码的实行措施,我们还是能够够以尤其了解的措施来修改函数的效劳。举个例子说,大家得以依靠上述代码来创设贰个代码段,一碗水端平定义eval函数。大家能够把Java代码传递给eval函数,接下去代码将会被计算并实行。若是大家重定义了那些函数,大家就足以运作分化的代码了:

假设您商量过调节和测量试验器只怕x86架构,你或者会相比熟谙0xCC指令。在Java中,大家有一个称呼debugger的近乎指令。当我们在代码中宣称了debugger函数后,脚本代码将会在debugger指令这里结束运营。比方说:

多多商业贸易产品会在代码中定义三个Infiniti循环的debugger指令,可是某个浏览器会遮盖这种代码,而有些则不会。这种办法的重中之重目标就是让这多少个想要调节和测验你代码的人以为厌烦,因为非常循环意味着代码会没完没了地弹出窗口来询问你是或不是要继续运转脚本代码:

console.log("Normalfunction");

//First we save a reference to the original console.log function

varoriginal= window['console']['log'];

//Next we create our fake function

//Basicly we check the argument and if match we call original function with otherparam.

// If there is no match pass the argument to the original function

varfake= function(argument){

if(argument=== "Ka0labs"){

original("Spoofed!");

}else{

original(argument);

}

}

// We redefine now console.log as our fake function

window['console']['log']= fake;

//Then we call console.log with any argument

console.log("Thisis unaltered");

//Now we should see other text in console different to "Ka0labs"

console.log("Ka0labs");

//Aaaand everything still OK

console.log("Byebye!");

二、断点

笔者们能够利用这几个消息并透过拦截有个别特定函数来调整代码,可是本文的关键目标是为着介绍反调节和测量试验本事,那么我们什么检验“对方”是或不是采纳了代办对象呢?其实那就是一场“猫抓老鼠”的玩耍,比如说,我们能够使用一样的代码段,然后尝试调用toString方法并抓获十分:

瞩目:源代码的歪曲程度越强,那一个技艺的成效就越好。

而是当大家选拔了代理之后:

大家能够直接在DevTools中运作这些函数来打探其效劳:

大概,假诺大家检查实验到了“不不奇怪”的情景,程序的运作流程将会变动,并跳转到伪造的代码块,并“掩盖”真正的职能代码。

"function () { [native code] }"

当我们品尝对代码进行反混淆管理时,咱们率先会尝试重命名有个别函数或变量,可是在Java中大家得以检查测验函数名是或不是被修改过,或许说我们能够间接通过储藏室追踪来博取其原始名称或调用顺序。

//Just a normal eval

eval("console.log('1337')");

//Now we repat the process...

varoriginal= eval;

varfake= function(argument){

// If the code to be evaluated contains1337...

style="font-size: 16px;">if(argument.indexOf("1337")!==-1){

// ... we just execute a different code

original("for (i = 0; i < 10;i ) { console.log(i);}");

}

else{

original(argument);

}

}

eval= fake;

eval("console.log('Weshould see this...')");

//Now we should see the execution of a for loop instead of what is expected

eval("console.log('Too1337 for you!')");

一旦一切平常的话:

VM64:3 Intercepted a call to with args: div

consthandler= {// Our hook to keep the track

apply: function(target,thisArg,args){

console.log("Intercepted a call to with args: " args);

returntarget.apply(thisArg,args)

www.402.com ,}

}

document.= newProxy(document.,handler)// Create our proxy object withour hook ready to intercept

document.('div');

这是一种从思想反逆向本事这里借鉴过来的根据时间的反调节和测量试验手艺。当脚本在DevTools等工具境况下施行时,运营速度会相当的慢(时间久),所以咱们就能够依照运营时刻来决断脚本当前是否正在被调弄整理。比如说,大家能够通过衡量代码中八个设置点之间的运行时刻,然后用那一个值作为参照,若是运行时刻当先这一个值,表达脚本当前在调节和测验器中运作。

现今我们就无法检查评定到了:

本文由402cc永利手机版发布于互联网动态,转载请注明出处:【www.402.com】反调试技巧,JavaScript反调试技巧

关键词: www.402.com 402cc永利手机版