﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-DWZ-文章分类-QQ数据包 </title><link>http://www.cppblog.com/dwz-1987/category/6630.html</link><description>MAKI</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 07:28:21 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 07:28:21 GMT</pubDate><ttl>60</ttl><item><title>登陆请求令牌包 的构造</title><link>http://www.cppblog.com/dwz-1987/articles/46966.html</link><dc:creator>刘冬清</dc:creator><author>刘冬清</author><pubDate>Sun, 13 Apr 2008 05:11:00 GMT</pubDate><guid>http://www.cppblog.com/dwz-1987/articles/46966.html</guid><wfw:comment>http://www.cppblog.com/dwz-1987/comments/46966.html</wfw:comment><comments>http://www.cppblog.com/dwz-1987/articles/46966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dwz-1987/comments/commentRss/46966.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dwz-1987/services/trackbacks/46966.html</trackback:ping><description><![CDATA[需要弄懂的两个问题：<br />1、登录请求令牌包是怎么样被构造出来的，它的包结构怎么查看。<br />2、登录请求令牌包是怎么样被发送出去的。<br /><br />登陆请求令牌包的构造：<br />packet = new RequestLoginTokenPacket(user)<br /><br /><strong> 一、请求登录令牌的包，格式为：<br /> 1. 头部<br /> 2. 未知的1字节，0x00<br /> 3. 尾部<br /></strong><br /><strong>二、基本协议族的输出包基类：<br /> 基本协议族的包都具有以下的格式:<br /> 1. 包头标志，1字节，0x02<br /> 2. 客户端版本代码，2字节<br /> 3. 命令，2字节<br /> 4. 包序号, 2字节<br /> 5. 用户QQ号，4字节<br /> 6. 包体<br /> 7. 包尾标志，1字节，0x03<br /> Note: 6部分将用会话密钥加密, 登录包例外，6部分要用密码密钥加密。请求登录令牌包例外，6部分不需加密<br /><br /></strong>RequestLoginTokenPacket（请求登录令牌包）继承BasicOutPacket（基本协议族的输出包基类）；<br />OutPacket（所有输出包基类，这个基类定义了输出包的基本框架）继承了Packet（QQ所有包对象的基类）；<br />BasicOutPacket（基本协议族的输出包基类）继承OutPacket（所有输出包基类，这个基类定义了输出包的基本框架）；<img src ="http://www.cppblog.com/dwz-1987/aggbug/46966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dwz-1987/" target="_blank">刘冬清</a> 2008-04-13 13:11 <a href="http://www.cppblog.com/dwz-1987/articles/46966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何编译2006版本的lumaQQ</title><link>http://www.cppblog.com/dwz-1987/articles/46559.html</link><dc:creator>刘冬清</dc:creator><author>刘冬清</author><pubDate>Tue, 08 Apr 2008 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/dwz-1987/articles/46559.html</guid><wfw:comment>http://www.cppblog.com/dwz-1987/comments/46559.html</wfw:comment><comments>http://www.cppblog.com/dwz-1987/articles/46559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dwz-1987/comments/commentRss/46559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dwz-1987/services/trackbacks/46559.html</trackback:ping><description><![CDATA[      目前，LumaQQ2006版本是一个可以登录QQ服务器并且拥有源代码的程序，不过它是用java编写的，可以通过使用eclipse对其源代码进行编译，来研究QQ数据包的协议特点。<br />      如何对源代码进行编译，具体应该怎么做？<br />      这里是用版本为：LumaQQ_2006M2_src_cvs_20060517的，是用cvs管理工程导出来的,大小20MB左右<br />      编译软件：<strong>eclipse</strong> 3.3<br />      Java的jdk是<strong>1.6</strong><br />      操作系统：<strong>windows xp<br /></strong>      <br />      第一步：打开eclipse新建java项目，如下图.<br />      <img height="136" alt="o_1.bmp" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/o_1.bmp" width="569" border="0" /><br />      第二步：点击next,然后点击Libraies这一个选项，将其中4个swt.jar Remove掉(只有其中一个swt.jar是使用于windows操作系统中)，保留的那个swt.jar是dist_win32_x86/lib,如下图.<br />      <img height="489" alt="o_2.bmp" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/o_2.bmp" width="742" border="0" /><br />    如果不将另外四个swt.jarRmove掉，会有什么情况？可以试一下。<br />第三步：选择Add External JARs按钮，如下图，添加tools.jar进入Libraies中，LumaQQ中有使用到这个库。<img height="502" alt="o_3.bmp" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/o_3.bmp" width="741" border="0" /><br />第四步：点击完成。把textcoding修改成为utf-8<br />选择图中所示的swt文件夹，右击查看其属性。<br /><img height="443" alt="o_5.bmp" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/o_5.bmp" width="238" border="0" /><br />第五步：copy Location的路径，将其加入系统环境变量path中。<br /><img height="189" alt="r_6.bmp" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/r_6.bmp" width="549" border="0" /><br />   <br />配置环境变量：<br />J:\QQ数据报的研究\LumaQQ_2006M2_src_cvs_20060517\LumaQQ_2006\dist_win32_x86\swt\<br /><br />完成上述操作之后，就可以在如下图所示的 LumaQQ.java中运行调试了。<br /><img height="224" alt="r_7.bmp" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/r_7.bmp" width="579" border="0" /><img src ="http://www.cppblog.com/dwz-1987/aggbug/46559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dwz-1987/" target="_blank">刘冬清</a> 2008-04-08 22:15 <a href="http://www.cppblog.com/dwz-1987/articles/46559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[LumaQQ] 从LumaQQ上看QQ数据包的加密和解密情况 【轉載】</title><link>http://www.cppblog.com/dwz-1987/articles/46495.html</link><dc:creator>刘冬清</dc:creator><author>刘冬清</author><pubDate>Tue, 08 Apr 2008 04:25:00 GMT</pubDate><guid>http://www.cppblog.com/dwz-1987/articles/46495.html</guid><wfw:comment>http://www.cppblog.com/dwz-1987/comments/46495.html</wfw:comment><comments>http://www.cppblog.com/dwz-1987/articles/46495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dwz-1987/comments/commentRss/46495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dwz-1987/services/trackbacks/46495.html</trackback:ping><description><![CDATA[
		<p>以前看LumaQQ（2006版）时做的一点简单记录，主要是关于LumaQQ登陆服务器和通讯时数据包的加密和解密情况。</p>
		<p>
				<span>1</span>
				<span>．<span>QQ</span>的登陆</span>
		</p>
		<p>
				<span>1.1</span>
				<span>． 登陆<span>QQ</span>服务器流程</span>
		</p>
		<p>
				<span>启动登陆程序，输入<span>QQ</span>号码和登陆密码，选取登陆模式，进行网络设置。登陆<span>QQ</span>。</span>
		</p>
		<p>
				<span>
						<span>
						</span>
				</span>
		</p>
		<p>
				<span>
						<span>     </span>
				</span>
				<span>现在做一个测试。将完全在登陆状态下的<span>LumaQQ</span>打开调试窗口，并开始进行调试（点击<span>Start Debug </span>按钮）。</span>
		</p>
		<p> </p>
		<p>
		</p>
		<p>
				<span>选择下线，然后再选择上线。我们可以看到下面<img height="126" alt="r_20070712lumaqq_debug.png" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/r_20070712lumaqq_debug.png" width="546" border="0" />捕获到的数据包。</span>
		</p>
		<p>
				<span>当选择离线时，发送了<span><strong><font color="#ff0000">Logout Packet</font></strong></span>包，此包并不需要服务器作出回应。再登陆的时候，<span><span>QQ</span></span><span><span>客户端向服务器发送一个<span><strong><font color="#ff0000">请求登录令牌</font></strong>的数据包</span>（</span></span></span>
				<span>
						<span>
								<strong>
										<font color="#ff0000">请求登录令牌</font>
								</strong>包是不加密的</span>
				</span>
				<span>
						<span>），服务器接收到<strong><font color="#ff0000">请求登录令牌</font></strong>后返回<span><strong><font color="#008000">请求登录令牌的回复包</font></strong></span>给客户端，这个<strong><font color="#008000">请求登录令牌的回复包</font></strong>是在服务器端生成的。</span>
				</span>
				<span>
						<span>在</span>
				</span>
				<span>
						<span>QQ</span>
				</span>
				<span>
						<span>客户端得到<strong><font color="#008000">登录令牌</font></strong></span>
						<font color="#008000">
								<strong>
								</strong>
						</font>
				</span>
				<span>
						<span>
								<strong>
										<font color="#008000">回复包</font>
								</strong>
						</span>
				</span>
				<span>
						<span>之后，就会向服务器发送一个<span><strong><font color="#ff1493">登录请求包</font></strong></span>（有资料声称：这个登录包除了随机密钥本身以外的部分都要用随机密钥进行加密），要求登录。服务器会验证客户端的登录信息是否与服务器上保存的登录信息匹配，返回一个<span><strong><font color="#ff1493">登陆请求回复包</font></strong></span>。如果匹配就向客户端返回登录成功，不匹配返回登录失败。</span>
				</span>
				<span>
				</span>
		</p>
		<p> <img height="228" alt="o_20070712lumaqq_login_logout_datapage.png" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/o_20070712lumaqq_login_logout_datapage.png" width="337" border="0" /></p>
		<p>
		</p>
		<p>
				<span>登陆成功后，还附带有些其他的数据请求包和回复包，这里暂不讨论其他包。（注：</span>
				<span>Request Key Packet</span>
				<span>用来请求得到一些操作的密钥，比如文件中转，或者语音视频之类的都有可能）</span>
		</p>
		<p> </p>
		<p>
				<span>1.2.</span>
				<span>登陆信息保存到本地流程</span>
		</p>
		<p>
				<span> </span>
				<span> </span>
				<span>在登陆数据从数据框输入之后和登陆操作进行之前，程序就会把数据保存到本地的文件上。其中的数据主要包括<span>QQ</span>号码，登陆密码，登陆模式，网络设置信息等等。</span>
		</p>
		<p>
				<span>这里的登陆密码保存方式会根据登陆模式的不同而采取不同的数据加密方案。</span>
		</p>
		<p>
				<span>用户从输入框的密码，系统取到原始密码值时马上进行两次<span>md5</span>。保存到变量<span>md5pwd</span>，当保存密码到本地时，如果是选择记住密码模式，则将<span>md5pwd</span>做一次<span>base64</span>再保存；如果是选择是非记住密码模式，则将<span>md5pwd</span>做一次<span>base64</span>之后再做一次<span>md5</span>，再来一次<span>base64</span>，最后在保存。</span>
		</p>
		<p>
				<span>
						<span>    </span>
				</span>
				<span>因为</span>
				<span>MD5</span>
				<span>的算法是不可逆的，没有办法直接解密。也没有用到密钥之类的东西。</span>
		</p>
		<p> </p>
		<p> </p>
		<p>
				<span>2.</span>
				<span>
						<span>
						</span>
				</span>
				<span>
						<span>QQ</span>
				</span>
				<span>
						<span>数据包的加密和解密</span>
				</span>
		</p>
		<p>
				<span>2.1. </span>
				<span>数据包和密钥</span>
		</p>
		<p>
				<span>登录数据包也是一个数据包，数据包在网络传输时一般都会经过加密（除了数据包的头部和尾部），登陆包是用初始密钥，即一开始构造<span>QQ</span>客户端对象时候生成的<span>16</span>位的十六进制的随机数（这里称作<span>随机密钥</span>吧），进行对登录数据包加密。加密算法暂时跳过。</span>
		</p>
		<p>
				<span>服务器接收到<span>请求登陆包</span>后作出反应，向客户端发送一个<span>请求登陆回复包</span>，客户端用上面提到的<span>md5pwd</span>（原始密码的两次<span>MD5</span>后的数据，暂称之为<span>密码密钥</span>吧）作为密钥来解密<span>请求登陆回复包</span>，在<span>请求登陆回复包</span>会包含一个<span>会话密钥</span>，这个<span>会话密钥</span>就是聊天数据包加密和解密的密钥（有资料也提到一种例外，当好友离线的时，你发送信息给他，他下次上线的时候根本就不知道你当时发送信息的<span>会话密钥</span>，这是他会用<span>密码密钥</span>来解密信息数据包）。</span>
		</p>
		<p>
				<span>这里小总结一下几种包所用到的密钥：</span>
		</p>
		<p>
				<span>登陆请求包：</span>
				<span>
						<span>       </span>
				</span>
				<span>随机密钥。</span>
		</p>
		<p>
				<span>登陆请求回复包：</span>
				<span>
						<span>   </span>
				</span>
				<span>密码密钥。</span>
		</p>
		<p>
				<span>信息发送包：</span>
				<span>
						<span>       </span>
				</span>
				<span>会话密钥。</span>
		</p>
		<p>
				<span>在线信息接收包：</span>
				<span>
						<span>   </span>
				</span>
				<span>会话密钥。</span>
		</p>
		<p>
				<span>离线信息接收包：</span>
				<span>
						<span>   </span>
				</span>
				<span>密码密钥。</span>
		</p>
		<p> </p>
		<p>
				<span>2.2.</span>
				<span>数据包的加密和解密算法</span>
		</p>
		<p>
				<span>QQ</span>
				<span>采用了最初的<span>TEA</span>算法做其核心的加密算法，<span><span>TEA</span></span><span><span>是<span>Tiny Encrypt Arithmetic</span>的缩写。顾名思义就是一种比较简单的小型加密算法，是在<span>1994</span>年由英国剑桥大学的<span>David Wheeler</span>和<span>Roger Needham</span>所发明的一种加密方法。它用一个<span>16</span>字节的密钥去加密一个<span>8</span>字节的明文，得到一个<span>8</span>字节的密文，也可以反向从密文解密出明文。这种算法的可靠性是通过加密轮数而不是算法的复杂度来保证的。</span></span></span>
		</p>
		<p>
				<span>
						<span>   </span>
						<span>
								<span>QQ</span>
						</span>
				</span>
				<span>
						<span>使用的<span>TEA</span>虽然是标准的<span>TEA</span>，但是<span>QQ</span>在使用这个算法的时候，由于需要加密不定长的数据，所以使用了一些常规的填充办法和交织算法（也就是说，把前一组的加密结果和后一组未加密的结果进行运算，产生新的结果）。<span>QQ</span>消息被分为多个加密单元，每一个加密单元都是<span>8</span>字节，使用<span>TEA</span>进行加密，加密结果再作为下一个单元的密钥。如果明文本身的长度不是<span>8</span>的倍数，那么还要进行填充，使其成为<span>8</span>的倍数。填充的时候会用一个<span>32</span>位随机数存放于明文的开始位置，再在明文的最后用<span>0</span>填充为整个长度是<span>8</span>的倍数。由于会向后反馈，这样即使对于相同的明文<span>,</span>因为使用了不同的随机数，也会产生完全不同的密文。使用这种特殊的填充反馈算法所导致的结果就是，一段密文只能用加密它的密钥进行解密，如果使用不正确的密钥，就无法得到正确的填充结果。最常见的就是解密后得到的填充数值不是<span>0</span>，这样就判断解密失败。</span>
				</span>
		</p>
		<p> </p>
		<p>
				<span>QQ</span>
				<span>消息的加密算法是一个<span>16</span>次的迭代过程，并且是反馈的，每一个加密单元是<span>8</span>字节，输出也是<span>8</span>字节，密钥是<span>16</span>字节</span>
		</p>
		<p>
				<span>以<span>prePlain</span>表示前一个明文块，<span>plain</span>表示当前明文块，<span>crypt</span>表示当前明文块加密得到的密文块，<span>preCrypt</span>表示前一个密文块</span>
		</p>
		<p>
				<span>f</span>
				<span>表示加密算法， 那么从<span>plain</span>得到<span>crypt</span>的过程是<span>: crypt = f(plain &amp;circ; preCrypt ) &amp;circ</span></span>
		</p>
		<p>
				<span>d</span>
				<span>表示解密算法，从<span>crypt</span>得到<span>plain</span>的过程自然是<span> plain = d(crypt &amp;circ; prePlain) &amp;circ;</span></span>
		</p>
		<p>
				<span>填充机制，其会在明文前和明文后分别填充一定的字节数，以保证明文长度是<span>8</span>字节的倍数填充的字节数与原始明文长度有关，填充的方法是<span>:</span></span>
		</p>
		<p>
				<span>
				</span> </p>
		<p>
				<span> <span>     </span>------- </span>
				<span>消息填充算法<span> ----------- </span></span>
		</p>
		<p>
				<span> <span>    </span>a = (</span>
				<span>明文长度<span> + 10) mod 8<span>         </span>//</span>计算填充长度</span>
		</p>
		<p>
				<span>
						<span>     </span>if(a </span>
				<span>不等于<span> 0) a = 8 - a;</span></span>
		</p>
		<p>
				<span>
						<span>     </span>b = </span>
				<span>随机数<span> &amp; 0xF8 | a;<span>        </span><span>    </span>//</span>这个的作用是把<span>a</span>的值保存了下来</span>
		</p>
		<p>
				<span>
						<span>     </span>plain[0] = b;<span>         </span><span>             </span>//</span>
				<span>然后把<span>b</span>做为明文的第<span>0</span>个字节，这样第<span>0</span>个字节就保存了<span>a</span>的信息，这个信息在解密时就要用来找到真正明文的起始位置</span>
		</p>
		<p>
				<span> <span>    </span>plain[1 </span>
				<span>至<span> a+2] = </span>随机数<span> &amp; 0xFF;<span>   </span>// </span>这里用随机数填充明文的第<span>1</span>到第<span>a+2</span>个字节</span>
		</p>
		<p>
				<span>
						<span>   </span>
						<span>  </span>plain[a+3 </span>
				<span>至<span> a+3+</span>明文长度<span>-1] = </span>明文<span>;  //</span>从<span>a+3</span>字节开始才是真正的明文</span>
		</p>
		<p>
				<span>
						<span>     </span>plain[a+3+</span>
				<span>明文长度<span>, </span>最后<span>] = 0;<span>      </span>  //</span>在最后，填充<span>0</span>，填充到总长度为<span>8</span>的整数为止。到此为止，结束了，这就是最后得到的要加密的明文内容</span>
		</p>
		<p>
				<span> <span>   </span> ------- </span>
				<span>消息填充算法<span> ------------</span></span>
		</p>  
