Archive for the 'Hook' Category

API Hook的问题,卡住了:(

这两天研究如何在我自己的进程中,获取IE或者FireFox中的网页内容,也就是监视用户上网信息。需要通过API Hook的方式拦截IE(拦截FireFox也是一个道理)用的API。

 刚开始的思路是,我想Hook MSHTML.dll 中的API,用Depends看了一下,发现只有寥寥几个导出函数,诸如ShowHTMLDialog(), 这些都不能获取网页内容。那么再换个DLL呢,于是Depends一下,ShDocVw.dll,导出函数倒是不少,大部分名字都是N/A,只有几个如OpenURL(), AddUrlToFavorites(),对我也没什么用。

上面的方法不行,我只能再向底层靠了,准备Hook Ws2_32.dll,Depends这个DLL,你可以看到,N多导出函数,让人赏心悦目,其中recv就是我要Hook的API,写了一个Demo程序,然后打开IE,运行这个Demo,发现毫无反应,我开始怀疑是我的API Hook的方式不对,后来我用同样的方法,发现可以拦截住user32.dll的MessageBoxA,百思不得其解。Google一下,发现有人和我遇到类似的问题:

Hook MSN Messenger之socket通訊的鳥事

于是这次我挂到wsock32.dll,果然,这次有反应了。总算前进了一小步,离我要获得网页内容还有很多距离呢,我的recv函数中也就是my_recv内容如下:

int PASCAL FAR my_recv (SOCKET s, char FAR * buf, int len, int flags)
{
        OutputDebugString(_T("In my_recv"));
 
        OutputDebugString(buf);

        SaveLog(buf, len);

        int nReturn = 0;
        myJmp.SetHookOff();
        nReturn = recv(s, buf, len, flags);
        myJmp.SetHookOn();

        return (nReturn);
}

打印出buf的内容,用DebugView可以看到,很多都是乱码。不知道别人都怎么分析recv到的数据流的,怎么才能从中获取文本内容。接下来,保存也是一个问题,SaveLog的第二个参数是buf的长度,我觉得应该填recv的返回值,它是实际返回的数据的长度。但是把SaveLog放到recv后面,就不能保存到文件中,放到前面就可以,没办法,这里我只能用len。

打开文件如下图:

2007-07-07_00-14-02.jpg

最后还有个问题是:卸载这个钩子的时候,偶尔会让IE崩溃。下面是我的一个demo,有兴趣的可以帮忙调试看看上面的若干个问题该怎么解决。写的仓促,代码很乱,我也没去测试Release是否有问题,暂且这么着吧。

Downlaod Demo