<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Google Stop Blog - Make a change &#187; Windows Programming</title>
	<atom:link href="http://googlestop.com/blog/tag/windows-programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://googlestop.com/blog</link>
	<description>Just another weblog of Charry</description>
	<lastBuildDate>Sat, 07 Jan 2012 09:51:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>API Hook的问题，卡住了:(</title>
		<link>http://googlestop.com/blog/2007/07/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/</link>
		<comments>http://googlestop.com/blog/2007/07/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 16:25:14 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Windows Programming]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Network Programming]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2007/07/06/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/</guid>
		<description><![CDATA[这两天研究如何在我自己的进程中，获取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(&#8220;In my_recv&#8221;));           OutputDebugString(buf);         SaveLog(buf, len);         int nReturn = 0;         myJmp.SetHookOff();         nReturn = recv(s, buf, len, flags);         myJmp.SetHookOn();         [...]]]></description>
			<content:encoded><![CDATA[<p>这两天研究如何在我自己的进程中，获取IE或者FireFox中的网页内容，也就是监视用户上网信息。需要通过API Hook的方式拦截IE(拦截FireFox也是一个道理)用的API。</p>
<p> 刚开始的思路是，我想Hook MSHTML.dll 中的API，用Depends看了一下，发现只有寥寥几个导出函数，诸如ShowHTMLDialog(), 这些都不能获取网页内容。那么再换个DLL呢，于是Depends一下，ShDocVw.dll，导出函数倒是不少，大部分名字都是N/A，只有几个如OpenURL(), AddUrlToFavorites()，对我也没什么用。</p>
<p>上面的方法不行，我只能再向底层靠了，准备Hook Ws2_32.dll，Depends这个DLL，你可以看到，N多导出函数，让人赏心悦目，其中recv就是我要Hook的API，写了一个Demo程序，然后打开IE，运行这个Demo，发现毫无反应，我开始怀疑是我的API Hook的方式不对，后来我用同样的方法，发现可以拦截住user32.dll的MessageBoxA，百思不得其解。Google一下，发现有人和我遇到类似的问题：</p>
<p><strong><a href="http://www.javaworld.com.tw/roller/page/qing?entry=2007_3_26_hook_msn_messenger%E4%B9%8Bsocket%E9%80%9A%E8%A8%8A%E7%9A%84%E9%B3%A5%E4%BA%8B" target="_blank">Hook MSN Messenger之socket通訊的鳥事</a></strong></p>
<p>于是这次我挂到wsock32.dll，果然，这次有反应了。总算前进了一小步，离我要获得网页内容还有很多距离呢，我的recv函数中也就是my_recv内容如下：</p>
<p>int PASCAL FAR my_recv (SOCKET s, char FAR * buf, int len, int flags)<br />
{<br />
        OutputDebugString(_T(&#8220;In my_recv&#8221;));<br />
 <br />
        OutputDebugString(buf);</p>
<p>        SaveLog(buf, len);</p>
<p>        int nReturn = 0;<br />
        myJmp.SetHookOff();<br />
        nReturn = recv(s, buf, len, flags);<br />
        myJmp.SetHookOn();</p>
<p>        return (nReturn);<br />
}</p>
<p>打印出buf的内容，用DebugView可以看到，很多都是乱码。不知道别人都怎么分析recv到的数据流的，怎么才能从中获取文本内容。接下来，保存也是一个问题，SaveLog的第二个参数是buf的长度，我觉得应该填recv的返回值，它是实际返回的数据的长度。但是把SaveLog放到recv后面，就不能保存到文件中，放到前面就可以，没办法，这里我只能用len。</p>
<p>打开文件如下图：</p>
<p><a title="2007-07-07_00-14-02.jpg" rel="lightbox" href="http://googlestop.com/blog/wp-content/uploads/2007/07/2007-07-07_00-14-021.jpg"><img src="http://googlestop.com/blog/wp-content/uploads/2007/07/2007-07-07_00-14-021-150x150.jpg" alt="2007-07-07_00-14-02.jpg" /></a></p>
<p>最后还有个问题是：卸载这个钩子的时候，偶尔会让IE崩溃。下面是我的一个demo，有兴趣的可以帮忙调试看看上面的若干个问题该怎么解决。写的仓促，代码很乱，我也没去测试Release是否有问题，暂且这么着吧。</p>
<p><a href="http://googlestop.com/download/APIHookTest.zip">Downlaod Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2007/07/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

