dhtmlxgantt的弹窗时间范围_“618红包广告”疯狂弹窗!原来是搜狗输入法强制推广...

618电商大促正在火爆进行中,各个平台、商家都使出了浑身解数,也有人趁机浑水摸鱼。近期,不少用户的电脑频繁出现托盘区闪烁弹窗,点击后会打开淘宝天猫的6.18促销网页。

难道是淘宝天猫的新手段?据火绒安全报告,经过工程师溯源调查后发现,该弹窗均竟然来自于用户量极大的搜狗输入法!

据介绍,搜狗输入法的这个广告配置通过云控下发,无法通过设置关闭,而且除了疯狂弹窗,还存在统计用户浏览器浏览历史数据等越位行为,符合广告程序的定义。

7167f23a56802ee3b0b5bd91c0738de8.png

根据分析,搜狗输入法通过云控,向用户下发专门添加了用以在6.18期间弹窗的相关组件,而该组件与“搜狗输入法”主程序功能之间并无任何关联作用。

用户安装运行“搜狗输入法”后,就会频繁收到托盘闪烁弹窗,如果不小心点击,就会打开关于天猫6.18整个推广促销网页。

虽然右键可暂时退出该弹窗,但根据其云控下发的配置,5小时后仍旧会再次顽固弹出,循环往复,严重影响用户的正常上网及工作。

更为严重的是,搜狗输入法还会收集用户本地的安全软件、广告拦截工具的运行状态,甚至搜集用户IE浏览器和搜狗浏览器历史记录数量、页面标题数量,并回传至后台服务器,推测是用于制作用户画像,进行精准推广。

该行为涉及隐私数据,严重越位,存在损害用户权益的风险。

目前,火绒最新版已对搜狗输入法内的弹窗与搜集用户信息的模块进行拦截查杀,可能会导致搜狗输入法的“工具”功能无法使用,但不影响文字输入等主要功能。

fe0f7afc9299483b1cc92ab4b1c6c844.png e8d318981b30861b614042c6f703c13c.png

附录:火绒安全分析报告原文——

一、详细分析近期,搜狗输入法用户大量遇到6.18托盘广告弹窗的情况,该流氓推广行为通过云控下发,在搜狗输入法界面中未发现相关功能开关。广告弹窗程序showinfo.exe由sgutil.dll释放执行,sgutil.dll被sgtool.exe调用。相关代码,如下图所示:

6d615d673ae629617eec1cddedc493de.png

sgtool.exe加载执行sgutil.dll

sgutil.dll执行”StartPopupServer”导出函数后,会根据云端配置释放执行托盘广告模块showinfo.exe。相关代码,如下图所示:

c740a19eb2e2bc091c4afe85328ea0bf.png

根据配置决定是否释放执行showinfo模块

showInfo.exe模块主要负责弹出桌面托盘广告图标及更新广告配置。当此模块运行之后,首先会对存放于%Appdata%LocalLowSogouPYPopupraynet目录下的配置资源config.ini进行AES解密并读取其中的配置信息,相关信息如下图所示:

7594c493af54615f947bc3d428297b0c.png

AES解密并读取配置信息

解密后的config.ini配置信息如下图所示:

解密后的config.ini信息

解密并读取配置信息无误之后,showInfo.exe模块便会收集:系统硬件签名、主机运行的安全软件等信息,连同搜狗输入法的版本信息一起回传。收集的安全软件信息如下图所示:

159749bfbdf36e6751d268f25812dfa7.png

收集的安全软件信息

收集安全软件运行信息相关代码如下图所示:

b59101924bf9aecdf407297997064af6.png

收集安全软件信息

收集的安全软件信息以标记位形式发送给服务器(sfsw及sfw参数中0,1代表各家安全软件运行状态。0代表未运行,1代表正在运行),相关信息如下图所示:

2ac1476892e3e0269df8108409a366cb.png

收集的主机信息内容

收集完所需的主机信息之后,程序便会将其与“http://api.pinyin.sogou.com/v1/bubble/ad“加密发送给服务器“http://get.sogou.com/q”, 发送加密信息相关代码如下图所示 :

2edcc6dd7bccfe9daeb03f5a9be72be6.png

发送加密信息

e53cfdccdd94a9aff1ef18528fad82fd.png

传输的数据信息

服务器根据发送信息,返回加密数据。程序通过AES算法解密之后便得到托盘广告所需的配置信息,解密数据相关代码如下图所示:

2769034810452fb33f56d35cbeba176a.png

AES解密返回数据

解密后的配置数据如下图所示:

333f198af24274bdf9632242a69e27a7.png

解密后的配置数据

