<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_专注于.net技术</title><subtitle type="text">夺</subtitle><id>http://feed.cnblogs.com/blog/u/21363/rss</id><updated>2011-10-01T02:54:44Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/21363/rss"/><entry><id>http://www.cnblogs.com/mfm11111/archive/2011/07/06/2098788.html</id><title type="text">真是郁闷，团队中居然出了这样的骗子！！</title><summary type="text">郑重声明：本人传世从没真正收过徒弟，如果发现：有人以收徒弟为名，收取2000元徒弟费用，教分析传世系列以下主要数据者。其实是主要拿我分析的数据在收徒，此时请仔细确认以下几点，以免上当受骗，如下：1。传世中背包信息，是否准确无误。2。传世中丢物的信息是否准确无误。3。传世中买，卖，修，存是否实现。4。传世中任务的ID，名称及基址是否分析出。5。地图信息是否准确无误。6。二级NPC窗口信息的详细分析方法（此信息结果已告之对方）为什么要确认以上几点，很简单，以上几点的详细分析及结果还没来得及提供给对方。万幸！！！有图为证：有图为证：以图为证：有图为证：实在伤心，特此郑重声明：1。外挂开发阶段，由于骗</summary><published>2011-07-05T17:26:00Z</published><updated>2011-07-05T17:26:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2011/07/06/2098788.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2011/07/06/2098788.html"/><content type="html">&lt;p&gt;&amp;nbsp;郑重声明：本人传世从没真正收过徒弟，如果发现：有人以收徒弟为名，收取2000元徒弟费用，教分析传世系列以下主要数据者。其实是主要拿我分析的数据在收徒，此时&lt;/p&gt;&lt;p&gt;请仔细确认以下几点，以免上当受骗，如下：&lt;/p&gt;&lt;p&gt;1。传世中背包信息，是否准确无误。&lt;/p&gt;&lt;p&gt;2。传世中丢物的信息是否准确无误。&lt;/p&gt;&lt;p&gt;3。传世中买，卖，修，存是否实现。&lt;/p&gt;&lt;p&gt;4。传世中任务的ID，名称及基址是否分析出。&lt;/p&gt;&lt;p&gt;5。地图信息是否准确无误。&lt;/p&gt;&lt;p&gt;6。二级NPC窗口信息的详细分析方法（此信息结果已告之对方）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为什么要确认以上几点，很简单，以上几点的详细分析及结果还没来得及提供给对方。万幸！！！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有图为证：&lt;/p&gt;&lt;p&gt;&lt;img height="75" alt="" src="http://images.cnblogs.com/cnblogs_com/mfm11111/001.jpg" width="460" border="0" longdesc="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;有图为证：&lt;/p&gt;&lt;p&gt;&lt;img height="208" alt="" src="http://images.cnblogs.com/cnblogs_com/mfm11111/01.jpg" width="268" border="0" longdesc="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以图为证：&lt;/p&gt;&lt;p&gt;有图为证：&lt;img height="889" alt="" src="http://images.cnblogs.com/cnblogs_com/mfm11111/1.jpg" width="486" border="0" longdesc="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;实在伤心，特此郑重声明：1。外挂开发阶段，由于骗子多，传奇或传世主体数据均已分析完毕，正处于外挂开发阶段，传奇或传世系列数据不再对外交换或交流。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2。已录制的视频仅供有限的几个好朋友或已收的四个传奇内部徒弟之间交流。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3。传世系列计划全部数据分析完毕后每个游戏限收一个徒弟，2011年7-8月28号属于研究游戏阶段，这段时间不收任何徒弟。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/mfm11111/aggbug/2098788.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mfm11111/archive/2011/07/06/2098788.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2010/10/26/1861190.html</id><title type="text">C++反汇编揭秘1 – 一个简单C++程序反汇编解析</title><summary type="text">http://blog.csdn.net/atfield/archive/2006/11/14/1382694.aspx</summary><published>2010-10-26T02:06:00Z</published><updated>2010-10-26T02:06:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2010/10/26/1861190.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2010/10/26/1861190.html"/><content type="html">&lt;a href="http://blog.csdn.net/atfield/archive/2006/11/14/1382694.aspx"&gt;http://blog.csdn.net/atfield/archive/2006/11/14/1382694.aspx&lt;/a&gt;&lt;img src="http://www.cnblogs.com/mfm11111/aggbug/1861190.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mfm11111/archive/2010/10/26/1861190.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2010/10/17/1853408.html</id><title type="text">函数调用堆栈变化分析</title><summary type="text">比如我们有这样一个C函数#include&lt;stdio.h&gt;longtest(inta,intb){a=a+1;b=b+100;returna+b;}voidmain(){printf("%d",test(1000,2000));}写成32位汇编就是这样;///////////////////////////////////////////////////////////////////...</summary><published>2010-10-17T03:06:00Z</published><updated>2010-10-17T03:06:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2010/10/17/1853408.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2010/10/17/1853408.html"/><content type="html">比如&amp;nbsp;我们有这样一个C函数&lt;br /&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;long&amp;nbsp;test(int&amp;nbsp;a,int&amp;nbsp;b)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;a&amp;nbsp;+&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;b&amp;nbsp;+&amp;nbsp;100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;a&amp;nbsp;+&amp;nbsp;b;&lt;br /&gt;}&lt;br /&gt;void&amp;nbsp;main()&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;printf("%d",test(1000,2000));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;写成32位汇编就是这样&lt;br /&gt;;//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;.386&lt;br /&gt;.model&amp;nbsp;flat,stdcall&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这里我们用stdcall&amp;nbsp;就是函数参数&amp;nbsp;压栈的时候从最后一个开始压，和被调用函数负责清栈&lt;br /&gt;option&amp;nbsp;casemap:none&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;区分大小写&lt;br /&gt;&lt;br /&gt;includelib&amp;nbsp;msvcrt.lib&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这里是引入类库&amp;nbsp;相当于&amp;nbsp;#include&amp;lt;stdio.h&amp;gt;了&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;printf&amp;nbsp;&amp;nbsp;PROTO&amp;nbsp;C:DWORD,:VARARG&amp;nbsp;&amp;nbsp;;这个就是声明一下我们要用的函数头，到时候&amp;nbsp;汇编程序会自动到msvcrt.lib里面找的了&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;:VARARG&amp;nbsp;表后面的参数不确定&amp;nbsp;因为C就是这样的printf(const&amp;nbsp;char&amp;nbsp;*,&amp;nbsp;...);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这样的函数要注意&amp;nbsp;不是被调用函数负责清栈&amp;nbsp;因为它本身不知道有多少个参数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;而是有调用者负责清栈&amp;nbsp;&amp;nbsp;下面会详细说明&lt;br /&gt;.data&lt;br /&gt;szTextFmt&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;'%d',0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这个是用来类型转换的，跟C的一样,字符用字节类型&lt;br /&gt;a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dword&amp;nbsp;1000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;假设&lt;br /&gt;b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dword&amp;nbsp;2000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;处理数值都用双字&amp;nbsp;没有int&amp;nbsp;跟long&amp;nbsp;的区别&lt;br /&gt;&lt;br /&gt;;/////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;.code&lt;br /&gt;&lt;br /&gt;_test&amp;nbsp;proc&amp;nbsp;;A:DWORD,B:DWORD&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;push&amp;nbsp;ebp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;ebp,esp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;eax,dword&amp;nbsp;ptr&amp;nbsp;ss:[ebp+8]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add&amp;nbsp;&amp;nbsp;eax,1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;edx,dword&amp;nbsp;ptr&amp;nbsp;ss:[ebp+0Ch]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add&amp;nbsp;&amp;nbsp;edx,100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add&amp;nbsp;&amp;nbsp;eax,edx&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pop&amp;nbsp;&amp;nbsp;ebp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retn&amp;nbsp;8&lt;br /&gt;_test&amp;nbsp;endp&lt;br /&gt;&lt;br /&gt;_main&amp;nbsp;proc&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;push&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;ds:b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;反汇编我们看到的b就不是b了而是一个[*****]数字&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;就是我们在ds(数据段)把[*****]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;开始的一个双字长数值取出来&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;push&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;ds:a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;跟她对应的还有&amp;nbsp;byte&amp;nbsp;ptr&amp;nbsp;****就是取一个字节出来&amp;nbsp;比如这样&amp;nbsp;mov&amp;nbsp;&amp;nbsp;al,byte&amp;nbsp;ptr&amp;nbsp;ds:szTextFmt&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;就把&amp;nbsp;%&amp;nbsp;取出来&amp;nbsp;而不包括&amp;nbsp;d&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call&amp;nbsp;_test&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;push&amp;nbsp;eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;假设push&amp;nbsp;eax的地址是&amp;#215;&amp;#215;&amp;#215;&amp;#215;&amp;#215;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;push&amp;nbsp;offset&amp;nbsp;szTextFmt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;call&amp;nbsp;printf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add&amp;nbsp;&amp;nbsp;esp,8&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;_main&amp;nbsp;endp&lt;br /&gt;end&amp;nbsp;&amp;nbsp;_main&lt;br /&gt;&lt;br /&gt;;//////////////////////////////////////////////////////////////&amp;nbsp;下面介绍堆栈的变化&lt;br /&gt;首先要明白的是&amp;nbsp;操作堆栈段&amp;nbsp;ss&amp;nbsp;只能用&amp;nbsp;esp或ebp寄存器&amp;nbsp;其他的寄存器eax&amp;nbsp;ebx&amp;nbsp;edx等都不能够用&amp;nbsp;而&amp;nbsp;esp永远指向堆栈栈顶&amp;nbsp;ebp用来&amp;nbsp;在堆栈段&lt;br /&gt;&lt;br /&gt;里面寻址&lt;br /&gt;push&amp;nbsp;指令是压栈&amp;nbsp;ESP=ESP-4&lt;br /&gt;pop&amp;nbsp;&amp;nbsp;指令是出栈&amp;nbsp;ESP=ESP+4&lt;br /&gt;我们假设main函数一开始堆栈定是&amp;nbsp;ESP=400&lt;br /&gt;push&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;ds:b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=396&amp;nbsp;-&amp;gt;里面的值就是&amp;nbsp;2000&amp;nbsp;就是b的数值&lt;br /&gt;push&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;ds:a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=392&amp;nbsp;-&amp;gt;里面的值就是&amp;nbsp;1000&amp;nbsp;就是a的数值&lt;br /&gt;call&amp;nbsp;test&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=388－&amp;gt;里面的数值是什么？这个太重要了&amp;nbsp;就是我们用来找游戏函数的原理所在。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;里面的数值就是call&amp;nbsp;test&amp;nbsp;指令下一条指令的地址－&amp;gt;即push&amp;nbsp;eax的地址&amp;#215;&amp;#215;&amp;#215;&amp;#215;&amp;#215;&lt;br /&gt;&lt;br /&gt;到了test函数里面&lt;br /&gt;&lt;br /&gt;push&amp;nbsp;ebp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=384-&amp;gt;里面保存了当前ebp的值&amp;nbsp;而不是把ebp清零&lt;br /&gt;mov&amp;nbsp;&amp;nbsp;ebp,esp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这里ESP＝384就没变化了，但是&amp;nbsp;ebp=esp=384,为什么要这样做呢&amp;nbsp;因为我们要用ebp到堆栈里面找参数&lt;br /&gt;mov&amp;nbsp;&amp;nbsp;eax,dword&amp;nbsp;ptr&amp;nbsp;ss:[ebp+8]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;反汇编是这样的&amp;nbsp;想想为什么a就是[ebp+8]呢&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;我们往上看看堆栈里地址392处就保存着a的值&amp;nbsp;这里ebp=384&amp;nbsp;加上8正好就是392了&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这样就把传递过来的1000拿了出来eax=1000&lt;br /&gt;add&amp;nbsp;&amp;nbsp;eax,1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;相当于&amp;nbsp;a+1了&amp;nbsp;eax=1001&lt;br /&gt;mov&amp;nbsp;&amp;nbsp;edx,dword&amp;nbsp;ptr&amp;nbsp;ss:[ebp+0Ch]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&amp;nbsp;0Ch=12&amp;nbsp;一样道理这里指向堆栈的地址是384+12=396&amp;nbsp;就是2000了&amp;nbsp;edx=2000&lt;br /&gt;add&amp;nbsp;&amp;nbsp;edx,100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;相当于&amp;nbsp;b+100&amp;nbsp;edx=2100&lt;br /&gt;add&amp;nbsp;&amp;nbsp;eax,edx&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;eax=eax+edx＝1001＋2100＝3101&amp;nbsp;这里eax已经保存了最终的结果了&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;因为win32汇编一般用eax返回结果&amp;nbsp;所以如果最终结果不是在eax里面的话&amp;nbsp;还要把它放到eax&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;比如假设我的结果保存在变量nRet里面&amp;nbsp;最后还是要这样&amp;nbsp;mov&amp;nbsp;eax,dword&amp;nbsp;ptr&amp;nbsp;nRet&lt;br /&gt;pop&amp;nbsp;&amp;nbsp;ebp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP=384+4=388&amp;nbsp;而保存在栈顶384的值&amp;nbsp;保存到&amp;nbsp;ebp中&amp;nbsp;即恢复ebp原来的值&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;因为一开始我们就把ebp的值压栈了，mov&amp;nbsp;ebp,esp已经改变了ebp的值，这里恢复就是保证了堆栈平衡&lt;br /&gt;retn&amp;nbsp;&amp;nbsp;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP+8-&amp;gt;396&amp;nbsp;这里retn是由系统调用的&amp;nbsp;我们不用管&amp;nbsp;系统会自动把EIP指针指向&amp;nbsp;原来的call的下一条指令&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;由于是系统自动恢复了call那里的压栈所以&amp;nbsp;真正返回到的时候ESP+4就是恢复了call压栈的堆栈&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;到了这个时候&amp;nbsp;ESP=400&amp;nbsp;就是函数调用开始的堆栈，就是说函数调用前跟函数调用后的堆栈是一样的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这就是堆栈平衡&amp;nbsp;&lt;br /&gt;由于我们用stdcall上面retn&amp;nbsp;8就是被调用者负责恢复堆栈的意思了，函数test是被调用者，所以负责把堆栈加8,call&amp;nbsp;那里是系统自动恢复的&lt;br /&gt;&lt;br /&gt;push&amp;nbsp;eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=396-&amp;gt;里面保存了eax的值3101&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;上面已经看到了eax保存着返回值，我们要把它传给printf也是通过堆栈传递&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;push&amp;nbsp;offset&amp;nbsp;szTextFmt&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=392-&amp;gt;里面保存了szTextFmt的地址&amp;nbsp;也就是C里面的指针&amp;nbsp;实际上没有什么把字符串传递的，我们传的都是地址&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;无论是在汇编或C&amp;nbsp;所以在汇编里没有什么字符串类型&amp;nbsp;用最多的就是DWORD。嘿嘿游戏里面传递参数&amp;nbsp;简单多了&lt;br /&gt;call&amp;nbsp;printf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP-4=388-&amp;gt;里面保存了下一条指令的地址&lt;br /&gt;add&amp;nbsp;&amp;nbsp;esp,8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;ESP+8=400&amp;nbsp;恢复了调用printf前的堆栈状态&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;上面说了由于printf后面参数是:VARARG&amp;nbsp;这样的类型是有调用者恢复堆栈的&amp;nbsp;所以printf里面没有retn&amp;nbsp;8之类的指令&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;这是由调用者负责清栈&amp;nbsp;main是调用者&amp;nbsp;所以下面一句就是&amp;nbsp;add&amp;nbsp;esp,8&amp;nbsp;把堆栈恢复到调用printf之前&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;而call&amp;nbsp;printf那里的压栈&amp;nbsp;是由系统做的&amp;nbsp;恢复的工作也是系统完成&amp;nbsp;我们不用理&amp;nbsp;只是知道里面保存是返回地址就够&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;了&lt;br /&gt;ret&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;main&amp;nbsp;函数返回&amp;nbsp;其他的事情是系统自动搞定&amp;nbsp;我们不用理&amp;nbsp;任务完成&lt;img src="http://www.cnblogs.com/mfm11111/aggbug/1853408.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mfm11111/archive/2010/10/17/1853408.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2010/10/08/1845853.html</id><title type="text">为什么要下断bpSend，原理分析。</title><summary type="text">看过这里有的大大是断下send后，去找调用send的CALL，找到这个CALL再找上一次的CALL，这样去找关键CALL，但是，有的游戏这样是找不来的，所以，如果有的游戏不能这样找回去，那怎么办呢，这就要先说说原理了。 要说找CALL的原理，我们应该想想游戏的运行机制。也就是说游戏的控制方式是怎么样的。 不说费话，其实大多数的游戏都是这样的，来个买药的例子吧： 点击买药后： ...</summary><published>2010-10-08T07:03:00Z</published><updated>2010-10-08T07:03:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2010/10/08/1845853.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2010/10/08/1845853.html"/><content type="html">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 看过这里有的大大是断下send后，去找调用send的CALL，找到这个CALL再找上一次的CALL，这样去找关键CALL，但是，有的游戏这样是找不来的，所以，如果有的游戏不能这样找回去，那怎么办呢，这就要先说说原理了。 &lt;br /&gt; 要说找CALL的原理，我们应该想想游戏的运行机制。也就是说游戏的控制方式是怎么样的。 &lt;br /&gt; 不说费话，其实大多数的游戏都是这样的，来个买药的例子吧： &lt;br /&gt; 点击买药后： &lt;br /&gt; 1、客户端产生一个买药行为 并调用买物品的过程，如：BuyGoods(s:string,n:integer);　//参数s为物品种类 n为数量 &lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;2、这个行为会产生一个发送给服务器的数据信息　MakeInfoString; &lt;br /&gt; 　比如：36 00 01 ......... &lt;br /&gt; 3、数据出来要进行一次或N次的加密。 &lt;br /&gt; 4、加密后通过send或WSASend函数将这个信息发给服务器处理。 &lt;br /&gt; 5、等待服务器处理返回。 &lt;br /&gt; 6、服务器返回购买成功的信息。 &lt;br /&gt; 7、客户端响应这个信息，并调用本地动作行为。 &lt;br /&gt; 这样，基本上就构成了游戏的一般的控制方式。 &lt;br /&gt; 写出程序大概可能为： &lt;br /&gt; 主程序 &lt;br /&gt; .... &lt;br /&gt; .... &lt;br /&gt; BuyGoods(LifeMedicine,10);&amp;nbsp;&amp;nbsp;//行为产生后调用买物品过程 &lt;br /&gt; .... &lt;br /&gt; .... &lt;br /&gt; 主程序 &lt;br /&gt; &lt;br /&gt; procedure BuyGoods(s:string,n:integer);&amp;nbsp;&amp;nbsp;//买物品的过程 &lt;br /&gt; begin &lt;br /&gt; &amp;nbsp;&amp;nbsp;send(Encrypt(MakeInfoString(s,n))); &lt;br /&gt; end; &lt;br /&gt; 当然写法也可以是： &lt;br /&gt; MakeInfoString; &lt;br /&gt; Encrypt; &lt;br /&gt; send; &lt;br /&gt; &lt;br /&gt; 不管怎么样方法都是差不多的。 &lt;br /&gt; 了解了程序的大至写法，那么我们逆向起来就有个思路了： &lt;br /&gt; &amp;nbsp; &amp;nbsp; bp send &lt;br /&gt; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;返回向回找，先找到Encrypt，再向回找，能找到MakeInfoString（也就是找到明码部分），再向上找，就是调用这些东西的BuyGoods(s:string,n:integer)了。 &lt;br /&gt; &lt;br /&gt; 我来找一个游戏说明一下吧，比如说有个什么名状的游戏。 &lt;br /&gt; 这个游戏有个出征和休息待卫的功能，也就是放出和休息宝宝了。就拿这个CALL来讲吧。 &lt;br /&gt; 这个游戏我用一般的思路往回找无法找出来这个出征的CALL，别的CALL没试，主要用是讲个例子。那么我就用另一个方法： &lt;br /&gt; 1，我先下bp send，返回看到这里，不用说就是send函数了。 &lt;br /&gt; 　0069FFBF&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;E8 82A11000&amp;nbsp;&amp;nbsp;call&amp;nbsp; &amp;nbsp; &amp;lt;jmp.&amp;amp;WS2_32.#19&amp;gt; &lt;br /&gt; ,2，给send的BUF区下硬键访问断点，来到这里，看出是这里向Send函数的BUF区放数据的。 &lt;br /&gt; 　0069FB43&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;F3:A5&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;rep&amp;nbsp; &amp;nbsp; movs dword ptr es:[edi], dword ptr [e&amp;gt;; | &lt;br /&gt; 3，给esi下断分析，发现加密函数。 &lt;br /&gt; 　0069FB64&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;E8 67060000&amp;nbsp;&amp;nbsp;call&amp;nbsp; &amp;nbsp; 006A01D0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; \封包加密函数 &lt;br /&gt; 4，好，我们在这个加密函数下个断。然后点击&amp;#8220;出征&amp;#8221;，断下来后执行到返回。可以看到调用它的CALL。 &lt;br /&gt; 　0069DD14&amp;nbsp;&amp;nbsp;.&amp;nbsp;&amp;nbsp;E8 471D0000&amp;nbsp;&amp;nbsp;call&amp;nbsp; &amp;nbsp; 0069FA60 &lt;br /&gt; 5，下断，再往回找，看到上一级的调用CALL。 &lt;br /&gt; 　0069DEFC&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;E8 BFFDFFFF&amp;nbsp;&amp;nbsp;call&amp;nbsp; &amp;nbsp; 0069DCC0 &lt;br /&gt; 6，下断，再往回找。 &lt;br /&gt; 　006DBDFB&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;FF50 0C&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;call&amp;nbsp; &amp;nbsp; [eax+C]&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; 7，下断，再找。 &lt;br /&gt; 　0065CB89&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;8B4D 08&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;mov&amp;nbsp; &amp;nbsp; ecx, [ebp+8] &lt;br /&gt; 　0065CB8C&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;33C0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; xor&amp;nbsp; &amp;nbsp; eax, eax &lt;br /&gt; 　0065CB8E&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;66:8B46 21&amp;nbsp; &amp;nbsp; mov&amp;nbsp; &amp;nbsp; ax, [esi+21] &lt;br /&gt; 　0065CB92&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;6A 32&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;push&amp;nbsp; &amp;nbsp; 32&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; /Arg3 = 00000032 &lt;br /&gt; 　0065CB94&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;50&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;push&amp;nbsp; &amp;nbsp; eax&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; |Arg2 &lt;br /&gt; 　0065CB95&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;51&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;push&amp;nbsp; &amp;nbsp; ecx&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; |Arg1 &lt;br /&gt; 　0065CB96&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;8D8D E4FBFFFF lea&amp;nbsp; &amp;nbsp; ecx, [ebp-41C]&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; | &lt;br /&gt; 　0065CB9C&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;C745 FC 00000&amp;gt;mov&amp;nbsp; &amp;nbsp; dword ptr [ebp-4], 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; | &lt;br /&gt; 　0065CBA3&amp;nbsp;&amp;nbsp;|.&amp;nbsp;&amp;nbsp;E8 88F10700&amp;nbsp;&amp;nbsp;call&amp;nbsp; &amp;nbsp; 006DBD30&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; ; \TheWarlo.006DBD30 &lt;br /&gt; 　8，再放上，是这里，看到红色这个CALL了吗，它就是&amp;#8220;出征&amp;#8221;的CALL了。 &lt;br /&gt; &lt;br /&gt; 004101B2 |. 83F8 14 cmp eax, 14 &lt;br /&gt; 004101B5 |. 8B45 08 mov eax, [ebp+8] &lt;br /&gt; 004101B8 |. 73 06 jnb short 004101C0 &lt;br /&gt; 004101BA |. 83F8 01 cmp eax, 1 &lt;br /&gt; 004101BD |. 7E 01 jle short 004101C0 &lt;br /&gt; 004101BF |. 48 dec eax &lt;br /&gt; 004101C0 |&amp;gt; 8B4486 04 mov eax, [esi+eax*4+4] &lt;br /&gt; 004101C4 |. B9 58E88000 mov ecx, 0080E858 &lt;br /&gt; 004101C9 |. 50 push eax ; /Arg1 &lt;br /&gt; 004101CA |. E8 81C82400 call 0065CA50 ; \TheWarlo.0065CA50 &lt;br /&gt; 004101CF |. 5E pop esi &lt;br /&gt; 004101D0 |. 5D pop ebp &lt;br /&gt; 004101D1 \. C2 0400 retn 4 &lt;br /&gt; 　9，再上就是GuiDll的领空了。 &lt;br /&gt; 　这两个都可以， &lt;br /&gt; 给大家这个例子，是想告诉大家，什么是BPSEND的原理，我的意思是如果你都分析不清楚一个游戏或程序的运行方法，那你无论如何是不可能找到这些的。当然，如果有别人给的一些实际操作的例子除外。 &lt;br /&gt; 好了，也差不了多少。也不知道我说的这些对大家有没有用，欢迎大家批评指正。  &lt;img src="http://www.cnblogs.com/mfm11111/aggbug/1845853.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/mfm11111/archive/2010/10/08/1845853.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2010/01/16/1649469.html</id><title type="text">做挂第一步:如何找基址(以热血传奇为例)</title><summary type="text">如何找热血传奇基址？一．首先打开游戏并使用CE加载游戏进度。二．在数值中输入血量值207,点击新的扫描，扫描类型选择精确数值，如图所示：为什么要输入207呢？这是指游戏中人物的当前血量，游戏中的任何数据都对应一个内存地址，所以此处我们可以找到血量207的内存地址。可以发现搜索出了一大堆，但是到底哪一个是我们需要的血值呢？所以我们还得构造一个条件，以方便准备的搜出血值。请看第三步3.进入游戏，打打怪...</summary><published>2010-01-16T08:43:00Z</published><updated>2010-01-16T08:43:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2010/01/16/1649469.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2010/01/16/1649469.html"/><content type="text">如何找热血传奇基址？一．首先打开游戏并使用CE加载游戏进度。二．在数值中输入血量值207,点击新的扫描，扫描类型选择精确数值，如图所示：为什么要输入207呢？这是指游戏中人物的当前血量，游戏中的任何数据都对应一个内存地址，所以此处我们可以找到血量207的内存地址。可以发现搜索出了一大堆，但是到底哪一个是我们需要的血值呢？所以我们还得构造一个条件，以方便准备的搜出血值。请看第三步3.进入游戏，打打怪...</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2009/12/31/1636924.html</id><title type="text">一步步学外挂(二).CALL的原理。</title><summary type="text">先谈下游戏，游戏每个动作都会调用函数。比方游戏设计人员是这样设计游戏的：void zhixing() //执行函数{dazuo();.......//@1}void dazuo() //打坐函数{jimi("...."); //加密函数return;}void jimi(char *s){//对s加密处理，赋值给str变量fashong(str); //发送函数 return;}void fash...</summary><published>2009-12-31T07:45:00Z</published><updated>2009-12-31T07:45:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2009/12/31/1636924.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2009/12/31/1636924.html"/><content type="text">先谈下游戏，游戏每个动作都会调用函数。比方游戏设计人员是这样设计游戏的：void zhixing() //执行函数{dazuo();.......//@1}void dazuo() //打坐函数{jimi("...."); //加密函数return;}void jimi(char *s){//对s加密处理，赋值给str变量fashong(str); //发送函数 return;}void fash...</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2009/08/16/1547424.html</id><title type="text">开发企业直销软件需求分析</title><summary type="text">待续......</summary><published>2009-08-16T09:26:00Z</published><updated>2009-08-16T09:26:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2009/08/16/1547424.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2009/08/16/1547424.html"/><content type="text">待续......</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html</id><title type="text">开发旺旺群发软件，难点及重要技术点分析（一）</title><summary type="text">开发旺旺群发软件，难点及重要技术点分析（一）一． 在C#中调用Win32函数EnumWindows枚举所有窗口。EnumWindows 函数通过借助于应用程序定义的回调函数传递每个窗口句柄枚举所有顶层的屏幕窗口。直到最后一个顶层窗口被枚举或者回调函数返回false ，EnumWindows 函数才会退出停止枚举过程。下面例子说明如何在 C# 中调用 Win32 API - EnumWindows ...</summary><published>2009-06-30T15:10:00Z</published><updated>2009-06-30T15:10:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html"/><content type="text">开发旺旺群发软件，难点及重要技术点分析（一）一． 在C#中调用Win32函数EnumWindows枚举所有窗口。EnumWindows 函数通过借助于应用程序定义的回调函数传递每个窗口句柄枚举所有顶层的屏幕窗口。直到最后一个顶层窗口被枚举或者回调函数返回false ，EnumWindows 函数才会退出停止枚举过程。下面例子说明如何在 C# 中调用 Win32 API - EnumWindows ...</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2009/06/28/1512705.html</id><title type="text">正则表达式系列文章整理</title><summary type="text">http://dragon.cnblogs.com/archive/2006/05/08/394078.html深入浅出之正则表达式（一）http://www.cnblogs.com/dragon/archive/2006/05/09/394923.html深入浅出之正则表达式（二）http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaoche...</summary><published>2009-06-28T06:01:00Z</published><updated>2009-06-28T06:01:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2009/06/28/1512705.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2009/06/28/1512705.html"/><content type="text">http://dragon.cnblogs.com/archive/2006/05/08/394078.html深入浅出之正则表达式（一）http://www.cnblogs.com/dragon/archive/2006/05/09/394923.html深入浅出之正则表达式（二）http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaoche...</content></entry><entry><id>http://www.cnblogs.com/mfm11111/archive/2009/06/27/1512468.html</id><title type="text">群发软件开发原理分析</title><summary type="text">http://www.kuqin.com/windows/20081226/32101.html 前言 不可否认，目前阿里旺旺垃圾消息还是比较多的。这个现状并不可怕，只要我们真正花时间和精力去解决，一定能大为改善。 知己知彼方能百战百胜，要解决垃圾消息的问题，必须要从以下方面入手分析： ◆垃圾消息发送的必要条件 ◆目前市面上的群发软件的工作原理 ◆我们的漏洞 &amp;...</summary><published>2009-06-27T15:38:00Z</published><updated>2009-06-27T15:38:00Z</updated><author><name>jasonM</name><uri>http://www.cnblogs.com/mfm11111/</uri></author><link rel="alternate" href="http://www.cnblogs.com/mfm11111/archive/2009/06/27/1512468.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/mfm11111/archive/2009/06/27/1512468.html"/><content type="text">http://www.kuqin.com/windows/20081226/32101.html 前言 不可否认，目前阿里旺旺垃圾消息还是比较多的。这个现状并不可怕，只要我们真正花时间和精力去解决，一定能大为改善。 知己知彼方能百战百胜，要解决垃圾消息的问题，必须要从以下方面入手分析： ◆垃圾消息发送的必要条件 ◆目前市面上的群发软件的工作原理 ◆我们的漏洞 &amp;...</content></entry></feed>
