查看文章
 
动态解密flash网马(三)
2009-08-26 13:23

先引用下mikawawa同学的留言

非常好啊,重写构造函数的确是个好办法。那如果是匿名对象的话,该怎么HOOK呢,比如:new function() {alert("you can not see me");}这样执行,或者直接:{alert("you can not see me");}如何hook匿名类的构造函数呢?


关于匿名函数,之前确实没怎么了解过,所以查了点资料。做个测试:

<script language="javascript">
<!--
document.write(function(){alert('xx');}.constructor);
document.write("<br/>");
document.write(new function(){alert('xx');}.constructor);
//-->
</script>

最后的输出为

function Function() { [native code] }
function anonymous() { }

通过上面的结果,我们可以看出,上篇文章所讲的挂钩Function构造函数可以针对 (function() {alert("you can not see me");})(); 这种形式的写法进行拦截,但是像 mikawawa 后来所提到的 new function(){alert('xx');} 这种形式就不知道找谁去hook了

当然,如果确实想获得 ExternalInterface.call 的内容,我们还是可以有办法的——直接从内存中dump出来,只不过在脚本层面是暂时没有方法了。

0023ddd4 "try { __flash__toXML(new functio"
0023de14 "n(){alert('anonymouse function')"
0023de54 ";}()) ; } catch (e) { "<undefine"
0023de94 "d/>"; }"

不过用调试器来截取数据内容确实很不方便,找了下,最终找到一个好工具——IE8。通过IE8的开发人员工具,我们可以在单步调试中获取flash想要执行的脚本的完整内容。比如下面这段代码:

<script language="javascript">
<!--
var test = null;
//-->
</script>
<embed src="test.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="test" align="middle"
allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage=http://www.adobe.com/go/getflashplayer_cn />

先在 var test = null; 这里下个断点,在这里断下后继续单步前进,这个时候就能跳入flash所执行的js代码中去了。

另外,mikawawa同学所说的用 {alert("you can not see me");} 这种匿名类也是可以的。按照我的理解,这个应该是一个语句块,而非匿名类,匿名类的写法应该是 {}(空类)或者 {a:"a", b:"b"} 这种形式的吧。经过测试 ExternalInterface.call("{alert('you can not see me');}") 的执行是失败的。


类别:默认分类||添加到搜藏 |分享到i贴吧|浏览(421)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu