今天看到LCX大哥转的这篇文章——《关于flash封装JS代码的一些TIPS》,讲的是关于flash网马封装的一些技巧,挺受学习的(比如返回一个假的网马来进行欺骗)。在文章中看到了部分关于绕过“脚本hook来得到网马内容”的一些方法,和我上次的文章有些关联,引用如下:
JS代码可以由FLASH进行任意加密,调用之前当然会需要解密,看上去没什么区别。但是在使用静态分析的朋友的眼里那可就变得更复杂了一些。 因为经过加密后的js代码会被放入flash里一起编译进swf文件里,再对swf文件进行混淆,那个反编译出来的DD还有几个人能看得懂撒?
说到这里,又有朋友说了,我不管你怎么加密,你的js最终还是要通过外部接口交由浏览器执行的,既然你执行,那么肯定会调用eval这个js函数的,那好,我hook这个函数不就行了吗?~~~我只能说,你很聪明,但还不够聪明。谁说的我执行js代码就非要用eval函数的撒?网上那么流传的而已,我使用setTimeout函数行不行?你说啥,你要把这个函数也hook了?OK,我使用匿名函数,我看你hook啥去?不相信?look下面的代码:
package{
import flash.external.ExternalInterface;
public class Movie extends Sprite{
public function Movie() {
var myjs:String="alert('see me?');";//换成你的js
ExternalInterface.call("(function(){"+myjs+"})()");
}
}
}
这样的代码,我看看你再hook啥去?啊?哈哈!除了这个难道就没别的了吗?多啊,匿名对象?toString重载?toValue重载?等等!
其实,作者提到的这个技巧还是能够被拦截的,示例代码如下:
<script language="javascript">
// hook
fnobj = Function;
Function = function(v) {
alert("Hooker said: \r\n\t\r\n\tYou are...\r\n\t\r\n\t" + v);
alert("Begin to execute your codes...");
fn = new fnobj("(" + v + ")()");
fn();
}
// ExternalInterface.call("...")
(function() {
alert("you can not see me");
})();
</script>