JS中注入eval, Function等系统函数截获动态代码


Posted in Javascript onApril 03, 2019

现在很多网站都上了各种前端反爬手段,无论手段如何,最重要的是要把包含反爬手段的前端javascript代码加密隐藏起来,然后在运行时实时解密动态执行。

动态执行js代码无非两种方法,即eval和Function。那么,不管网站加密代码写的多牛,我们只要将这两个方法hook住,即可获取到解密后的可执行js代码。

注意,有些网站会检测eval和Function这两个方法是否原生,因此需要一些小花招来忽悠过去。

挂钩代码

首先是eval的挂钩代码:

(function() {
  if (window.__cr_eval) return
  window.__cr_eval = window.eval
  var myeval = function (src) {
    console.log("================ eval begin: length=" + src.length + ",caller=" + (myeval.caller && myeval.caller.name) + " ===============")
    console.log(src);
    console.log("================ eval end ================")
    return window.__cr_eval(src)
  }
  var _myeval = myeval.bind(null)
  _myeval.toString = window.__cr_eval.toString
  Object.defineProperty(window, 'eval', { value: _myeval })
  console.log(">>>>>>>>>>>>>> eval injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")
})();

这段代码执行后,之后所有的eval操作都会在控制台打印输出将要执行的js源码。

同理可以写出Function的挂钩代码:

(function() {
  if (window.__cr_fun) return
  window.__cr_fun = window.Function
  var myfun = function () {
    var args = Array.prototype.slice.call(arguments, 0, -1).join(","), src = arguments[arguments.length - 1]
    console.log("================ Function begin: args=" + args + ", length=" + src.length + ",caller=" + (myfun.caller && myfun.caller.name) + " ===============")
    console.log(src);
    console.log("================ Function end ================")
    return window.__cr_fun.apply(this, arguments)
  }
  myfun.toString = function() { return window.__cr_fun + "" }
  Object.defineProperty(window, 'Function', { value: myfun })
  console.log(">>>>>>>>>>>>>> Function injected: " + document.location + " <<<<<<<<<<<<<<<<<<<")
})();

注意和eval不同,Function是个变长参数的构造方法,需要处理this

另外,有些网站还会用类似的机制加密页面内容,然后通过document.write输出动态解密的内容,因此同样可以挂钩document.write,挂钩方法类似eval,这里就不重复了。

注入方式

另外,还有个问题需要关注,就是挂钩代码的注入方法。

最简单的就是F12调出控制台,直接执行上面的代码,但这样只能hook住之后的调用,如果希望从页面刚加载时就注入,那么可以用以下几种方式:

  • 油猴注入,油猴可以监听文档加载的几种不同状态,并在特定时刻执行js代码。我没有太多研究,具体请参见油猴手册
  • 代理注入,修改应答数据,在<head>标签内的第一个位置插入<script>节点,确保在其它js加载执行前注入;Fiddler, anyproxy等都可以编写外部规则,具体请参见代理工具的手册
  • 使用chrome-devtools-protocol, 通过Page.addScriptToEvaluateOnNewDocument注入外部js代码

Fiddler代理规则

不少人没用过代理规则,这里写一下Fiddler的规则编写方法:

Fiddler菜单里Rules > Customize Rules 打开脚本编辑器

在脚本编辑器里找OnBeforeResponse方法,方法内添加下面代码:

if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")){
  oSession.utilDecodeResponse(); // Remove any compression or chunking
  var b = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
  var r = /<head[^>]*>/i;
  var js = "..."; // 要注入的js源码
  b = b.replace(r, "$0<script>" + js + "</script>");
  oSession.utilSetResponseBody(b); // Set the response body back
}

这样就会在所有html文档头部自动添加js代码了

总结

以上所述是小编给大家介绍的JS中注入eval, Function等系统函数截获动态代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
非常不错的功能强大代码简单的管理菜单美化版
Jul 09 Javascript
javascript 进度条 实现代码
Jul 30 Javascript
通过判断JavaScript的版本实现执行不同的代码
May 11 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
Jan 12 Javascript
JavaScript中的null和undefined区别介绍
Jan 01 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
Mar 15 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
bootstrap常用组件之头部导航实现代码
Apr 20 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
AngularJS 多指令Scope问题的解决
Oct 25 Javascript
基于vue-cli3创建libs库的实现方法
Dec 04 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
Dec 22 Javascript
性能优化篇之Webpack构建速度优化的建议
Apr 03 #Javascript
elementUI多选框反选的实现代码
Apr 03 #Javascript
vue生命周期的探索
Apr 03 #Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 #Javascript
详释JavaScript执行环境与执行栈
Apr 02 #Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 #Javascript
koa大型web项目中使用路由装饰器的方法示例
Apr 02 #Javascript
You might like
php URL跳转代码 减少外链
2011/06/25 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
php字符集转换
2017/01/23 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
js CSS操作方法集合
2008/10/31 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
js实现日历与定时器
2017/02/22 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
[02:43]2018DOTA2亚洲邀请赛主赛事首日TOP5
2018/04/04 DOTA
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python实现LRU算法的2种方法
2015/06/24 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python读取properties配置文件操作示例
2018/03/29 Python
用python实现刷点击率的示例代码
2019/02/21 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
python二维图制作的实例代码
2020/12/03 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
大学毕业感言200字
2014/03/09 职场文书
如何写好闭幕词
2019/04/02 职场文书