﻿<?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>BlogJava-Phrancol's blog</title><link>http://www.blogjava.net/Phrancol/</link><description>To be surprised,to wonder,is to begin to understand.</description><language>zh-cn</language><lastBuildDate>Tue, 02 Dec 2008 13:20:37 GMT</lastBuildDate><pubDate>Tue, 02 Dec 2008 13:20:37 GMT</pubDate><ttl>60</ttl><item><title>[原]基于服务的网络应用平台结构构想</title><link>http://www.blogjava.net/Phrancol/articles/238188.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 02 Nov 2008 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/238188.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/238188.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/238188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/238188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/238188.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<h2 style="margin-left: 4.3pt; text-indent: 0cm; tab-stops: list 0cm left 4.3pt"><span style="font-family: 'HG Mincho Light J'">前言</span></h2>
<p><span style="color: black">便携是一种趋势</span></p>
<p><span style="color: black">网络服务是一种趋势</span></p>
<p><span style="color: black">触摸屏的发展是一种趋势</span></p>
<p><span style="color: black">..............</span></p>
<p style="margin-bottom: 14.15pt"><span style="color: black">这些趋势发展到一定阶段就是在电影里看到的，一个电脑就是一个屏幕，而这些离我们并不远。</span></p>
<h2 style="margin-left: 4.3pt; text-indent: 0cm; tab-stops: list 0cm left 4.3pt"><span style="font-family: 'HG Mincho Light J'">它是什么</span>&nbsp;</h2>
<p><span style="color: black">有这样一种服务，只要你是它的终端，你可以用它做很多事情，例如：<br />
电脑，开机，进入一个数M程序的终端，当然这是一个服务终端，加载所需要的服务。<br />
我需要浏览器，只需要 install </span><a href="http://www.servicegate.com/browser">xxx://www.servicegate.com/browser</a><span style="color: black">，然后start，一个浏览器界面就出来了，<br />
我需要编辑word文档，google提供了这个功能。<br />
我需要上QQ，install </span><a href="http://www.qq.com/qqservice">xxx://www.qq.com/qqservice</a><span style="color: black">，然后start，QQ界面出来了<br />
我需要玩魔兽，没问题，只要暴雪提供了该服务，我们只需要一个install命令，就可以玩了。</span></p>
<p><span style="color: black">这是一个全新的应用系统，它的一切都建立在网络的基础上，所有资源均来自网络服务提供商，这看起来像云计算，或是SaaS，没错，但是不管它像什么，它的目的只有一个，就是提供一个更安全，更方便，更快捷的应用平台。</span></p>
<p><span style="color: black">它的操作就像你平时使用的操作系统一样，你甚至无法感觉到它的存在，因为在你开机的瞬间你就已经在使用它了。<br />
</span></p>
<h2 style="margin-left: 4.3pt; text-indent: 0cm; tab-stops: list 0cm left 4.3pt"><span style="font-family: 'HG Mincho Light J'"><br />
它有什么好处</span></h2>
<p>免费——它是免费的，你不需要为它支付任何费用就可以使用它<br />
安全——在服务终端中（注意，它不是操作系统），它几乎取消了硬盘的概念，数据全部存储在你信任的服务供应商中，因此你不必为病毒或木马而发愁，当然也不需要买杀毒软件了。<br />
快捷——不再花费大量的时间查看安装进度，然后再安装大量的驱动。<br />
便携——就像你插入一个U盘，或是放入一个光盘，只要有网络的地方，你就可以使用它。<br />
服务——你不再需要下载，安装等繁琐的操作，这一切都由服务中心来完成。</p>
<h2><br />
<span lang="EN-US" style="font-size: 14pt; font-family: Albany; mso-bidi-font-family: 'Arial Unicode MS'; mso-fareast-font-family: 'HG Mincho Light J'; mso-fareast-language: #00FF; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">网络环境结构图<br />
<br style="page-break-before: always; mso-break-type: section-break" clear="all" />
</h2>
<h2><img height="689" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/基于服务的网络应用平台结构构想/1.jpg" width="853" border="0" /><br />
<br />
<span lang="EN-US" style="font-size: 14pt; font-family: Albany; mso-bidi-font-family: 'Arial Unicode MS'; mso-fareast-font-family: 'HG Mincho Light J'; mso-fareast-language: #00FF; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">网络通信结构图</span></span></h2>
<br />
<img height="293" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/基于服务的网络应用平台结构构想/2.jpg" width="529" border="0" /><br />
<br />
&nbsp;
<p class="MsoBodyText" style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">&nbsp;&nbsp;&nbsp;&nbsp; 1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">分布式<span lang="EN-US">MVC</span>（<span lang="EN-US">N</span>层）网络结构<span lang="EN-US">——</span>可以理解为分布式<span lang="EN-US">C/S</span>应用，最容易理解的例子就是网络游戏，客户端只负责接收和响应输入设备，服务器处理具体的业务逻辑和数据存储。<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">通信协议<span lang="EN-US">——</span>这就有点像<span lang="EN-US">HTTP</span>了，但是它必须要比<span lang="EN-US">HTTP</span>更强大才行，因为它需要更迅速的传输和响应，以及更复杂的通信内容和指令，当然这并不难办到。<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">终端<span lang="EN-US">——</span>它只负责根据服务的指令显示相应的内容，或者它只是一个服务的<span lang="EN-US">&#8220;</span>镜头<span lang="EN-US">&#8221;</span>。<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">数据中心<span lang="EN-US">——</span>可以理解为<span lang="EN-US">&#8220;</span>云<span lang="EN-US">&#8221;</span>。<span lang="EN-US"> <br />
<br />
<br />
</span></span></p>
<h2><span style="font-size: 10pt; font-family: Verdana; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Verdana; mso-fareast-language: #00FF; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">终端结构图</span></h2>
<br />
<img height="389" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/基于服务的网络应用平台结构构想/3.jpg" width="439" border="0" /><br />
<br />
&nbsp;
<p class="MsoBodyText" style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">&nbsp;&nbsp;&nbsp;&nbsp; 1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana">boot——</span><span style="mso-bidi-font-family: Verdana">引导程序，加载终端的微内核<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">设备驱动<span lang="EN-US">——</span>基础驱动程序，在目前的机器结构中，这<span lang="EN-US">3</span>个驱动是需要的，而理论上，它们应该集成在硬件芯片中，即设备统一驱动程序，换句话说，不管是鼠标，键盘，触摸，光电感应等输入设备，它们的驱动应该是统一的，因为它们只是用于输入而已，同理，网络设备和显示设备也一样。<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">微内核<span lang="EN-US">——</span>与<span lang="EN-US">Linux</span>的内核机制相仿，只不过它应该是微型的，在应用层面，它可能只包含<span lang="EN-US">3</span>个部分：用于加载管理服务的模块，用于实现通信协议的模块，用于显示的模块。<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">服务加载模块<span lang="EN-US">——</span>管理来自网络的服务，包括加载，卸载，启动等。<span lang="EN-US"> <br />
</span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana">View-SDK——</span><span style="mso-bidi-font-family: Verdana">来自网络的服务如何显示，就是由它来决定，可以把它想象成一个浏览器，但是它需要比浏览器更强大，从而引导通信协议的制定。这里的<span lang="EN-US">View-SDK</span>目前还比较模糊，不能将它看成普通的<span lang="EN-US">SDK</span>，它有可能只是类似于<span lang="EN-US">IE</span>，或是实实在在的类似于可视化开发工具的界面，这里，先不确定它的细节问题，只要知道它是个能显示的东东就可以了。<span lang="EN-US"><o:p></o:p></span></span></p>
<br />
&nbsp;
<h2 style="margin-left: 4.3pt; tab-stops: 21.0pt; mso-list: none"><span style="font-family: 'HG Mincho Light J'; mso-ascii-font-family: Albany; mso-hansi-font-family: Albany">示例</span><span lang="EN-US"> </span></h2>
<p class="MsoBodyText"><br />
案例一、<span lang="EN-US">Eclipse </span></p>
<p class="MsoBodyText">对于<span lang="EN-US">Eclipse</span>，大家都比较熟悉了，如果要将它用于该平台，与现有平台有何区别。<span lang="EN-US"> </span></p>
<p class="MsoBodyText"><strong style="mso-bidi-font-weight: normal">终端部分：只有一个显示框体，他是基于终端的<span lang="EN-US">View-SDK</span>的（之前有提到<span lang="EN-US">View-SDK</span>，这里有个误区就是，把它想象成现有的<span lang="EN-US">Eclipse</span>），没有代码，没有插件，甚至没有供它运行的文件（看起来像<span lang="EN-US">IE</span>了，或是一个远程控制）。</strong><span lang="EN-US"> </span></p>
<p class="MsoBodyText"><strong style="mso-bidi-font-weight: normal">数据中心：代码，插件等业务逻辑和数据存储都在这里了。</strong><span lang="EN-US"> </span></p>
<p class="MsoBodyText"><span lang="EN-US">&nbsp; </span></p>
<p class="MsoBodyText">如何运作<span lang="EN-US"> </span></p>
<p class="MsoBodyText" style="margin-bottom: 14.15pt"><span style="mso-bidi-font-family: Verdana">终端通过新的通信协议向数据中心发出指令，由数据中心来决定终端的显示，通过指令或是其它方式。<span lang="EN-US"> <o:p></o:p></span></span></p>
<h2 style="margin-left: 4.3pt; text-indent: 0cm; tab-stops: list 0cm left 4.3pt"><span style="font-family: 'HG Mincho Light J'; mso-ascii-font-family: Albany; mso-hansi-font-family: Albany">问题</span><span lang="EN-US"> </span></h2>
<p class="MsoBodyText" style="margin-bottom: 14.15pt"><span style="mso-bidi-font-family: Verdana">以上<span lang="EN-US">3</span>个结构图，只是对这个平台的一个方向上的构想，在这个平台中，会包含以下问题：<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoBodyText" style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">微内核的技术构成，结构是否合理，通过现有技术是否可以实现它，或者它与现有技术是否有冲突，并能否解决这个冲突。<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoBodyText" style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span lang="EN-US" style="mso-bidi-font-family: Verdana">View-SDK</span><span style="mso-bidi-font-family: Verdana">的技术构成，是否能够以最少的代码实现，并且实现之后，还可以称之为微。<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoBodyText" style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">通信协议的制定，这是依赖于<span lang="EN-US">View-SDK</span>和服务器端技术结构的，因为它们都是全新的。<span lang="EN-US"> <o:p></o:p></span></span></p>
<p class="MsoBodyText" style="margin: 0cm 0cm 14.15pt 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt; mso-list: l1 level1 lfo2"><span lang="EN-US" style="mso-bidi-font-family: Verdana"><span style="mso-list: Ignore">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></span><span style="mso-bidi-font-family: Verdana">其它，包括与现有的网络技术，软硬件技术的冲突，包括<span lang="EN-US">P2P</span>和现有的网络协议等等。<span lang="EN-US"> <br />
<br />
</span></span></p>
<h2 style="margin-left: 4.3pt; text-indent: 0cm; tab-stops: list 0cm left 4.3pt">&nbsp;</h2>
<img src ="http://www.blogjava.net/Phrancol/aggbug/238188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-11-02 16:35 <a href="http://www.blogjava.net/Phrancol/articles/238188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]不能被“微软”——云计算</title><link>http://www.blogjava.net/Phrancol/articles/236826.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Mon, 27 Oct 2008 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/236826.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/236826.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/236826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/236826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/236826.html</trackback:ping><description><![CDATA[<p><br />
同学的一次讨论中曾提到，以后的计算机只需要一个触摸屏显示器，和一个无线网络信号，其它所有东西都由网络提供。<br />
<br />
&#8220;微软&#8221;当然并不是真正的微软，&#8220;云计算&#8221;当然也不是真正的云计算。<br />
<br />
或许有这样一种服务，只要你是它的终端，你可以用它做很多事情，例如：<br />
我的电脑，开机，进入一个数M程序的终端，当然这是一个服务终端，类似OSGi，加载所需要的服务。<br />
我需要浏览器，只需要&nbsp;&nbsp; install <a href="http://www.servicegate.com/browser">http://www.servicegate.com/<span class="trans"><a class="explain" href="javascript:void(0)">browser</a>&nbsp;</a>&nbsp; ，然后start，一个浏览器界面就出来了，<br />
我需要编辑word文档，google提供了这个功能。<br />
我需要上QQ，install <a href="http://www.qq.com/qqservice">http://www.qq.com/qqservice</a>&nbsp; ，然后start，QQ界面出来了<br />
我需要玩魔兽，这个暂时没办法<br />
我需要网银功能，这个当然也没办法，因为现在还在被&#8220;微软&#8221;。<br />
<br />
以上内容当然只是一个假想，我猜windows也是由某个假想产生的，那么如何实现它？<br />
<br />
一个引导程序，由它来启动服务终端<br />
一个网卡驱动<br />
一个显示设备驱动<br />
一个输入设备驱动<br />
一个服务终端程序，这个程序怎么写，可以用汇编写，可以用C写，甚至可以把Equinox改改放进去，只要它能被引导程序启动并运行<br />
3个驱动感觉就是鸡肋。<br />
这些都做出来之后，剩下的就是服务提供商的事了。<br />
当然这些只是一个大概的框架，只是考虑一下可行性。<br />
<br />
这看上去有难度啊。不在其职，是觉得挺难的，比如我就觉得有难度。<br />
假如番茄花园的哥们是我朋友，我有朋友精通驱动程序，我自己写这个终端程序，再找李开复商量一下，说不定我就不用再被&#8220;微软&#8221;了。<br />
</span></p>
 <img src ="http://www.blogjava.net/Phrancol/aggbug/236826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-10-27 11:20 <a href="http://www.blogjava.net/Phrancol/articles/236826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]角色AI动作调度器</title><link>http://www.blogjava.net/Phrancol/articles/212889.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 06 Jul 2008 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/212889.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/212889.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/212889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/212889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/212889.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 人物角色有多种动作：上马，下马，走，跑，物理攻击，魔法攻击，施放魔法，交易 .....等等每个动作间隔为600毫秒，任务有可能会执行失败。/**&nbsp;*//**&nbsp;*&nbsp;角色动作调度器&nbsp;*&nbsp;@author&nbsp;Donf&nbsp;Yang&nbsp;*/public&nbsp;final&nbsp;class&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/Phrancol/articles/212889.html'>阅读全文</a><img src ="http://www.blogjava.net/Phrancol/aggbug/212889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-07-06 18:05 <a href="http://www.blogjava.net/Phrancol/articles/212889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]JAVA版传奇3G辅助程序[开源]</title><link>http://www.blogjava.net/Phrancol/articles/211496.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 29 Jun 2008 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/211496.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/211496.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/211496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/211496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/211496.html</trackback:ping><description><![CDATA[<p><br />
