公众账号

微信公众号二维码 微信扫描关注
HTML素材网 首页 经验分享 经验&观点 查看内容

js经验分享 JavaScript反调试技巧

2020-3-10 22:57| 发布者: zhihuoban| 查看: 315| 评论: 0

摘要: 在此之前,我一直都在研究JavaScript相关的反调试技巧。但是当我在网上搜索相关资料时,我发现网上并没有多少关于这方面的文章,而且就算有也是非常不完整的那种。所以在这篇文章中,我打算跟大家总结一下关于JavaSc ...

在此之前,我一直都在研究JavaScript相关的反调试技巧。但是当我在网上搜索相关资料时,我发现网上并没有多少关于这方面的文章,而且就算有也是非常不完整的那种。所以在这篇文章中,我打算跟大家总结一下关于JavaScript反调试技巧方面的内容。值得一提的是,其中有些方法已经被网络犯罪分子广泛应用到恶意软件之中了。


对于JavaScript来说,你只需要花一点时间进行调试和分析,你就能够了解到JavaScript代码段的功能逻辑。而我们所要讨论的内容,可以给那些想要分析你JavaScript代码的人增加一定的难度。不过我们的技术跟代码混淆无关,我们主要针对的是如何给代码主动调试增加困难。

本文所要介绍的技术方法大致如下:

1. 检测未知的执行环境(我们的代码只想在浏览器中被执行);

2. 检测调试工具(例如DevTools);

3. 代码完整性控制;

4. 流完整性控制;

5. 反模拟;

简而言之,如果我们检测到了“不正常”的情况,程序的运行流程将会改变,并跳转到伪造的代码块,并“隐藏”真正的功能代码。

一、函数重定义

这是一种最基本也是最常用的代码反调试技术了。在JavaScript中,我们可以对用于收集信息的函数进行重定义。比如说,console.log()函数可以用来收集函数和变量等信息,并将其显示在控制台中。如果我们重新定义了这个函数,我们就可以修改它的行为,并隐藏特定信息或显示伪造的信息。

我们可以直接在DevTools中运行这个函数来了解其功能:

  1. `console.log(``"HelloWorld"``);`
  2. `var` `fake =` `function``() {};`
  3. `window[``'console'``][``'log'``]= fake;`
  4. `console.log(``"Youcan't see me!"``);`
  5. 复制代码

运行后我们将会看到:

VM48:1 Hello World

你会发现第二条信息并没有显示,因为我们重新定义了这个函数,即“禁用”了它原本的功能。但是我们也可以让它显示伪造的信息。比如说这样:

  1. `console.log(``"Normalfunction"``);`
  2. `//First we save a reference to the original console.log function`
  3. `var` `original = window[``'console'``][``'log'``];`
  4. `//Next we create our fake function`
  5. `//Basicly we check the argument and if match we call original function with otherparam.`
  6. `// If there is no match pass the argument to the original function`
  7. `var` `fake =` `function``(argument) {`
  8. `if` `(argument ===` `"Ka0labs"``) {`
  9. `original(``"Spoofed!"``);`
  10. `}` `else` `{`
  11. `original(argument);`
  12. `}`
  13. `}`
  14. `// We redefine now console.log as our fake function`
  15. `window[``'console'``][``'log'``]= fake;`
  16. `//Then we call console.log with any argument`
  17. `console.log(``"Thisis unaltered"``);`
  18. `//Now we should see other text in console different to "Ka0labs"`
  19. `console.log(``"Ka0labs"``);`
  20. `//Aaaand everything still OK`
  21. `console.log(``"Byebye!"``);`
  22. 复制代码

如果一切正常的话:

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

实际上,为了控制代码的执行方式,我们还能够以更加聪明的方式来修改函数的功能。比如说,我们可以基于上述代码来构建一个代码段,并重定义eval函数。我们可以把JavaScript代码传递给eval函数,接下来代码将会被计算并执行。如果我们重定义了这个函数,我们就可以运行不同的代码了:

  1. `//Just a normal eval`
  2. `eval(``"console.log('1337')"``);`
  3. `//Now we repat the process...`

  4. 鲜花

    握手

    雷人

    路过

    鸡蛋

    月度热门文章

    HTML素材网,HTML5模板,网页特效
    Copyright©2017  HTML素材网  Powered by 智伙伴科技
      ( 鲁ICP备14029286号-3 )