上一篇提到了如何做hook,也讲到了hook表单提交的几种不同方式。
今天要讲的是实现的一点细节。
我们知道,javascript中大部分的method都是非阻塞的,这样的好处是可以提高效率,坏处是很多时候我们确实是需要阻塞的功能。
极少数method是阻塞的,比如 alert()这个函数,在alert()执行完成并返回前,alert()之后的javascript代码都不会执行。
再比如html页面里的 <link >标签应该也是一个阻塞的标签,在该stylesheet加载完成前,后面的标签都不会加载。
所以我们如果在执行一些javascript函数时,如果需要等待某个函数的返回结果,才继续执行,就需要使用这一类方法或者技巧。
在hook submit的过程中我就遇到了类似的问题:
不论是使用jQuery中的绑定事件,或者是自己hook函数的方法,均会产生一个类似 竞争条件 的问题,在submit提交时,还没有执行完logCookie的过程,页面就已经跳转了,从而使得cookie记录失败。
所以我们需要做的事情就是,
使得 anehta.logger.logForm() 这个函数 阻塞,或者 迟滞…
其实,JS中最简单的hook是直接重载目标函数。在之前提到的“JSON Hijacking”中就是使用的这种方法。
简单来说,就是把目标函数重新定义一遍,这样就会覆盖掉原来的函数,当函数执行时,就会跑去执行新的函数了。
但是这种方法效率不高,且通用性不好,所以我在Anehta 中重新实现了一次通用的hook函数。
Anehta 中的hook方法包括三个:hook、unhook、injectFn
使用方法是:
var hj = new anehta.inject.hookFunction();
var SaveTarget, HookFn;
hj.hook(‘Target’, ‘SaveTarget’, ‘HookFn’);
hj.injectFn(‘Target’,…
作者:刺
Anehta中采用了一种同机识别的技术,我在项目中将其称为“水印”(Watermark).
看过我的录像演示的人应该有印象,效果如下:
如果一个客户端被打上了水印,那么,不管客户端删除了cookie、缓存,抑或是切换了各种不同的浏览器,其水印都不会变化。
换句话来说,就是常规的清除上网痕迹的措施,都无法清除掉anehta给客户端打上的水印。
这看起来好像跟变魔术一样,其实揭穿了很简单,我是通过Flash的shared objects来做的,也可以称作flash cookie。
其实这种技术在比较早的时候foundstone的paper中就提到过了,同时还有提到的是一个IE persistence Data,会保存在IE临时文件的一个index.dat中,也是光删cookie或缓存删不掉的。但是这个持久数据在IE7中已经不能再这么利用了,所以我这里仅仅使用了flash的cookie。
而yahoo和alibaba都使用了这种技术用在登录入口来防范钓鱼的威胁。
正常来说,flash cookie保存在系统的如下位置: C:\Documents and Settings\yourusername\Application Data\Macromedia\Flash Player\#SharedObjects\
在这个目录下可以看到非常多的网站目录,里面都有他们的flash留下的痕迹。 由于一般删除cookie、删除缓存等不会来清理这里,所以就给客户端打上了一个水印。 可以看到,这个位置是和windows的系统用户相关的,所以如果切换了一个windows的系统用户,也会导致水印发生改变。
由于flash是跨浏览器的,所以水印也就可以跨浏览器了,显得很神奇:换到了firefox上,还能被认出来!
然而更神奇的是,只要flash的加载位置不变,那么就算从A站切换到了B站,也照样能识别出来。
这是因为flash cookie是记录在flash加载域名下的,所以,如果有如下情景:
www.a.com 上加载了 www.c.com/flash.swf ,打上了一个水印
用户之后访问…