请至 <a href="http://code.google.com/p/mir3ganywhere/">http://code.google.com/p/mir3ganywhere/</a> 获取源码<br />
<br />
<br />
<img height="293" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/maw/maw_startup.jpg" width="453" border="0" /><br />
<br />
<img height="644" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/maw/MAW.jpg" width="844" border="0" /><br />
<br />
<br />
<br />
2008-07-06:<br />
完善动作调度器 [角色AI动作调度器 ]<a href="http://www.blogjava.net/Phrancol/articles/212889.html">http://www.blogjava.net/Phrancol/articles/212889.html</a><br />
2008-07-08:<br />
完成物理攻击动作，如果目标不在身边则不攻击。<br />
添加角色动作控制接口，角色动作观察接口，更新于[角色AI动作调度器]<br />
2008-07-13:<br />
优化移动到目的地和靠近目的地的动作，优化动作调度器。 <br />
完成拾取东西的动作<br />
2008-07-19:<br />
动作调度器小改动：移动动作的间隔为600毫秒，攻击动作的间隔为1000毫秒<br />
实现了Hero和AroundPerson的HP变化，增加事件通知。<br />
2008-07-27:<br />
1. 优化动作调度器和动作监听器，现在可以将多个动作合成一个ActionMission来调度，例如拾取一个物品可以包含以下Action<br />
Action1 - 移动到物品所在坐标<br />
Action2 - 下马<br />
Action3 - 发送拾取命令<br />
Action4 - 上马<br />
2. 实现NPC对话和出售物品的Dialog，现在可以使用六面神石进行移动，可以向NPC出售物品</p>
<p><img height="395" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/maw/npcdialog.jpg" width="467" border="0" /><br />
-----------------------------------------------------------------------------------------------------------------<br />
<img height="418" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/maw/selltonpc.jpg" width="438" border="0" />&nbsp;<br />
<br />
2008-07-29:<br />
1. 优化角色AI动作调度器，重构游戏地图对象，所有业务对象共享同一个地图对象<br />
2. 设计自动挂机接口，实现自动寻找离自己最近的怪物<br />
3. 自动挂机流程设计，将挂机流程分解为多个可观察对象（可观察对象是可以被中断的）<br />
<br />
2008-08-04:<br />
1. 重新设计靠近坐标和到达坐标的算法<br />
2. 重新设计AI动作实现，可以嵌套AI动作，例如调度移动动作，可以嵌套进调度攻击目标的动作（先移动靠近目标），攻击目标的动作，可以嵌套进机器人动作。<br />
3. 设计拾取物品，攻击目标AI动作，可以自动判断是否需要跑到物品坐标，判断判断需要下马，拾取物品；可以追着某个目标一直攻击，直到目标消失或死亡。<br />
4. 考虑遗传算法在自动挂机中的应用。<br />
<br />
2008-08-11:<br />
1. 完成自动练功（自动巡逻，遇怪攻击，遇物品拾取）算法。<br />
<br />
2008-08-12:<br />
1. 优化了自动挂机算法，优化寻路算法，目前自动挂机比较流畅<br />
<br />
2008-08-13:<br />
1. 完成自动挂机设置：攻击怪物优先级设置，拾取物品优先级设置，挂机地图设置<br />
2. 完成地图NPC坐标加载<br />
3. 完成丢掉背包中的物品<br />
<img height="526" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/maw/mapcfg.jpg" width="736" border="0" /></p>
<br />
2008-08-14:<br />
1. 完成地图寻路算法<br />
2. 完成自动挂机中回城补给时自动跑向NPC出售物品。<br />
3. 数字图片验证码识别，已经找到数字路径，正在考虑路径匹配数字算法。 <br />
<br />
2008-08-24:<br />
1. 优化了地图寻路的算法，比较完善<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">619</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;准备生成路线，源地图[比奇县]，目标地图[潘夜神殿]<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">635</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;查找路线用时&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">635</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第1步：从比奇县的六面神石[</span><span style="color: #000000">138</span><span style="color: #000000">,</span><span style="color: #000000">261</span><span style="color: #000000">]传送到&nbsp;[沙巴克]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">635</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第2步：从地图[沙巴克]的&nbsp;[</span><span style="color: #000000">318</span><span style="color: #000000">,</span><span style="color: #000000">258</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿1层]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">635</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第3步：从地图[潘夜神殿1层]的&nbsp;[</span><span style="color: #000000">149</span><span style="color: #000000">,</span><span style="color: #000000">158</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿2层]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">635</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第4步：从地图[潘夜神殿2层]的&nbsp;[</span><span style="color: #000000">255</span><span style="color: #000000">,</span><span style="color: #000000">254</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿3层西部]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第5步：从潘夜神殿3层西部的六面神石[</span><span style="color: #000000">199</span><span style="color: #000000">,</span><span style="color: #000000">257</span><span style="color: #000000">]传送到&nbsp;[潘夜神殿大厅]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第6步：从地图[潘夜神殿大厅]的&nbsp;[</span><span style="color: #000000">25</span><span style="color: #000000">,</span><span style="color: #000000">22</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿4层B]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第7步：从地图[潘夜神殿4层B]的&nbsp;[</span><span style="color: #000000">111</span><span style="color: #000000">,</span><span style="color: #000000">112</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿5层B]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第8步：从地图[潘夜神殿5层B]的&nbsp;[</span><span style="color: #000000">373</span><span style="color: #000000">,</span><span style="color: #000000">378</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿6层]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第9步：从地图[潘夜神殿6层]的&nbsp;[</span><span style="color: #000000">38</span><span style="color: #000000">,</span><span style="color: #000000">373</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿7层东部]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第10步：从地图[潘夜神殿7层东部]的&nbsp;[</span><span style="color: #000000">25</span><span style="color: #000000">,</span><span style="color: #000000">30</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿8层]&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">12</span><span style="color: #000000">:</span><span style="color: #000000">23</span><span style="color: #000000">,</span><span style="color: #000000">666</span><span style="color: #000000">&nbsp;DEBUG&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第11步：从地图[潘夜神殿8层]的&nbsp;[</span><span style="color: #000000">200</span><span style="color: #000000">,</span><span style="color: #000000">199</span><span style="color: #000000">]过图到&nbsp;[潘夜神殿]&nbsp;</span></div>
2. 实现挂机中自动回到补给城市，自动修卖装备，补给完成后，自动回到练功地图挂机 <br />
<br />
2008-08-28:<br />
1. 修正了刀刀刺杀，攻杀<br />
2. 修正了周围玩家名字的显示<br />
3. 优化了自动挂机部分算法 <br />
2008-08-31:<br />
1. 优化了自动挂机算法，目前挂机效率比较高<br />
2. 修正了一些BUG，增加了购买物品功能 
<img src ="http://www.blogjava.net/Phrancol/aggbug/211496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-29 17:53 <a href="http://www.blogjava.net/Phrancol/articles/211496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]Eclipse产品应用——控制台的使用</title><link>http://www.blogjava.net/Phrancol/articles/206893.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Tue, 10 Jun 2008 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/206893.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/206893.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/206893.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/206893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/206893.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在开发一个基于Eclipse的产品应用中，类似于Eclipse控制台的小部件是必不可少的，例如：1. 开发过程中需要一个控制台来专门输出调试信息，而在产品发布后却不需要2. 需要一个控制台用于输出系统信息3. 需要一个控制台用于输出普通消息先定义个简单的接口MConsolepublic&nbsp;interface&nbsp;MConsole&nbsp;{&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/Phrancol/articles/206893.html'>阅读全文</a><img src ="http://www.blogjava.net/Phrancol/aggbug/206893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-10 11:20 <a href="http://www.blogjava.net/Phrancol/articles/206893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G反汇编分析（一）——命令体二次解密</title><link>http://www.blogjava.net/Phrancol/articles/206529.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sat, 07 Jun 2008 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/206529.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/206529.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/206529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/206529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/206529.html</trackback:ping><description><![CDATA[服务器每次发来的密文，类似于<br />
#eLrBHMNx&lt;F=hgmlYA]X]ENtpGM`X@?PuN`LwT_m&gt;RmleJ_l{PAMHQ?pUCpdbENa&lt;F`pjBllQC=HSC\\pT?LduQ_y=PQM&gt;JptK!<br />
命令体部分经过普通解密后，还需要根据一个掩码来进行二次解密<br />
<br />
这里是二次解密命令体的部分<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ebp, esp<br />
&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; esp, FFFFFFF8<br />
&nbsp; push&nbsp;&nbsp;&nbsp; -1<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 004C833C<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr fs:[0]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr fs:[0], esp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 549C<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004BC0B0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [ebp+8]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [edi], 2B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;------判断第一个字节是否为 +<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ebx, ecx<br />
&nbsp; jnz L029<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042B0D0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+54AC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr fs:[0], ecx<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esp, ebp<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4<br />
L029:<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-----&nbsp;&nbsp; 密文<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+3C]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&lt;------&nbsp; 密文解密后被保存在这里<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0CE0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cx, word ptr [ebx+49B162]<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+3C], cx<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, byte ptr [esp+43]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [ebx+49B161]<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ah, byte ptr [esp+3F]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dl, byte ptr [esp+41]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; al, byte ptr [esp+3D]<br />
&nbsp; shl&nbsp;&nbsp;&nbsp;&nbsp; edx, 10<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx, eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; al, byte ptr [ebx+49B160]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, edx<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [esp+3C]<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, cl<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; al, byte ptr [esp+38]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+1C], esi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dl, al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+38]<br />
&nbsp; shr&nbsp;&nbsp;&nbsp;&nbsp; eax, 10<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cx, dx<br />
&nbsp; movzx&nbsp;&nbsp; dx, byte ptr [esp+39]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, byte ptr [esp+3E]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+20], cx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+22], dx<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, byte ptr [esp+40]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dl, al<br />
&nbsp; movzx&nbsp;&nbsp; ax, ah<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ah, byte ptr [esp+42]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+24], dx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+26], ax<br />
&nbsp; movzx&nbsp;&nbsp; eax, cx<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; eax, -138A<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 123<br />
&nbsp; ja&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0043BF9D<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [eax+43C220]<br />
&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ecx*4+43BFB4]<br />
<br />
在 MIR3G二次加解密反汇编分析（三）——跟踪&nbsp; 中有4个赋值<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
这就是命令体二次解密时的掩码<br />
<br />
<strong style="color: #ff0000">从一次解密的消息体中提取掩码的部分<br />
</strong>&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 3C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;判断消息体长度是否为60<br />
&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; 0043BF9D<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CA8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp+CA8保存的就是经过一次解密的消息体（不包含命令体）<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CAC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CB0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+38], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CB4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+44], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CC0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+3C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CB8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+40], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CBC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+54], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CCC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+48], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CC4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+50], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CC8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+60], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CD8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+58], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CD0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+5C], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CD4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+24], ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+1C]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+1C], edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;最后20个字节<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CDC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+20], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CE0]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+50], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+68], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+2C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+30], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+34], 0<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+38]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前20个字节<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+50]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
<br />
<br />
<strong style="color: #ff0000">提取掩码的函数 0042BD60</strong><br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, dword ptr [esp+C]&nbsp; esi = arg1&nbsp;&nbsp;&nbsp; ;消息体<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax = arg1<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; ebx, ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx = 0<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [eax+1]&nbsp; edx = arg+1 ，从第二个字节开始<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [ecx]<br />
L007:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl<br />
&nbsp; jnz L007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查参数长度是否是20<br />
&nbsp; jnb L018<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; ax, ax<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4<br />
L018:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax =2<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esi+1] ;edx指向第二个字节&nbsp; edx = 1<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
L022:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [edx-1]&nbsp;&nbsp; ;cl = arg[edx-1]<br />
&nbsp; movzx&nbsp;&nbsp; esi, byte ptr [edx+8]&nbsp; ;esi = ((long)(arg[edx+8]))<br />
&nbsp; movzx&nbsp;&nbsp; ecx, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ecx = ((long)cl)<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;esi = esi+ecx<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx]&nbsp;&nbsp;&nbsp; ;ecx = (long)arg[edx]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(ecx &lt; esi) 跳转到 L033<br />
&nbsp; jl L033<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax-2] ; ecx = eax-2<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebx = ebx | edi<br />
L033:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+1]&nbsp; ;ecx = (long)arg[edx+1]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(ecx&lt;esi) 跳转到 L040<br />
&nbsp; jl L040<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax-1] ;ecx = eax-2<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; arg[eax-1]<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L040:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+2]&nbsp; ;ecx = (long)arg[edx+2]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(ecx &lt; esi) 跳转到 L047<br />
&nbsp; jl L047<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ecx = eax<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L047:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+3]&nbsp; ;ecx = (long)arg[edx+3]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L054<br />
&nbsp; jl L054<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+1] ;ecx = eax+1<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000 <br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L054:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+4]&nbsp; ;ecx = (long)arg[edx+4]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L061<br />
&nbsp; jl L061<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+2] ;ecx = eax+2<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000 <br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L061:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+5]&nbsp;&nbsp; ;ecx = (long)arg[edx+5]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L068<br />
&nbsp; jl L068<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+3] ;ecx = eax+3<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L068:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+6]&nbsp; ;ecx = (long)arg[edx+6]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L075<br />
&nbsp; jl L075<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+4] ;ecx = eax+4<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L075:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+7]&nbsp;&nbsp; ;ecx = (long)arg[edx+7]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L082<br />
&nbsp; jl L082<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+5] ;ecx = eax+5<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; esi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L082:<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; eax, 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = eax+8<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; edx, 0A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx = edx+0x0A<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 0A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(eax &lt;= 0X0A) 跳转到 L022<br />
&nbsp; jle L022<br />
&nbsp; movzx&nbsp;&nbsp; edx, bl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx = (long)bl&nbsp;&nbsp; 低8位0扩展<br />
&nbsp; movzx&nbsp;&nbsp; eax, bh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = (long)bh&nbsp;&nbsp; 高8位0扩展<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, 87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx = edx ^ 0x87<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, 87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = eax ^ 0x87<br />
&nbsp; shl&nbsp;&nbsp;&nbsp;&nbsp; edx, 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx &lt;&lt; 8<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = eax | edx&nbsp;&nbsp;<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4<br />
<br />
至此，消息的加解密部分已经全部还原 
<img src ="http://www.blogjava.net/Phrancol/aggbug/206529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-07 16:06 <a href="http://www.blogjava.net/Phrancol/articles/206529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（四）——还原</title><link>http://www.blogjava.net/Phrancol/articles/205936.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sat, 07 Jun 2008 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/205936.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/205936.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/205936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/205936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/205936.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇的跟踪中，调试后发现二次加密的密匙其实就是一个常量008B480C，分析一下整个二次加密的过程，以下代码均在VC6.0中运行通过，加密后数据与客户端实际发送数据一致。函数1&nbsp;- _declspec(naked) void _stdcall getEncryptMsg(long *nIdentity, char * dest)nIdentity - 008B480C...&nbsp;&nbsp;<a href='http://www.blogjava.net/Phrancol/articles/205936.html'>阅读全文</a><img src ="http://www.blogjava.net/Phrancol/aggbug/205936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-07 10:20 <a href="http://www.blogjava.net/Phrancol/articles/205936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（三）——跟踪 </title><link>http://www.blogjava.net/Phrancol/articles/205195.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 01 Jun 2008 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/205195.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/205195.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/205195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/205195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/205195.html</trackback:ping><description><![CDATA[<p>根据3EF找到生成命令体的函数，该函数只有一个参数——消息体，转到上一个函数得到以下代码</p>
<p>&nbsp; push&nbsp;&nbsp;&nbsp; 1FFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;1FFF入栈<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CAC] ;(3244)&nbsp; 距离栈顶811个存储单元 <br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax入栈 解密后要存入的地址入栈<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; edi, 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi=从字符串第17个字节开始往后的串<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;密文入栈 <br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0BD0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;跟进发现这是普通的一次解密，解密后数据存在esp+CAC里 <br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+eax+CA8], 0 <br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ecx=100 (256) 循环次数<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [esp+3F8]&nbsp;&nbsp; ;edi<br />
&nbsp; rep&nbsp;&nbsp;&nbsp;&nbsp; stos dword ptr es:[edi]&nbsp;&nbsp;&nbsp; ;<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+3F8]&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [ebx+3CD864]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042C440&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;二次解密，生成回复密文<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+3F8]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 004D5C70&nbsp; <br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0049F770&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用messageSend(char* msg)<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CA8]<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [eax+1]<br />
L023:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl<br />
&nbsp; jnz L023<br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 3C<br />
&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; 0043BF9D<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CA8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CAC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CB0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+38], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CB4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+44], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CC0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+3C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CB8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+40], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CBC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+54], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CCC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+48], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CC4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+50], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CC8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+60], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CD8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+58], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CD0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+5C], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CD4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+24], ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+1C]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+1C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CDC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+20], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CE0]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+50], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+68], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+2C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+30], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+34], 0<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+38]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+50]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+54AC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr fs:[0], ecx<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esp, ebp<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4</p>
<p><br />
分析以上代码可以简单得出以下结论<br />
1. 从call&nbsp; 004A0BD0 的调用可以简单分析出二次密文可能也是标准消息结构<br />
2. 通过对比未更新版本与最新版本对3EF的发送情况，未更新版本发送3EF时，消息体是空，命令体其他参数不为0，再细分析，<br />
未更新的版本的3EF其实就是割肉的命令...........<br />
最新版本的客户端收到二次密文后，经过一些处理，以3EF为命令发向服务器<br />
3. 从add edi, 10可以猜测，二次密文的命令体可能是迷惑人用的<br />
4. 从call 0049F770这个调用断定 esp+3F8 就是二次解密后的明文<br />
5. 对于call 0042C440这个调用，可以猜测，这个就是二次解密的函数<br />
6. 服务器发来的密文对于本次解密是没有影响的，只是对它进行了一些操作，生成了4个数并进行如下保存<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
7. 二次解密函数有2个参数: arg1 = dword ptr [ebx+3CD864] , arg2 = [esp+3F8]<br />
&nbsp;&nbsp; 也就是根据dword ptr [ebx+3CD864]来生成解密明文，并存入地址esp+3F8，于是ebx+3CD864就成了解密的关键<br />
</p>
  <img src ="http://www.blogjava.net/Phrancol/aggbug/205195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-01 20:12 <a href="http://www.blogjava.net/Phrancol/articles/205195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（二）——分析</title><link>http://www.blogjava.net/Phrancol/articles/205127.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 01 Jun 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/205127.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/205127.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/205127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/205127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/205127.html</trackback:ping><description><![CDATA[<p>数据发送接收情况:<br />
........客户端与Gateserver,Loginserver的数据互换，省略<br />
1. 客户端向Gameserver发送[**登录用户名/角色名/验证数1/验证数2/版本验证数/1/0]<br />
2. Gameserver向客户端发送密文，类似#eLrBHMNx&lt;F=hgmlYA]X]ENtpGM`X@?PuN`LwT_m&gt;RmleJ_l{PAMHQ?pUCpdbENa&lt;F`pjBllQC=HSC\\pT?LduQ_y=PQM&gt;JptK!<br />
3. 客户端向Gameserver发送解密后密文，类似#3&lt;&lt;&lt;&lt;&lt;Jx?&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;A&gt;xZCNLSHoPpAnQRF?ljIaaUPmlSF^L_BmtfFODJA_X\\A]T`GNlq@L!<br />
........欢迎信息，装备信息等省略</p>
<p>数据格式<br />
[#][标识位][指令头][消息体][!]<br />
例如 #3&lt;&lt;&lt;&lt;&lt;B\\&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;mi{EhL!</p>
<p>命令结构体<br />
typedef struct tag_TDEFAULTMESSAGE<br />
{<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; nRecog;<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wIdent;&nbsp; 3EF<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wParam;<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wTag;<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wSeries;<br />
} _TDEFAULTMESSAGE, *_LPTDEFAULTMESSAGE;</p>
<p>解密命令体&lt;&lt;&lt;&lt;&lt;Jx?&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;得到wIdent值是3EF(1007)，OD打开Mir3.exe，查找常量000003EF，跟踪进入，得到如下代码<br />
&gt;&gt;Method1(未知参数)<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 3EF<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [esi+18]&nbsp; ;esi+18 是命令结构体的首地址<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;命令结构体首地址<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0D00&nbsp;&nbsp;&nbsp; ;生成命令结构体 (edi,3ef,0,0,0,0)<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+C] ; eax保存第一个参数<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp; ;传递this指针，<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0049E450&nbsp;&nbsp;&nbsp; ;发送数据，arg3: 0, arg2: 第一个参数, arg1: 命令结构体<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4</p>
<p>简单分析，入栈的4个0和3EF,则对应结构体,该函数至少1个参数，目前不知这个参数是什么意思，跟进0049E450看看<br />
&gt;&gt;Method2(命令结构体,未知参数,0)<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+4]&nbsp; ;eax=命令结构体<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;得到this指针<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 20<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ebp, dword ptr [esi+24] ;esi+18是命令结构体，加密命令结构体得到的字符串保存在esi+24中<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0CA0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;跟进发现是加密命令结构体,arg3: 20(32), arg2: esi+24, arg1: 命令结构体地址 <br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esi+14] ;eax=esi+14=标识位<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 9 <br />
&nbsp; jl L015&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果标识位小于9，则跳到L015<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esi+14], 1&nbsp;&nbsp; ;否则标识位重设为1<br />
&nbsp; jmp L017<br />
L015:<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esi+14], eax ;标识位自加1<br />
L017:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+14] ;edx=第2个参数<br />
&nbsp; test&nbsp;&nbsp;&nbsp; edx, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br />
&nbsp; je L048&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果第2个参数为0，则跳转到L048<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+18] ;eax=第3个参数: 0<br />
&nbsp; test&nbsp;&nbsp;&nbsp; eax, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; jnz L031&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax不等于0则跳转<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax=第2个参数<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [eax+1]&nbsp; <br />
L026:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;cl=第2个参数第1个字节<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;循环得到第一个参数的长度<br />
&nbsp; jnz L026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;没到字符串尾则继续循环<br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
L031:<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 2000<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [esi+44]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0B10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用加密函数，将edx加密，保存在esi+44中<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esi+14]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ebx, dword ptr [esi+2044]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 004CBFE4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; #%d%s%s!<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004BB568<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 14<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; jmp L056<br />
L048:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esi+14]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ebx, dword ptr [esi+2044]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 004CBFC4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; #%d%s! <br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004BB568&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;sprintf&nbsp; 格式化发送给服务器端的数据<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 10<br />
L056:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, ebx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [eax+1]<br />
L058:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;这个循环得到数据长度<br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl<br />
&nbsp; jnz L058<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 数据长度<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esi+6044]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Data ，要发送的数据<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Socket对象<br />
&nbsp; call&nbsp;&nbsp;&nbsp; &lt;jmp.&amp;WS2_32.#19&gt;&nbsp;&nbsp; ;这里是调用send(Socket对象, 要发送的数据, 数据长度, 0 (flag));<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 0C</p>
<p>L017和L031说明Method1和Method2中的未知参数就是明文消息体，Method1只有1个消息体参数<br />
</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/Phrancol/aggbug/205127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-01 10:48 <a href="http://www.blogjava.net/Phrancol/articles/205127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（一）——初探</title><link>http://www.blogjava.net/Phrancol/articles/204124.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Fri, 30 May 2008 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/204124.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/204124.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/204124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/204124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/204124.html</trackback:ping><description><![CDATA[<p>突击了一个星期的汇编，再对照民间流传的传奇源码(C++版本)，基本摸清了这部分的代码</p>
<p>OD打开Mir3.exe(Mir3G_20070108) -&gt; ASCII -&gt;找到**%s/%s/%d/%d/%d/1/%d-&gt;双击，得到如下代码</p>
<p><br />
这段代码是将几个参数，使用sprintf生成字符串，然后6BIT加密，以#%d%s!格式发送到服务器端<br />
0049E2D0&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+14]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; eax=arg5（第5个参数）<br />
0049E2D4&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; esp, 600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 预留1536个存储单元<br />
0049E2DA&nbsp; push&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
0049E2DB&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
0049E2DC&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [&lt;&amp;USER32.wsprint&gt;;&nbsp; USER32.wsprintfA&nbsp;&nbsp;&nbsp; <br />
0049E2E2&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; /&lt;%d&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax入栈<br />
**%s/%s/%d/%d/%d/1/arg5<br />
0049E2E3&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+618]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp; eax = arg3<br />
0049E2EA&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |<br />
0049E2EC&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+61C]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; | ecx = arg4<br />
0049E2F3&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx=ecx=arg4<br />
0049E2F5&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, FA0280AF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp; edx=arg4异或FA0280AF&nbsp;<br />
0049E2FB&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%d&gt;&nbsp;&nbsp; edx入栈<br />
**%s/%s/%d/%d/arg4异或FA0280AF/1/arg5<br />
0049E2FC&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx=eax=arg3<br />
0049E2FE&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx=arg3异或arg4<br />
0049E300&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+614]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp; ecx=arg1<br />
0049E307&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, 5580AF27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx = edx异或5580AF27<br />
0049E30D&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%d&gt;&nbsp;&nbsp; edx入栈<br />
**%s/%s/%d/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E30E&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, 3EB2C5CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp; eax = arg3异或3EB2C5CC<br />
0049E313&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%d&gt;<br />
**%s/%s/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E314&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+620]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; | eax = arg2<br />
0049E31B&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%s&gt; <br />
**%s/arg2/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E31C&nbsp; push&nbsp;&nbsp;&nbsp; ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%s&gt;<br />
**arg1/arg2/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E31D&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+220]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp; edx 指向上面预留的1536个存储单元中最后512个单元的首地址<br />
0049E324&nbsp; push&nbsp;&nbsp;&nbsp; 004CBFCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |**%s/%s/%d/%d/%d/1/%d<br />
0049E329&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |s<br />
0049E32A&nbsp; call&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; \wsprintfA&nbsp; edx指向生成的明文字符串首地址<br />
0049E32C&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 前移32个存储单元<br />
0049E32F&nbsp; push&nbsp;&nbsp;&nbsp; 1FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 512入栈&nbsp; &lt;加密函数第4个参数&gt;<br />
0049E334&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+20C]&nbsp; eax =明文字符串<br />
0049E33B&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; /String&nbsp;&nbsp; <br />
0049E33C&nbsp; call&nbsp;&nbsp;&nbsp; dword ptr [&lt;&amp;KERNEL32.lstrlenA&gt;] ; \lstrlenA 得到明文的长度，保存在eax中<br />
0049E342&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax入栈&nbsp;&nbsp; 明文长度入栈&lt;加密函数第3个参数&gt;<br />
0049E343&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+10]&nbsp;&nbsp;&nbsp;&nbsp; ecx=第一次入栈的edi的值，应该是某个成员变量<br />
0049E347&nbsp; push&nbsp;&nbsp;&nbsp; ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx入栈&lt;加密函数第2个参数&gt;<br />
0049E348&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+214]&nbsp; <br />
0049E34F&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明文字符串首&lt;加密函数第1个参数&gt;<br />
0049E350&nbsp; call&nbsp;&nbsp;&nbsp; 004A0B10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用加密函数<br />
fnEncode(char *strSrc, char *strDest, int lenSrc, 512)<br />
...................<br />
后面是发送信息</p>
 <img src ="http://www.blogjava.net/Phrancol/aggbug/204124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-05-30 16:34 <a href="http://www.blogjava.net/Phrancol/articles/204124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>