<p><span>3.</span><span>小结</span></p><p><span>3.1 </span><span>小结一下</span></p><p><span><span>   </span></span><span>研究到现在为止，还没有发现密码密钥（即密码的两次<span>MD5</span>的结果）在网络上传输。但是，密码密钥是一个非常重要的密钥，虽然用到这个密钥并不比会话密钥频繁，但是要得到会话密钥首先要取得密码密钥。几个重要的密钥使用流程是这样的：</span></p><p><img height="373" alt="r_20070712lumaqq.png" src="http://www.cppblog.com/images/cppblog_com/dwz-1987/6668/r_20070712lumaqq.png" width="555" border="0" /></p><p><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">能正确解析各种包以及包的各部分和取得对应的加密解密密钥就能进行正常的数据通讯。</span></p><p><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></span></p><p><span>3.2 留下的问题</span></p><p><span><span>    </span></span><span>密码密钥是否在网络上传送？获取密码密钥是从本地获取还是网络上获取？<br />轉載自：<a href="http://www.blogjava.net/orangewhy/archive/2007/07/12/129829.html">http://www.blogjava.net/orangewhy/archive/2007/07/12/129829.html</a></span></p><img src ="http://www.cppblog.com/dwz-1987/aggbug/46495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dwz-1987/" target="_blank">刘冬清</a> 2008-04-08 12:25 <a href="http://www.cppblog.com/dwz-1987/articles/46495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于QQ数据包分析的问题域</title><link>http://www.cppblog.com/dwz-1987/articles/46446.html</link><dc:creator>刘冬清</dc:creator><author>刘冬清</author><pubDate>Mon, 07 Apr 2008 10:37:00 GMT</pubDate><guid>http://www.cppblog.com/dwz-1987/articles/46446.html</guid><wfw:comment>http://www.cppblog.com/dwz-1987/comments/46446.html</wfw:comment><comments>http://www.cppblog.com/dwz-1987/articles/46446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dwz-1987/comments/commentRss/46446.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dwz-1987/services/trackbacks/46446.html</trackback:ping><description><![CDATA[
		<p align="left">        我们对于QQ数据包的分析，到底是分析什么，分析出来之后，我们可以学习到什么？这是我个人很关心的事情。因为从来没有做过对于数据包的分析的事情，对于QQ数据包的分析要从何下手，显得很迷茫。我觉得，对于这个问题，分清问题域很重要。<br />如果分析的深入的话，最直观的收获就是自己也能够制作出一款简单的文字聊天工具，而且这个工具可以借助于腾讯公司的服务器和其他版本的QQ进行聊天。至于更远的收获，我还不知要怎么去想。<br />我把对于QQ数据包的分析以及日后QQ模拟软件的制作分成三块问题域：<br />1、QQ软件的协议分析：<br />      ①、QQ的协议进行分类：文字聊天协议族（TCPF, Text Chatting Protocol Family)：它主要支持与其它QQ客户端进行文字聊天。TCPF是建立在UDP协议之上。UDP数据包中的第一个字符02为这个协议族的标识。TCPF的服务器使用8000号端口，腾讯的QQ客户端软件一般从4000号端口开始尝试使用，但实际上，对客户端使用的端口号并没有限制。<br />      ②、QQ数据包的截获与采集；<br />      ③、对已经截获的数据包进行分析；<br />2、数据包的加解密：<br />      需要具备一定的加解密常识与知识，这是实现对于数据包明文进行分析的前提，如果没有把已经加密了的密文数据解密成明文，也就无从对数据包协议进行分析。<br />      所以，还必须知道QQ数据包使用的协议大致用的是什么算法。不然，真给我一堆乱码，叫我去想着怎么解密，那是不可能的事情。<br />3、QQ软件自身结构：<br />      如果不了解QQ自身的构造，就不知道什么包由什么进程发送，由什么函数接收。截获的数据就会是一个QQ程序中多个函数或多个进程同时发送的不同作用的包的大杂烩。无法对包分门别类，怎么分析？<br />      new：拥有一个可以编译的QQ模拟程序，是对QQ协议进行分析的好办法，因为自身没有任何基础，如果凭空直接依靠截获腾讯官方的QQ数据包来进行分析，难度很大。<br />      目前，LumaQQ2006版本是一个可以登录QQ服务器并且拥有源代码的程序，不过它是用java编写的，可以通过使用eclipse对其源代码进行编译，来研究QQ数据包的协议特点。<br /><br />以上暂时只是个人的初步见解，有不对之处，希望有人能指出。<br />       </p>