当得到所需的托盘广告配置信息以后,程序便将其AES加密并更新到%Appdata%LocalLowSogouPYPopupraynet目录下的net.ini文件中。之后,开始检查当前系统时间是否在net.ini配置中所规定的“sdate”到“edate”时间范围之内,并且查询当前系统时间距离上次关闭广告托盘的时间(config.ini中的lastclose字段值)是否大于5个小时(net.ini中的interval字段值),满足上述两个条件则弹出托盘广告,相关代码如下图所示:

442a1d07cd1902f07168726f532c9054.png

时间检测

弹出广告托盘相关现象如下图所示:

广告托盘

sgutil模块在sgutil.dll加载执行后会根据云端返回的配置决定是否弹出托盘广告,广告弹窗的功能开关只能由云控页面控制(hxxp://api.pinyin.sogou.com/v1/config/netswitch_pc),在搜狗输入法界面中,未发现相关弹窗功能开关。从云端请求的配置信息中“trayad”为弹出开关标记位,如下图所示:

云端配置

当“trayad”标记位为1时,sgutil.dll会从资源中释放执行showinfo模块。相关代码,如下图所示:

9bb309f1dc6e1b68650134367dbc52b6.png

从资源中释放showinfo模块

sgutil.dll会间隔6个小时取最新云端开关的状态。相关代码,如下图所示:

2b1787ca4a301b3a592d86f97ecca88f.png

请求云端开关配置

并且根据不同地区多次测试发现,请求到的开关配置会有所不同。相关现象如下图所示:

e4b68d2f33203b833547fd865b8f33c0.png

不同地区多次测试得到不同的配置

sgutil.dll除了会释放showInfo.exe外,还会收集Chrome内核浏览器和IE浏览器的历史记录信息。虽然历史记录中的URL、标题等数据也会进行收集,但是尚未发现上传上述数据的相关代码逻辑,现阶段仅会上传历史记录条目数量。在获取Chrome内核浏览器历史记录信息时,首先会根据预留的浏览器历史记录数据库路径找到数据库所在位置,如果预留路径为空,则不会执行任何操作。除IE浏览器外,现阶段最新的sgutil.dll模块只会获取搜狗浏览器的历史记录信息。获取Chrome内核浏览器历史记录信息,相关代码如下图所示:

0f67632206c3d1ef288f4537400543ef.png

搜集用户浏览器历史中的标题个数

获取搜狗浏览器历史记录信息相关代码,如下图所示:

c2300db8e3aebe14cd4daf297a151728.png

获取搜狗浏览器历史记录信息

获取其他浏览器历史信息相关代码,如下图所示:

de8210a96717ce20181078e40f5bc520.png

获取其他Chomre内核浏览器历史记录信息

在搜集历史记录信息结束后,会将搜狗浏览器历史记录条目数拼接到HTTP请求参数中。相关代码,如下图所示:

16c1e5fb34e93bd1298320f500cc354b.png

将收集到的浏览器历史信息拼接为HTTP请求参数

获取IE浏览器中历史记录条目数和标题数相关代码,如下图所示:

c726dbf7c062a3a366f64fc641edc21b.png

收集IE浏览器历史记录信息

上述收集到的浏览器历史记录条目数量和标题数量,会被拼接为回传数据的请求链接地址,回传地址为:hxxp://ping.pinyin.sogou.com/webtitlequery.gif。相关代码,如下图所示:

19024cc07ccf972898fde6579bb677cb.png

拼接上传浏览器历史信息的请求参数

由于在目前最新模块中发现了疑似查找360安全浏览器等其他浏览器相关逻辑,但统计这些浏览器浏览历史的代码逻辑无法激活,所以推测以往版本中该模块曾安插过统计其他浏览器浏览历史的代码逻辑。通过分析发现,在2015年的sgutil.dll模块中,我们发现该模块会收集更多不同浏览器的历史记录信息,包括:360安全浏览器、搜狗浏览器、Chrome浏览器、360极速浏览器、猎豹浏览器和淘宝浏览器。相关代码及数据,如下图所示 :

59aeb170385c48d5460aa292764b7ce4.png

早期的sgutil.dll模块历史记录信息收集代码

2015年的sgutil.dll模块文件信息及数字签名信息,如下图所示:

f3cbcedec95935430563e7c65cd020ec.png

2015年的sgutil.dll模块文件信息及数字签名信息

dhtmlXTree进行一个小的扩展 需求1: 动态生成树形菜单,每个节点都有各自的URL地址,单击不同的节点框架页的右侧跳转到该节点所对应的URL。(框架页说明:左边是树形菜单;右边是显示页面相应信息的页面) 分析: dhtmlXTree提供了很好的添加,删除节点的方法,故选择dhtmlXTree。 但是dhtmlXTree不能满足"每个节点都有各自的URL地址,单击不同的节点框架页的右侧跳转到该节点所对应的URL"这点需求,因次想到了对dhtmlXTree进行一个小的扩展,即在其节点对象原有属性的基础上,再添加两个扩展属性。具体操作如下: 1、找到定义节点对象的那个函数(或方法) function dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode) 修改为 function dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode,url,target) 并在方法体中添加赋值语句:this.itemURL=url;this.itemTarget=target; 2、然后修改所有与dhtmlXTreeItemObject有关(直接或者间接相关)的方法: _attachChildNode,insertNewItem,insertNewChild,insertNewNext,_recreateBranch,_parseXMLTree 注:_parseXMLTree方法是与loadXML,loadXMLString相关的。 在这些方法中生成节点的语句中添加相应的参数和语句,以支持新添加的属性itemURL,itemTarget。 需求2: 为dhtmlXTree树上的每一个节点添加右键菜单。附:在树上的节点上点右键时才会生成菜单,空白区域单击时不会生成菜单。 分析: 1、用 dhtmlXTree + dhtmlxmenu 实现。 2、 用dhtmlxmenu生成菜单的部分代码: var menu = new dhtmlXMenuObject(); menu.setImagePath("imgs/"); menu.setIconsPath("images/"); menu.renderAsContextMenu(); menu.loadXML("dhtmlxmenu.xml?e="+new Date().getTime()); menu.addContextZone("treeboxbox_tree"); menu.addContextZone方法是为了把菜单添加到指定区域。 3、dhtmlXTreeObject.prototype._createItem方法是构造树形菜单上元素的具体实现方法。看这个方法的具体操作,可以发现它为每一个节点构建了一个table,节点的内容(即名字)放置在一个span中。 4、考虑到dhtmlxmenu实在指定的区域构建菜单,所以可以为dhtmlXTree树上的每一个节点添加右键事件,在这个右键事件里获得该节点对象所对应的区域,然后在这个区域内构建Menu菜单。 难点和解决方案: 1、怎样获得dhtmlXTree树上的每一个节点对象所对应的区域?(dhtmlXTreeObject.prototype._createItem方法没有为这个节点的span设置id) 解决方法: 在dhtmlXTreeObject.prototype._createItem方法中添加一个为span设置id的语句: 即: 在itemObject.span=document.createElement('span'); itemObject.span.className="standartTreeRow"; 后,新添加一句 itemObject.span.id="treeNode_"+itemObject.id;//为这个span新增一个Id属性 2、为dhtmlXTree树上的每一个节点添加右键事件,在这个右键事件里获得该节点对象所对应的区域,然后在这个区域内构建Menu菜单。 解决方法: a、为dhtmlXTree树上的每一个节点添加右键事件: tree.setOnRightClickHandler(treeOnRegihtClick);//右键事件 b、构建Menu菜单: var menu = new dhtmlXMenuObject(); function treeOnRegihtClick(id){ alert("右键 "+" span.id:"+tree.getItem(id).span.id); menu.setImagePath("imgs/"); menu.setIconsPath("images/"); menu.renderAsContextMenu(); menu.loadXML("dhtmlxmenu.xml?e="+new Date().getTime()); menu.addContextZone(tree.getItem(id).span.id);alert("width:"+tree.getItem(id).span.clientWidth); //var X=tree.getItem(id).span.getBoundingClientRect().left; //var Y=tree.getItem(id).span.getBoundingClientRect().top; var X=document.getElementById('mouseXPosition').value;//获得鼠标的横坐标位置 var Y=document.getElementById('mouseYPosition').value;//获得鼠标的纵坐标位置 menu.showContextMenu(X,Y);//调用showContextMenu方法显示菜单 说明:如果这儿不加上这条语句的话,第一次点击右键时只能生成菜单,但是显示不出菜单,下次点击右键Menu菜单才能弹出。 //menu._showContextMenu(X,Y,tree.getItem(id).span.id); } c、用 javascript 获取当页面上鼠标(光标)位置 <script type="text/javascript"> // 说明:获取鼠标位置 function mousePosition(ev){ if(ev.pageX || ev.pageY){ return {x:ev.pageX, y:ev.pageY}; } return { x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, y:ev.clientY + document.body.scrollTop - document.body.clientTop }; } document.onmousemove = mouseMove; function mouseMove(ev){ ev = ev || window.event; var mousePos = mousePosition(ev); document.getElementById('mouseXPosition').value = mousePos.x; document.getElementById('mouseYPosition').value = mousePos.y; } </script> 页面上放置两个隐藏域存放鼠标的位置:<input type="hidden" id=mouseXPosition><input type="hidden" id=mouseYPosition>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值