这里说的“隐身”是指的Chrome和Firefox的隐身功能。当然,其实这个词并不准确,不过暂且凑合着吧。
浏览器隐身功能的实现好像是在退出的时候自动删除当前SESSION所有的COOKIES。另外一种实现则是给当前session指定一个随机的临时的cookies存放文件夹。
这里我们选择第二种方法。
然后我们知道IE在启动的时候会读取注册表,从中获取COOKIES文件夹存放的位置。所以我们只要修改IE的这个读取过程返回自己定义的值(自己定义的用来保存COOKIES随机文件夹)就行了。
IE读取的路径和值如下:
这里我们使用PYdotDLL来实现HOOK。嗯,事实上这篇文章也是因为PYdotDLL而写。
(PYdotDLL -- http://bbs.pediy.com/showthread.php?t=120438)
为了让IE加载PYdotDLL 我们先用LordPE修改IE程序(当然你可以用你喜欢的方式,譬如LPK补丁),如下图:
接下来我们就可以安心写自己的代码了。
我们先HOOK RegQueryValueExA
然后打印出所有的lpValueName,查看下面是否有“Cookies”, 如果有则我们HOOK的函数没有错误。
下面是代码
代码:
@HOOKDecorator('advapi32.RegQueryValueExA', lpValueName=ctypes.c_char_p) def RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData): print lpValueName return OriginFunction(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
那么接下我们直接在HOOK过程中返回一个新的临时文件夹即可达到我们的目的。
下面是代码:
代码:
newpath = tempfile.mkdtemp('-cookies') def Filter_QueryValueEx(lpValueName, lpData, lpcbData, isWchar): if lpValueName and lpValueName.lower() == 'cookies': needsize = ctypes.cast(lpcbData, ctypes.POINTER(ctypes.c_int32)).contents if lpData == 0: needsize.value = 1024*2 else: tmptype = ctypes.ARRAY((isWchar and ctypes.c_wchar or ctypes.c_char), 1024*2) path = ctypes.cast(lpData, ctypes.POINTER(tmptype)).contents path.value = newpath needsize.value = isWchar and (2*len(path.value)) or (len(path.value))