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 相关文章推荐
JavaScript 面向对象之命名空间
May 04 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
Apr 29 Javascript
js日期联动示例
May 02 Javascript
使用jQuery判断IE浏览器版本的代码
Jun 14 Javascript
Jquery跨域获得Json的简单实例
May 18 Javascript
jQuery hover事件简单实现同时绑定2个方法
Jun 07 Javascript
AngularJS监听路由的变化示例代码
Sep 23 Javascript
Node.js 8 中的 util.promisify的详解
Jun 12 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
Feb 10 Javascript
JS块级作用域和私有变量实例分析
May 11 Javascript
原生js实现随机点餐效果
Dec 10 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
详解Python中expandtabs()方法的使用
2015/05/18 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
python代码如何注释
2020/06/01 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
欧克利英国官网:Oakley英国
2019/08/24 全球购物
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
社会学专业学生职业规划书
2014/02/07 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
单位证明范文
2015/06/18 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript