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 相关文章推荐
Firefox outerHTML实现代码
Jun 04 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
Nov 07 Javascript
如何编写高质量JS代码
Dec 28 Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 Javascript
jQuery中clone()方法用法实例
Jan 16 Javascript
浅谈Javascript实现继承的方法
Jul 06 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
Nov 10 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 jQuery
js实现随机点名程序
Sep 17 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 Javascript
JS实现瀑布流效果
Mar 07 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
利用PHP实现短域名互转
2013/07/05 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php中hashtable实现示例分享
2014/02/13 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
django+echart绘制曲线图的方法示例
2018/11/26 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
汽车检测与维修个人求职信
2013/09/24 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
5人制售《绝地求生》游戏外挂获利500多万元 被判刑
2022/03/31 其他游戏