<?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>SoftRCE.net &#187; ndis 6</title>
	<atom:link href="http://www.softrce.net/archives/tag/ndis-6/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softrce.net</link>
	<description>Software Reverse Code Engineering</description>
	<lastBuildDate>Tue, 13 Sep 2011 06:58:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>基于NDIS Filter 抓包</title>
		<link>http://www.softrce.net/archives/189</link>
		<comments>http://www.softrce.net/archives/189#comments</comments>
		<pubDate>Sat, 30 May 2009 15:07:59 +0000</pubDate>
		<dc:creator>Lewis</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[ndis 6]]></category>
		<category><![CDATA[NDIS Filter]]></category>
		<category><![CDATA[抓包]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=189</guid>
		<description><![CDATA[NDIS Filter]]></description>
			<content:encoded><![CDATA[<p>	NDIS 6.0中有了一个新框架，号称比NDIS IMD更牛B。开始关注这个东西是因为卡巴的防火墙取个名字叫Kaspersky Anti-Virus NDIS Filter ，又听说WDK中才有新框架，但是卡巴老早就在用了，就觉得卡巴真牛。（后来看Filter 的时候，自己的Filter驱动既不能在编译到XP平台的，编译VISTA的安装上去也没用，怀疑卡巴就是一个IMD的驱动，取了个名字NDIS Filter 而已，有空F5下。）<span id="more-189"></span><br />
	说正题，微软建议使用NDIS Filter替代NDIS IMD。Filter Driver比IMD驱动更容易实现，Filter驱动被插入在Miniport驱动和Protocol Driver之间。Filter Driver会 attach到Miniport Driver上，对于Protocol Driver来说，Filter Driver是透明的。Filter Driver与任何设备对象无关。Filter Driver可以动态的安装和卸载。在IMD驱动的里面，你需要注册一个Miniport和Protocol两层驱动。（所以以前的IMD有两个相关联的INF文件。）Filter驱动就没那么麻烦，直接一步搞定。我也不会怎么写理论的文章直接看图吧！</p>
<p>如下图所示：<br />
<img src="http://www.softrce.net/wp-content/uploads/2009/05/2222.jpg" alt="2222" title="2222" width="270" height="473" class="alignnone size-full wp-image-203" /><br />
Filter Driver 框架介绍<br />
	WDK中\src\network\ndis\filter中Filter的主要框架，在MSDN文档里面有对这个框架的详细解释，这里我们只简单说几个函数。</p>
<p>	DriverEntry<br />
	// NDIS调用这个函数为一些数据结构分配内存和作初始化工作<br />
	// 主要的结构体有:<br />
	//NDIS_FILTER_DRIVER_CHARACTERISTICS	指定一些Filter驱动的特性，并把这些参数传给NDIS。<br />
	// 主要的函数：<br />
	//	NdisFRegisterFilterDriver 把Filter驱动注册给NDIS</p>
<p>	FilterAttach<br />
	// NDIS调用这个函数为一些数据结构分配内存和作初始化工作<br />
	// 主要的结构体有:<br />
	//	NDIS_FILTER_ATTACH_PARAMETERS	初始化参数<br />
	//	NDIS_FILTER_ATTRIBUTES			Filter模块的属性</p>
<p>	FilterRegisterDevice<br />
	// 填充分派函数，初始化设备属性。并注册。<br />
	// 主要的结构体有:<br />
	//	NDIS_FILTER_ATTACH_PARAMETERS	初始化参数<br />
	//	NDIS_FILTER_ATTRIBUTES			Filter模块的属性</p>
<p>	FilterSendNetBufferLists<br />
	// 用这个函数去过滤一个NET_BUFFER_LIST的发送<br />
	// 主要的结构体有:<br />
	//	NET_BUFFER_LIST		NET_BUFFER的链表</p>
<p>	FilterReceiveNetBufferLists<br />
	// 用这个函数去过滤一个NET_BUFFER_LIST的接收<br />
	// 主要的结构体有:<br />
	//	NET_BUFFER_LIST		NET_BUFFER的链表</p>
<p>	如果要读取数据包，那么有两个结构体就相当重要了。它们是NET_BUFFER_LIST和 NET_BUFFER。定义如下：<br />
<code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p189code1'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1891"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p189code1"><pre class="c" style="font-family:monospace;">	<span style="color: #993333;">typedef</span>	<span style="color: #993333;">struct</span>	_NET_BUFFER_LIST<span style="color: #009900;">&#123;</span>
		NET_BUFFER_LIST_HEADER			NetBufferListHeader<span style="color: #339933;">;</span>
		PNET_BUFFER_LIST_CONTEXT		Context<span style="color: #339933;">;</span>
		PNET_BUFFER_LIST				ParentNetBufferList<span style="color: #339933;">;</span>
		NDIS_HANDLE						NdisPoolHandle<span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID		NdisReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID		ProtocolReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID		MiniportReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		PVOID							Scratch<span style="color: #339933;">;</span>
		NDIS_HANDLE						SourceHandle<span style="color: #339933;">;</span>
		ULONG							NblFlags<span style="color: #339933;">;</span>
		LONG							ChildRefCount<span style="color: #339933;">;</span>
		ULONG							Flags<span style="color: #339933;">;</span>
		NDIS_STATUS						Status<span style="color: #339933;">;</span>
		PVOID							NetBufferListInfo<span style="color: #009900;">&#91;</span>MaxNetBufferListInfo<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>NET_BUFFER_LIST<span style="color: #339933;">,*</span>PNET_BUFFER_LIST<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">typedef</span>	<span style="color: #993333;">struct</span>	_NET_BUFFER	<span style="color: #009900;">&#123;</span>
		NET_BUFFER_HEADER	NetBufferHeader<span style="color: #339933;">;</span>
		USHORT		ChecksumBias<span style="color: #339933;">;</span>
		USHORT		Reserved<span style="color: #339933;">;</span>
		NDIS_HANDLE	NdisPoolHandle<span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID	NdisReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID	ProtocolReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID MiniportReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		NDIS_PHYSICAL_ADDRESS	DataPhysicalAddress<span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">// was NdisReserved1;</span>
	<span style="color: #009900;">&#125;</span> NET_BUFFER<span style="color: #339933;">,</span>	<span style="color: #339933;">*</span>PNET_BUFFER<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p></code><br />
另外，还有一些宏定义。<br />
NET_BUFFER_LIST_FIRST_NB			从NET_BUFFER_LIST结构中获得第一个NDIS_BUFFER<br />
NET_BUFFER_DATA_OFFSET			从NDIS_BUFFER中获得DATA的偏移<br />
NET_BUFFER_FIRST_MDL				从NDIS_BUFFER中获得第一个MDL<br />
NET_BUFFER_DATA_LENGTH			取得DATA的长度<br />
更具体的自己去看MSDN了。</p>
<p>我根据MSDN和GOOGLE的指点大概写了一段代码了读取数据包。读出数据包的地址和长度。<br />
<code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p189code2'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1892"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="code" id="p189code2"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span>  ReadNetBuffer<span style="color: #009900;">&#40;</span> PNET_BUFFER_LIST NetBufferLists <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PUCHAR				data<span style="color: #339933;">,</span>info<span style="color: #339933;">;</span>
	ULONG				len<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>offset<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	PNET_BUFFER_LIST	CurrNbl<span style="color: #339933;">;</span>
	PNET_BUFFER			Currbuff<span style="color: #339933;">;</span>
	PMDL				mdl<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span>					DataLen<span style="color: #339933;">;</span>
&nbsp;
	CurrNbl <span style="color: #339933;">=</span> NetBufferLists<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>CurrNbl<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		Currbuff <span style="color: #339933;">=</span> NET_BUFFER_LIST_FIRST_NB<span style="color: #009900;">&#40;</span>CurrNbl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			offset <span style="color: #339933;">=</span>	NET_BUFFER_DATA_OFFSET<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			mdl <span style="color: #339933;">=</span>		NET_BUFFER_FIRST_MDL<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			DataLen	<span style="color: #339933;">=</span>	NET_BUFFER_DATA_LENGTH<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> mdl <span style="color: #339933;">&amp;&amp;</span> DataLen <span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				data <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>UCHAR<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>MmGetSystemAddressForMdlSafe<span style="color: #009900;">&#40;</span> mdl<span style="color: #339933;">,</span>NormalPagePriority <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					info <span style="color: #339933;">=</span> data <span style="color: #339933;">+</span> offset<span style="color: #339933;">;</span>
					KdPrint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; PacketData : %p , PacketSize : %d &quot;</span><span style="color: #339933;">,</span>info<span style="color: #339933;">,</span>DataLen<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #009900;">&#125;</span>
			Currbuff <span style="color: #339933;">=</span> NET_BUFFER_NEXT_NB<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		CurrNbl <span style="color: #339933;">=</span> NET_BUFFER_LIST_NEXT_NBL<span style="color: #009900;">&#40;</span>CurrNbl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p></code><br />
	小弟水平很菜，写出来的文章也很戳，欢迎拍砖！热爱丢脸！学习&#8230; &#8230;  再贴个图，凑篇幅<br />
<img src="http://www.softrce.net/wp-content/uploads/2009/05/2-300x131.jpg" alt="2" title="2" width="600" height="262" class="alignnone size-medium wp-image-200" /></p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/189">2009年06月8日</a>, dge writes: 学习</li><li><a href="http://www.softrce.net/archives/189">2009年10月28日</a>, daisy writes: 谢谢博主，通俗易懂，很适合像我一样的初学者，谢谢啦~</li><li><a href="http://www.softrce.net/archives/189">2009年11月17日</a>, archangel writes: 容易是容易，怎么编译安装得，说一下啊。wdk</li><li><a href="http://www.softrce.net/archives/189">2010年01月16日</a>, daisy writes: 博主，谢谢你给的小例子，在filter sample里边加入你的代码运行成功后让我长了不少自信。之前一直研究如何通过filter drive修改NET_BUFFER_LIST，对NetBufferList的架构一直难以理解，看你例子的简单读取NetBuffer的数据，比看那一大堆文档明了很多。现在想请教博主一个问题，博士是否了解一些filter driver如何修改NetBuffer的相关技术，msdn里边说只有其创建者才可修改其内容，我试着用NdisAllocateCloneNetBufferList()等函数去复制原NetBufferList，然后修改都不成功。如果博主有了解相关方便的知识，麻烦你可以从百忙中抽出一点时间，给我一些指点或者提示，我的email：hellodaisy@139.com,先谢了~</li><li><a href="http://www.softrce.net/archives/189">2010年01月30日</a>, gz1x writes: 我以前有个项目是LWF的，等有时间写篇文章抛抛砖。</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/256" rel="bookmark" title="Permanent Link: Step deeply into NDIS6 LightWeight Filter, part 1">Step deeply into NDIS6 LightWeight Filter, part 1</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2009年04月26日 -- <a href="http://www.softrce.net/archives/1" title="SoftRCE再次回归上线">SoftRCE再次回归上线</a></li><li>2010年03月11日 -- <a href="http://www.softrce.net/archives/296" title="Think Different">Think Different</a></li><li>2010年05月12日 -- <a href="http://www.softrce.net/archives/312" title="RdpDr.sys Bug Check 0X7E{0xC0000005}">RdpDr.sys Bug Check 0X7E{0xC0000005}</a></li><li>2010年08月3日 -- <a href="http://www.softrce.net/archives/320" title="SoftRCE官方T恤开始订购了~">SoftRCE官方T恤开始订购了~</a></li><li>2009年12月27日 -- <a href="http://www.softrce.net/archives/210" title="Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial">Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial</a></li><li>2008年09月29日 -- <a href="http://www.softrce.net/archives/9" title="文章预告：Exploiting Windows Device Drivers">文章预告：Exploiting Windows Device Drivers</a></li><li>2010年09月13日 -- <a href="http://www.softrce.net/archives/337" title="金山毒霸2011内核溢出漏洞">金山毒霸2011内核溢出漏洞</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/15" title="构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器">构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器</a></li><li>2009年05月15日 -- <a href="http://www.softrce.net/archives/136" title="ActiveX 控件组件的Fuzz和利用">ActiveX 控件组件的Fuzz和利用</a></li><li>2009年05月5日 -- <a href="http://www.softrce.net/archives/126" title="[玩笑]某人不是会坐在被告席上吧？">[玩笑]某人不是会坐在被告席上吧？</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/189/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

