<?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>大千世界 &#187; 网络</title>
	<atom:link href="http://www.zhangdaqian.net/blog/tag/%e7%bd%91%e7%bb%9c/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zhangdaqian.net</link>
	<description>Hold Infinity in the palm of your hand</description>
	<lastBuildDate>Thu, 05 Jan 2012 13:59:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>通过emule做DDOS是否可行？</title>
		<link>http://www.zhangdaqian.net/blog/%e9%80%9a%e8%bf%87emule%e5%81%9addos%e6%98%af%e5%90%a6%e5%8f%af%e8%a1%8c%ef%bc%9f.htm</link>
		<comments>http://www.zhangdaqian.net/blog/%e9%80%9a%e8%bf%87emule%e5%81%9addos%e6%98%af%e5%90%a6%e5%8f%af%e8%a1%8c%ef%bc%9f.htm#comments</comments>
		<pubDate>Thu, 30 Apr 2009 13:25:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[DDOS]]></category>
		<category><![CDATA[emule]]></category>
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://www.zhangdaqian.net/blog/%e9%80%9a%e8%bf%87emule%e5%81%9addos%e6%98%af%e5%90%a6%e5%8f%af%e8%a1%8c%ef%bc%9f.htm</guid>
		<description><![CDATA[by 云舒
今天抽空看了下emule协议几个可能会出问题的地方，初步感觉是可能真的有问题。下了代码回来看了，不过代码太大，目前还没找到地方，没法对想法进行印证。我简单的说下，看哪位代码牛人能够在项目中找到对应的代码。
首先是在客户端连接到服务器之后，搜索文件时，服务器返回结果的报文。报文中返回的结果是一个集合，每个集合表示一条记录。但是每条记录中，并不包含拥有该文件的客户端的IP地址，而是返回的拥有该文件的客户端的ClientID和端口。这里我猜测ClientID的计算是可逆的，搜索发起者可以根据这个 ClientID计算出IP地址，然后连接，请求下载文件。具体报文结构如下： 



名称
大小（字节）
默认值
注释


协议类型
1
0xE3
 

大小
4

不包含报文和大小域的报文大小


类型
1
0&#215;16
操作码 OP SEARCHRESULT 的值


结果数
4
N/A
此报文中包含的结果数目


结果列表
可变
N/A
一个结果的列表



搜索结果列表项格式：



名称
大小（字节）
默认值
注释


文件HASH
16
N/A
用于识别文件的 Hash 值


客户端 ID
4
N/A
eMule服务器分配给客户端的ID


客户端端口
2
N/A
客户端的监听的TCP端口


标志数
4
N/A
其后的属性标志个数


标志列表
可变
N/A
标志列表



其次的第二个地方是下载文件的地方，客户端要求下载一个文件时，服务器会返回一个源查找结果报文。该报文也是只包含源的ClientID和端口，客户端应该是按照ClientID计算出IP地址，再去连接下载文件的。具体报文如下：



名称
大小（字节）
默认值
注释


协议类型
1
0xE3
 

大小
4
N/A
不包含报文头和大小域的报文大小


类型
1
0&#215;42
操作码 OP FOUNDSOURCES 的值


文件HASH
16
N/A
相关文件的 Hash 值


源数量
1
N/A
拥有该文件的机器的数量


源列表
可变
N/A
源列表内容，每一条是一个可用源



每一条源的报文格式如下：



名称
大小（字节）
默认值
注释


客户端 ID
4
N/A
共享该文件的客户端的 ID


客户端端口
2
N/A
共享该文件的客户端端口



可以看到，搜索某个文件时，服务器返回的搜索列表中按照ClientID来区分不同的其它客户端。在开始下载一个文件时，服务器返回的可用源列表中，每个源也是以一个ClientID来表示的。也就是说，没一个ClientID就可以确定一个源，区分开彼此。而emule可以根据这个ClientID找到对应的客户端，去连接指定端口，请求文件。那么，现在的问题是这个ClientID是哪里来的？
原来这个ClientID在正常情况下，是我们连接到emule服务器时，服务器分配给我们的。但是注意到，在连接之后，我们可以像服务器提供我们所拥有的文件列表，报文格式如下：



名称
大小（字节）
默认值
注释


协议类型
1
0xE3
 

大小
4

不包含报文和大小域的报文大小


类型
1
0&#215;15
操作码 OP SEARCHRESULT 的值


文件数
4
N/A
共享列表中的文件数，这个数不超过 200


文件列表
可变
N/A
可选的文件列表,单个项的描述见下



单个文件条目描述我就不细写了，比较有用的字段是文件Hash码，ClientID，以及端口。这样看来，我们在连接到服务器之后，告诉它baidu的IP地址，TCP80端口，有赤壁下载，或者有XXX片下载，别人下载的时候，emule客户端会不会从服务器返回的可用源列表中，找到这条记录，并且去连接？
关键问题到了ClientID的计算，协议中这样描述的：假设 IP 地址为 X.Y.Z.W,则客户端 ID 按公式 X+28*Y+216*Z+24*W (Big Endian[6])计算。如果想法是正确的，那么我们可以先计算出百度的IP地址的ClientID，端口设置为80，然后通知服务器，这个 ClientID有高树的片子可以看……
你还想看

Windows XP的无线桥接

]]></description>
			<content:encoded><![CDATA[<p>by 云舒</p>
<p>今天抽空看了下emule协议几个可能会出问题的地方，初步感觉是可能真的有问题。下了代码回来看了，不过代码太大，目前还没找到地方，没法对想法进行印证。我简单的说下，看哪位代码牛人能够在项目中找到对应的代码。</p>
<p>首先是在客户端连接到服务器之后，搜索文件时，服务器返回结果的报文。报文中返回的结果是一个集合，每个集合表示一条记录。但是每条记录中，并不包含拥有该文件的客户端的IP地址，而是返回的拥有该文件的客户端的ClientID和端口。这里我猜测ClientID的计算是可逆的，搜索发起者可以根据这个 ClientID计算出IP地址，然后连接，请求下载文件。具体报文结构如下： <br/><span id="more-2186"/></p>
<table cellpadding="1" width="80%" cellspacing="1" border="1">
<tbody>
<tr>
<td>名称</td>
<td>大小（字节）</td>
<td>默认值</td>
<td>注释</td>
</tr>
<tr>
<td>协议类型</td>
<td>1</td>
<td>0xE3</td>
<td/> </tr>
<tr>
<td>大小</td>
<td>4</td>
<td/>
<td>不包含报文和大小域的报文大小</td>
</tr>
<tr>
<td>类型</td>
<td>1</td>
<td>0&#215;16</td>
<td>操作码 OP SEARCHRESULT 的值</td>
</tr>
<tr>
<td>结果数</td>
<td>4</td>
<td>N/A</td>
<td>此报文中包含的结果数目</td>
</tr>
<tr>
<td>结果列表</td>
<td>可变</td>
<td>N/A</td>
<td>一个结果的列表</td>
</tr>
</tbody>
</table>
<p>搜索结果列表项格式：</p>
<table cellpadding="1" width="80%" cellspacing="1" border="1">
<tbody>
<tr>
<td>名称</td>
<td>大小（字节）</td>
<td>默认值</td>
<td>注释</td>
</tr>
<tr>
<td>文件HASH</td>
<td>16</td>
<td>N/A</td>
<td>用于识别文件的 Hash 值</td>
</tr>
<tr>
<td>客户端 ID</td>
<td>4</td>
<td>N/A</td>
<td>eMule服务器分配给客户端的ID</td>
</tr>
<tr>
<td>客户端端口</td>
<td>2</td>
<td>N/A</td>
<td>客户端的监听的TCP端口</td>
</tr>
<tr>
<td>标志数</td>
<td>4</td>
<td>N/A</td>
<td>其后的属性标志个数</td>
</tr>
<tr>
<td>标志列表</td>
<td>可变</td>
<td>N/A</td>
<td>标志列表</td>
</tr>
</tbody>
</table>
<p>其次的第二个地方是下载文件的地方，客户端要求下载一个文件时，服务器会返回一个源查找结果报文。该报文也是只包含源的ClientID和端口，客户端应该是按照ClientID计算出IP地址，再去连接下载文件的。具体报文如下：</p>
<table cellpadding="1" width="80%" cellspacing="1" border="1">
<tbody>
<tr>
<td>名称</td>
<td>大小（字节）</td>
<td>默认值</td>
<td>注释</td>
</tr>
<tr>
<td>协议类型</td>
<td>1</td>
<td>0xE3</td>
<td/> </tr>
<tr>
<td>大小</td>
<td>4</td>
<td>N/A</td>
<td>不包含报文头和大小域的报文大小</td>
</tr>
<tr>
<td>类型</td>
<td>1</td>
<td>0&#215;42</td>
<td>操作码 OP FOUNDSOURCES 的值</td>
</tr>
<tr>
<td>文件HASH</td>
<td>16</td>
<td>N/A</td>
<td>相关文件的 Hash 值</td>
</tr>
<tr>
<td>源数量</td>
<td>1</td>
<td>N/A</td>
<td>拥有该文件的机器的数量</td>
</tr>
<tr>
<td>源列表</td>
<td>可变</td>
<td>N/A</td>
<td>源列表内容，每一条是一个可用源</td>
</tr>
</tbody>
</table>
<p>每一条源的报文格式如下：</p>
<table cellpadding="1" width="80%" cellspacing="1" border="1">
<tbody>
<tr>
<td>名称</td>
<td>大小（字节）</td>
<td>默认值</td>
<td>注释</td>
</tr>
<tr>
<td>客户端 ID</td>
<td>4</td>
<td>N/A</td>
<td>共享该文件的客户端的 ID</td>
</tr>
<tr>
<td>客户端端口</td>
<td>2</td>
<td>N/A</td>
<td>共享该文件的客户端端口</td>
</tr>
</tbody>
</table>
<p>可以看到，搜索某个文件时，服务器返回的搜索列表中按照ClientID来区分不同的其它客户端。在开始下载一个文件时，服务器返回的可用源列表中，每个源也是以一个ClientID来表示的。也就是说，没一个ClientID就可以确定一个源，区分开彼此。而emule可以根据这个ClientID找到对应的客户端，去连接指定端口，请求文件。那么，现在的问题是这个ClientID是哪里来的？</p>
<p>原来这个ClientID在正常情况下，是我们连接到emule服务器时，服务器分配给我们的。但是注意到，在连接之后，我们可以像服务器提供我们所拥有的文件列表，报文格式如下：</p>
<table cellpadding="1" width="80%" cellspacing="1" border="1">
<tbody>
<tr>
<td>名称</td>
<td>大小（字节）</td>
<td>默认值</td>
<td>注释</td>
</tr>
<tr>
<td>协议类型</td>
<td>1</td>
<td>0xE3</td>
<td/> </tr>
<tr>
<td>大小</td>
<td>4</td>
<td/>
<td>不包含报文和大小域的报文大小</td>
</tr>
<tr>
<td>类型</td>
<td>1</td>
<td>0&#215;15</td>
<td>操作码 OP SEARCHRESULT 的值</td>
</tr>
<tr>
<td>文件数</td>
<td>4</td>
<td>N/A</td>
<td>共享列表中的文件数，这个数不超过 200</td>
</tr>
<tr>
<td>文件列表</td>
<td>可变</td>
<td>N/A</td>
<td>可选的文件列表,单个项的描述见下</td>
</tr>
</tbody>
</table>
<p>单个文件条目描述我就不细写了，比较有用的字段是文件Hash码，ClientID，以及端口。这样看来，我们在连接到服务器之后，告诉它baidu的IP地址，TCP80端口，有赤壁下载，或者有XXX片下载，别人下载的时候，emule客户端会不会从服务器返回的可用源列表中，找到这条记录，并且去连接？</p>
<p>关键问题到了ClientID的计算，协议中这样描述的：假设 IP 地址为 X.Y.Z.W,则客户端 ID 按公式 X+28*Y+216*Z+24*W (Big Endian[6])计算。如果想法是正确的，那么我们可以先计算出百度的IP地址的ClientID，端口设置为80，然后通知服务器，这个 ClientID有高树的片子可以看……</p>
<h3>你还想看</h3>
<ul class="related_post">
<li><a href="http://www.zhangdaqian.net/blog/windows-xp%e7%9a%84%e6%97%a0%e7%ba%bf%e6%a1%a5%e6%8e%a5.htm" title="Windows XP的无线桥接">Windows XP的无线桥接</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zhangdaqian.net/blog/%e9%80%9a%e8%bf%87emule%e5%81%9addos%e6%98%af%e5%90%a6%e5%8f%af%e8%a1%8c%ef%bc%9f.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows XP的无线桥接</title>
		<link>http://www.zhangdaqian.net/blog/windows-xp%e7%9a%84%e6%97%a0%e7%ba%bf%e6%a1%a5%e6%8e%a5.htm</link>
		<comments>http://www.zhangdaqian.net/blog/windows-xp%e7%9a%84%e6%97%a0%e7%ba%bf%e6%a1%a5%e6%8e%a5.htm#comments</comments>
		<pubDate>Mon, 30 Mar 2009 09:40:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[widows]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[网络]]></category>

		<guid isPermaLink="false">http://www.zhangdaqian.net/blog/windows-xp%e7%9a%84%e6%97%a0%e7%ba%bf%e6%a1%a5%e6%8e%a5.htm</guid>
		<description><![CDATA[目前大部分的笔记本都是有两块网卡，一块是普通网卡，一块是无线网卡。一般有网口的地方会用普通网卡，通过网线连接上网，以获得较好的性能，没有网口的地方，会用无线上网。通常情况下，即使在同一个局域网里面，如果手工配置IP地址，必须为这两个不同的链接配置不同的IP地址，因为windows不允许为两个不同的适配器配置相同的IP地址。在特殊情况下，例如，使用电驴并在路由器上做了端口映射，于是需要在两种情况下都使用相同的IP地址，又不想每次都重新手工配置，这个时候可以用Windows自带的桥接模式来解决这个问题。

在网络连接的文件夹中，选中&#8221;本地连接&#8221;和&#8221;无线网络连接&#8221;，击右键，选择&#8221;桥接&#8221;。这个时候将创建一个新的连接，叫&#8221;网络桥&#8221;（MAC Birdge Miniport)。这时候就可以手工为&#8221;网路桥&#8221;配置IP地址了。这样配置后，发现当接上网线时，上网是没有任何问题的，但是一旦拔开网线，改用无线上网，就上不去了，但是无线网卡显示的是连接上的状态。百思不得其解。Google了一下，发现了这两个连接：
Windows XP Home Networking: Building Network Bridges
Bridge May Not Work With a Non-Promiscuous Mode Network Adapter
其中，提到了一个东西：&#8221;Promiscuous Mode&#8221;。原来，网卡工作在普通状态时，只接收属于自己的MAC地址的以太网包。只有当工作在&#8221;Promiscuous Mode&#8221;时，才不加限制地接收所有的以太网包。大部分的普通网卡都可以工作在&#8221;Promiscuous Mode&#8221;，可能为了安全起见，大部分的无线网卡都不能工作在&#8221;Promiscuous Mode&#8221;下。当Windows创建桥接模式时，实际上在系统里面创建了一个虚拟的新的网卡，这个新的网卡有自己的MAC地址，桥里面的所有网卡都以这个新的MAC地址发送以太网包，回送的以太网包自然也是发给这个新的MAC地址，由于普通网卡支持&#8221;Promiscuous Mode&#8221;，所以可以接收到不属于自己的新的MAC地址以太网包，所以通讯正常，无线网卡会抛弃掉所有不属于自己MAC地址的包，所以在桥接模式下收不到任何发回来的以太网包，自然就不能正常工作了。Windows XP提供了一个解决办法，叫ForceCompatibilityMode（强制兼容模式），在命令行（cmd）下，打入netsh bridge show a，可以看到已经桥接的各个网卡的编号和是否启用强制兼容模式，如果无线网卡显示&#8221;已停用&#8221;或者&#8221;未知&#8221;，应记住无线网卡的编号，并在命令行下打入：netsh bridge set a X e，其中X是无线网卡的编号，以启用强制兼容模式。
这个兼容模式的原理是这样的，一旦某个网卡启用了这个模式，当从这个网口向外发送以太网包时，将改写以太网包，把源地址换成网卡自己的MAC地址，并记住这个转换，回复的以太网包的目标地址也是网卡的MAC地址，这样网卡就不会丢弃这个包，当这个收到这个回复包后，再根据原来的记忆，把目标地址换回原来的地址，和IP层的NAT的原理类似。
通过这样设置以后，当拔掉网线，启用无线网络连接后，依然可以上网，并且IP地址不变，整个过程自动完成。
你还想看

通过emule做DDOS是否可行？

]]></description>
			<content:encoded><![CDATA[<p>目前大部分的笔记本都是有两块网卡，一块是普通网卡，一块是无线网卡。一般有网口的地方会用普通网卡，通过网线连接上网，以获得较好的性能，没有网口的地方，会用无线上网。通常情况下，即使在同一个局域网里面，如果手工配置IP地址，必须为这两个不同的链接配置不同的IP地址，因为windows不允许为两个不同的适配器配置相同的IP地址。在特殊情况下，例如，使用电驴并在路由器上做了端口映射，于是需要在两种情况下都使用相同的IP地址，又不想每次都重新手工配置，这个时候可以用Windows自带的桥接模式来解决这个问题。<br />
<span id="more-196"></span><br />
在网络连接的文件夹中，选中&#8221;本地连接&#8221;和&#8221;无线网络连接&#8221;，击右键，选择&#8221;桥接&#8221;。这个时候将创建一个新的连接，叫&#8221;网络桥&#8221;（MAC Birdge Miniport)。这时候就可以手工为&#8221;网路桥&#8221;配置IP地址了。这样配置后，发现当接上网线时，上网是没有任何问题的，但是一旦拔开网线，改用无线上网，就上不去了，但是无线网卡显示的是连接上的状态。百思不得其解。Google了一下，发现了这两个连接：</p>
<p><a href="http://www.microsoft.com/windowsxp/using/networking/expert/crawford_02april22.mspx"><span style="COLOR: #336699">Windows XP Home Networking: Building Network Bridges</span></a><br />
<a href="http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q302348&amp;ID=KB;EN-US;Q302348&amp;"><span style="COLOR: #336699">Bridge May Not Work With a Non-Promiscuous Mode Network Adapter</span></a></p>
<p>其中，提到了一个东西：&#8221;Promiscuous Mode&#8221;。原来，网卡工作在普通状态时，只接收属于自己的MAC地址的以太网包。只有当工作在&#8221;Promiscuous Mode&#8221;时，才不加限制地接收所有的以太网包。大部分的普通网卡都可以工作在&#8221;Promiscuous Mode&#8221;，可能为了安全起见，大部分的无线网卡都不能工作在&#8221;Promiscuous Mode&#8221;下。当Windows创建桥接模式时，实际上在系统里面创建了一个虚拟的新的网卡，这个新的网卡有自己的MAC地址，桥里面的所有网卡都以这个新的MAC地址发送以太网包，回送的以太网包自然也是发给这个新的MAC地址，由于普通网卡支持&#8221;Promiscuous Mode&#8221;，所以可以接收到不属于自己的新的MAC地址以太网包，所以通讯正常，无线网卡会抛弃掉所有不属于自己MAC地址的包，所以在桥接模式下收不到任何发回来的以太网包，自然就不能正常工作了。Windows XP提供了一个解决办法，叫ForceCompatibilityMode（强制兼容模式），在命令行（cmd）下，打入netsh bridge show a，可以看到已经桥接的各个网卡的编号和是否启用强制兼容模式，如果无线网卡显示&#8221;已停用&#8221;或者&#8221;未知&#8221;，应记住无线网卡的编号，并在命令行下打入：netsh bridge set a X e，其中X是无线网卡的编号，以启用强制兼容模式。</p>
<p>这个兼容模式的原理是这样的，一旦某个网卡启用了这个模式，当从这个网口向外发送以太网包时，将改写以太网包，把源地址换成网卡自己的MAC地址，并记住这个转换，回复的以太网包的目标地址也是网卡的MAC地址，这样网卡就不会丢弃这个包，当这个收到这个回复包后，再根据原来的记忆，把目标地址换回原来的地址，和IP层的NAT的原理类似。</p>
<p>通过这样设置以后，当拔掉网线，启用无线网络连接后，依然可以上网，并且IP地址不变，整个过程自动完成。<br />
<h3>你还想看</h3>
<ul class="related_post">
<li><a href="http://www.zhangdaqian.net/blog/%e9%80%9a%e8%bf%87emule%e5%81%9addos%e6%98%af%e5%90%a6%e5%8f%af%e8%a1%8c%ef%bc%9f.htm" title="通过emule做DDOS是否可行？">通过emule做DDOS是否可行？</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.zhangdaqian.net/blog/windows-xp%e7%9a%84%e6%97%a0%e7%ba%bf%e6%a1%a5%e6%8e%a5.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