<img src ="http://www.cppblog.com/dwz-1987/aggbug/46446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dwz-1987/" target="_blank">刘冬清</a> 2008-04-07 18:37 <a href="http://www.cppblog.com/dwz-1987/articles/46446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是数据包？</title><link>http://www.cppblog.com/dwz-1987/articles/datapackage.html</link><dc:creator>刘冬清</dc:creator><author>刘冬清</author><pubDate>Sun, 06 Apr 2008 14:38:00 GMT</pubDate><guid>http://www.cppblog.com/dwz-1987/articles/datapackage.html</guid><wfw:comment>http://www.cppblog.com/dwz-1987/comments/46393.html</wfw:comment><comments>http://www.cppblog.com/dwz-1987/articles/datapackage.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dwz-1987/comments/commentRss/46393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dwz-1987/services/trackbacks/46393.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我们要对QQ的数据包进行分析，那么，什么算是数据包呢？它的结构组成是什么（特点）？&nbsp;&nbsp;<a href='http://www.cppblog.com/dwz-1987/articles/datapackage.html'>阅读全文</a><img src ="http://www.cppblog.com/dwz-1987/aggbug/46393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dwz-1987/" target="_blank">刘冬清</a> 2008-04-06 22:38 <a href="http://www.cppblog.com/dwz-1987/articles/datapackage.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>