这里说的“隐身”是指的Chrome和Firefox的隐身功能。当然,其实这个词并不准确,不过暂且凑合着吧。

浏览器隐身功能的实现好像是在退出的时候自动删除当前SESSION所有的COOKIES。另外一种实现则是给当前session指定一个随机的临时的cookies存放文件夹。

这里我们选择第二种方法。
然后我们知道IE在启动的时候会读取注册表,从中获取COOKIES文件夹存放的位置。所以我们只要修改IE的这个读取过程返回自己定义的值(自己定义的用来保存COOKIES随机文件夹)就行了。

IE读取的路径和值如下:

引用:
PATH -- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
VALUE -- Cookies
为了方便 我们直接拦截读取Value="Cookies"的过程 -- Hook RegQueryValueEx

这里我们使用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)
我们可以在结果中看到 确实截取到了读取“Cookies”的过程,如下图。


那么接下我们直接在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))
现在我们的IE也有“隐身”功能了,我打开4个IE,每个IE使用一个单独的COOKIE文件夹,如下图。
上传的附件 incognito.zip