﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-O型饭桶-随笔分类-Win32Asm</title><link>http://www.cppblog.com/oxft/category/10308.html</link><description>只发原创……</description><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2009 14:39:06 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2009 14:39:06 GMT</pubDate><ttl>60</ttl><item><title>给Windows的记事本添加上下翻页功能(1)[原创]</title><link>http://www.cppblog.com/oxft/archive/2009/04/21/80643.html</link><dc:creator>O型饭桶</dc:creator><author>O型饭桶</author><pubDate>Tue, 21 Apr 2009 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/oxft/archive/2009/04/21/80643.html</guid><wfw:comment>http://www.cppblog.com/oxft/comments/80643.html</wfw:comment><comments>http://www.cppblog.com/oxft/archive/2009/04/21/80643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oxft/comments/commentRss/80643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oxft/services/trackbacks/80643.html</trackback:ping><description><![CDATA[<p>出于无聊和记事本确实不怎么好用的目的，所以准备给记事本添加上下翻页的功能。<br></p>
<p>首先要做的事情就是修改程序入口点，这样一来才能优先获取程序的控制权，废话就不多说了。<br></p>
<p style="margin-left: 18pt; text-indent: -18pt;" class="MsoNormal"><!--[if !supportLists]-->1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->想要修改程序的入口点首先就要观察下程序员先的入口点在什么位置，这样一来等我们的处理完毕后还是要把控制权还给记事本，以免出现错误。</p>
<p style="margin-left: 21pt;" class="MsoNormal">用LoadPE看看记事本的一些信息</p>
<p style="margin-left: 21pt;" class="MsoNormal"><!--[if gte vml 1]><![endif]--><!--[if !vml]--><img src="http://pic002.cnblogs.com/img/osoft1983/200812/2008121809331050.jpg" alt=""><br><!--[endif]--></p>
<p style="margin-left: 18pt;" class="MsoNormal">从这里可以很清楚的发现磁盘文件入口在400偏移处而文件对齐是7800字节大小，实际使用的是7748字节大小，那么也就是说7800-7748=b8h空间可以供我们插入代码<br></p>
<p style="margin-left: 18pt; text-indent: -18pt;" class="MsoNormal"><!--[if !supportLists]-->2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->知道了即将插入代码的地方，那么就准备好机器码以便处理，这里我们先只修改程序入口，其余的操作以后再写。</p>
<p style="margin-left: 18pt;" class="MsoNormal"><!--[if gte vml 1]><![endif]--><!--[if !vml]--><img src="http://pic002.cnblogs.com/img/osoft1983/200812/2008121809341568.jpg" alt=""><br><!--[endif]--></p>
<p style="margin-left: 18pt;" class="MsoNormal">从这里我们可以看到程序原先的入口偏移地址在739dh处，也就是说我们做完自己的处理后要跳转到这里。</p>
<p style="margin-left: 18pt;" class="MsoNormal">B8 9D 73 00 01 ff E0</p>
<p style="margin-left: 18pt;" class="MsoNormal">这便是</p>
<p style="margin-left: 18pt;" class="MsoNormal">mov&nbsp; eax, 0100739dh</p>
<p style="margin-left: 18pt;" class="MsoNormal">jmp&nbsp;&nbsp; eax</p>
<p style="margin-left: 18pt;" class="MsoNormal">的机器码<br></p>
<p style="margin-left: 18pt; text-indent: -18pt;" class="MsoNormal"><!--[if !supportLists]-->3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->修改文件入口</p>
<p style="margin-left: 18pt;" class="MsoNormal">因为文件偏移地址为400h而实际使用的字节数为7748h那么也就是说我们要在 7b49h处插入我们的代码。(再声明一次，时间有限今天只能写修改入口，至于其他操作，后面有时间的时候再继续写)</p>
<p style="margin-left: 18pt;" class="MsoNormal">用UE打开notepade.exe，在空隙处插入我们新的入口代码</p>
<p style="margin-left: 18pt;" class="MsoNormal"><!--[if gte vml 1]><![endif]--><!--[if !vml]--><img src="http://pic002.cnblogs.com/img/osoft1983/200812/2008121809352040.jpg" alt=""><!--[endif]--><br></p>
<p style="margin-left: 18pt; text-indent: -18pt;" class="MsoNormal"><!--[if !supportLists]-->4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <!--[endif]-->修改程序入口点</p>
<p style="margin-left: 18pt;" class="MsoNormal">因为原先的代码段偏移地址为1000h，而实际.text节大小为7748那么也就是说新的程序入口应该是7748h+1000h=8749h</p>
<p style="margin-left: 18pt;" class="MsoNormal"><!--[if gte vml 1]><![endif]--><!--[if !vml]--><img src="http://pic002.cnblogs.com/img/osoft1983/200812/2008121809370573.jpg" alt=""><!--[endif]--></p>
<p style="margin-left: 18pt;" class="MsoNormal">修改完毕后点击Sava。</p>
<p style="margin-left: 18pt;" class="MsoNormal">再次运行notepad.exe</p>
<p style="margin-left: 18pt;" class="MsoNormal"><!--[if gte vml 1]><![endif]--><!--[if !vml]--><img src="http://pic002.cnblogs.com/img/osoft1983/200812/2008121809390149.jpg" alt=""><!--[endif]--></p>
<p style="margin-left: 18pt;" class="MsoNormal">没有任何异常，那么修改程序入口成功。<br></p>
<p style="margin-left: 18pt;" class="MsoNormal">当然你可能认为什么都还么做呢。呵呵，入口控制权被拿到了，那么接下来就可以自由发挥了。<br></p>
<p style="margin-left: 18pt;" class="MsoNormal">时间有限，下次将在今天修改的入口点给notepad.exe载入我们的dll文件，紧接着，用我们的dlll来处理记事本的翻页功能待续&#8230;</p>
<br><br><img src ="http://www.cppblog.com/oxft/aggbug/80643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oxft/" target="_blank">O型饭桶</a> 2009-04-21 22:03 <a href="http://www.cppblog.com/oxft/archive/2009/04/21/80643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>俄罗斯方块雏形[完成了移动、反转、叠加][原创]</title><link>http://www.cppblog.com/oxft/archive/2009/04/21/80586.html</link><dc:creator>O型饭桶</dc:creator><author>O型饭桶</author><pubDate>Tue, 21 Apr 2009 01:28:00 GMT</pubDate><guid>http://www.cppblog.com/oxft/archive/2009/04/21/80586.html</guid><wfw:comment>http://www.cppblog.com/oxft/comments/80586.html</wfw:comment><comments>http://www.cppblog.com/oxft/archive/2009/04/21/80586.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/oxft/comments/commentRss/80586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oxft/services/trackbacks/80586.html</trackback:ping><description><![CDATA[<img alt=""  src="http://images.cnblogs.com/cnblogs_com/originality/rgame.jpg"><br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>; 俄罗斯方块 by Originality<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>.386<br>.model flat, stdcall<br>option casemap : none<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>; Include 文件定义<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>include rgame.inc<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>; 代码段<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>&nbsp;&nbsp;&nbsp; .code<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>; 定时器测试<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>DwonTest proc _hWnd, _uMsg, _idEvent, _dwTime<br><br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, curState<br>&nbsp;&nbsp;&nbsp; .if&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;下落结束<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; curState, 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; InitControl1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; Control1Down<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .endif<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br><br>DwonTest endp<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>; 窗口过程<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>_ProcWinMain proc uses ebx edi esi hWnd, uMsg, wParam, lParam<br>&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;&nbsp; @stPs : PAINTSTRUCT<br>&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;&nbsp; @stRect : RECT<br>&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;&nbsp; @hDc<br><br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, uMsg<br>;********************************************************************<br>&nbsp;&nbsp;&nbsp; .if&nbsp;&nbsp;&nbsp; eax == WM_PAINT&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; BeginPaint, hWnd, addr @stPs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; InitContainer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; ShowControl, 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; Control1Down<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; EndPaint, hWnd, addr @stPs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; .elseif&nbsp;&nbsp;&nbsp; eax == WM_CREATE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; GetDC, hWnd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; hGame, eax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;【此处定时器为测试所用】<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SetTimer, NULL, NULL, 1000, offset DwonTest<br><br>&nbsp;&nbsp;&nbsp; .elseif&nbsp;&nbsp;&nbsp; eax == WM_CLOSE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; ReleaseDC, hWnd, hGame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; DestroyWindow, hWinMain<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; PostQuitMessage, NULL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .elseif&nbsp;&nbsp;&nbsp; eax == WM_SIZE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; ValidateRect, hWnd, offset gameArea<br><br>&nbsp;&nbsp;&nbsp; .else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; DefWindowProc, hWnd, uMsg, wParam, lParam<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .endif<br>;********************************************************************<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br><br>_ProcWinMain endp<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>_WinMain proc<br>&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;&nbsp; @stWndClass : WNDCLASSEX<br>&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;&nbsp; @stMsg : MSG<br><br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; GetModuleHandle, NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;获得应用程序实例<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; hInstance, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;实例保存在全局变量中<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; RtlZeroMemory, addr @stWndClass, sizeof @stWndClass&nbsp;&nbsp;&nbsp; ;以0填充WNDCLASSEX结构体<br><br>********************************************************************<br>; 注册窗口类<br>;********************************************************************<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; LoadCursor, 0, IDC_ARROW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;获取光标句柄<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @stWndClass.hCursor, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;设置光标&nbsp; <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; hInstance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; @stWndClass.hInstance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;保存应用程序实例<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @stWndClass.cbSize, sizeof WNDCLASSEX&nbsp;&nbsp;&nbsp; ;保存结构体大小<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @stWndClass.style, CS_HREDRAW or CS_VREDRAW&nbsp;&nbsp;&nbsp; ;设置窗体样式<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @stWndClass.lpfnWndProc, offset _ProcWinMain&nbsp;&nbsp;&nbsp; ;保存回调函数<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @stWndClass.hbrBackground, COLOR_WINDOW + 3&nbsp;&nbsp;&nbsp; ;设置窗体背景色<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @stWndClass.lpszClassName, offset szClassName&nbsp;&nbsp;&nbsp; ;保存窗体类名<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; RegisterClassEx, addr @stWndClass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;注册窗口类<br>;********************************************************************<br>; 建立并显示窗口<br>;********************************************************************<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; CreateWindowEx, WS_EX_TOOLWINDOW, offset szClassName, offset szCaptionMain,\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_OVERLAPPEDWINDOW,\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100, 100, 400, 456,\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, NULL, hInstance, NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;建立窗口<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; hWinMain, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;保存窗口句柄&nbsp; <br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; ShowWindow, hWinMain, SW_SHOWNORMAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;显示窗口<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; UpdateWindow, hWinMain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;更新窗口<br>;********************************************************************<br>; 消息循环<br>;********************************************************************<br>&nbsp;&nbsp;&nbsp; .while&nbsp;&nbsp;&nbsp; TRUE&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; GetMessage, addr @stMsg, NULL, 0, 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;获取消息并填充MSG结构体<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .break .if&nbsp;&nbsp;&nbsp; eax == 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;判断是否退出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; TranslateMessage, addr @stMsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;消息装换<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; DispatchMessage, addr @stMsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;分发消息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .endw<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br><br>_WinMain endp<br><br>;********************************************************************<br>; 初始化游戏容器<br>;********************************************************************<br>InitContainer proc<br>&nbsp;&nbsp;&nbsp; local @lpRect : RECT<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;建立游戏容器边框<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CreatePen, PS_SOLID, 5, 8000FFh<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SelectObject, hGame, eax<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; DeleteObject, eax<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; FrameRect, hGame, offset gameArea,&nbsp; eax<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br><br>InitContainer endp<br><br>;********************************************************************<br>; 显示方块控件<br>; type：控件类型1为4格横条，2为田字形，3..4..<br>;********************************************************************<br>ShowControl proc cType : DWORD<br><br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; .if&nbsp;&nbsp;&nbsp; cType == 1&nbsp;&nbsp;&nbsp; ;4格横条■■■■<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; InitControl1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .endif<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br>&nbsp; <br>ShowControl endp<br><br>;********************************************************************<br>; 初始化■■■■图形<br>;********************************************************************<br>InitControl1 proc<br><br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;设置方块颜色<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SetColor, 0FF80FFh, 400040h<br>&nbsp;&nbsp;&nbsp; ;创建方块并排列方块<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; ecx, 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;左上角起始位置<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edx, 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;右下角起始位置<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; esi, esi<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; ebx, curControl<br>@@:<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; ecx, 180<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp; @F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;4个方块都初始化完毕<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; Rectangle, hGame, ecx, 5, edx, 30<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; [ebx + esi], ecx<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; topSpace<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; DWORD ptr [ebx + esi + 4]<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; esi, 8<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; ecx, 30<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; edx, 30<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; @B<br>&nbsp; <br>@@:<br><br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br><br>InitControl1 endp<br><br>;********************************************************************<br>; 设置方块颜色<br>;********************************************************************<br>SetColor proc color : DWORD, pColor : DWORD<br><br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CreatePen, PS_SOLID, 1, pColor<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SelectObject, hGame, eax<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; DeleteObject, eax<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CreateSolidBrush, color<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SelectObject, hGame, eax<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; DeleteObject, eax<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br><br>SetColor endp<br><br>;********************************************************************<br>; ■■■■图形向下走动<br>;********************************************************************<br>Control1Down proc<br><br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; IsDownEnd<br>&nbsp;&nbsp;&nbsp; .if&nbsp;&nbsp;&nbsp;&nbsp; eax == 1&nbsp;&nbsp;&nbsp; ;下面有障碍，改变状态为创建新的方块并保存当前方块在容器中的位置<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; curState, 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; ChangeAreaState<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; RtlZeroMemory, offset curControl, sizeof curControl<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br><br>&nbsp;&nbsp;&nbsp; .endif&nbsp; <br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;如果下面不是障碍，则■■■■向下走动<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; edx, curControl<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; ecx, ecx<br>@@:<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; ecx, 4<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp; @F<br>&nbsp;&nbsp;&nbsp; ;覆盖原有的方块<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SetColor, 0h, 0h<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, [edx + ecx * 8 + 4]<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; ebx, 30<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; ebx, eax&nbsp;&nbsp;&nbsp; ;ebx右下角y坐标<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, [edx + ecx * 8]<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; eax, 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax为右下角x坐标<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;保存右下角坐标<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; Rectangle, hGame, [edx + ecx * 8], [edx + ecx * 8 + 4], eax, ebx<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; edx<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;生成新的方块<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; SetColor, 0FF80FFh, 400040h<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; ecx&nbsp; <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; DWORD ptr [edx + ecx * 8 + 4], 30<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; ebx, 30<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; Rectangle, hGame, [edx + ecx * 8], [edx + ecx * 8 + 4], eax, ebx<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; @B<br>@@:<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br><br>Control1Down endp<br><br>;********************************************************************<br>; 保存当前方块在容器中的状态<br>;********************************************************************<br>ChangeAreaState proc<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;计算区域单元坐标<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; ebx, curControl<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; ecx, ecx<br>@@:<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; ecx, 4<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp; @F<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;计算二维x坐标<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 1<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; esi, eax<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;计算二维y坐标<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 2<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edi, eax<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; ;设置区域更新，更新的坐标位置（eax + esi * 4 * 8 + edi * 4）<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; eax, area<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp;&nbsp; edi, eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edi, 8<br>&nbsp;&nbsp;&nbsp; mul&nbsp;&nbsp;&nbsp; edi<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; esi, eax<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; DWORD ptr [eax + esi * 4], 1&nbsp;&nbsp;&nbsp; ;设置当前位置已经被填充<br>&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; @B<br>@@:&nbsp; <br><br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; ret<br>&nbsp; <br>ChangeAreaState endp<br><br>;********************************************************************<br>; 根据顶角计算二维坐标<br>; left, top：顶角像素<br>; posType：1表示计算x坐标，2表示计算y坐标<br>; eax返回二维坐标<br>;********************************************************************<br>CalculatePos proc left : DWORD, top :DWORD, posType : DWORD<br>&nbsp;&nbsp;&nbsp; local @ret : DWORD<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edx, left&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; edx, rectArea ;右下角x坐标<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; ecx, top<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; ecx, rectArea ;右下角y坐标<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .if&nbsp;&nbsp;&nbsp; posType == 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, edx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; ebx, 30<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; edx, edx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div&nbsp;&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .elseif<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, ecx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp; eax, topSpace<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; ecx, 30<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; edx, edx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .endif<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; @ret, eax<br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, @ret<br>&nbsp;&nbsp;&nbsp; dec&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; ret<br><br>CalculatePos endp<br><br>;********************************************************************<br>; 判断下面是否有障碍<br>; 返回值:：eax为1表示下落完毕，为0表示未完毕<br>;********************************************************************<br>IsDownEnd proc<br><br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; ebx, curControl<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; ecx, ecx<br>@@:<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; ecx, 4<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp; @F<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;计算二维x坐标<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 1<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; esi, eax<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;计算二维y坐标<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp; CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 2<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edi, eax<br>&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp; edi<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;设置区域更新，更新的坐标位置（eax + esi * 4 * 8 + edi * 4）<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; eax, area<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp;&nbsp; edi, eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edi, 8<br>&nbsp;&nbsp;&nbsp; mul&nbsp;&nbsp;&nbsp; edi<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; esi, eax<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; edx, [eax + esi * 4]<br>&nbsp;&nbsp;&nbsp; .if&nbsp;&nbsp;&nbsp; edx == 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; .endif<br>&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp; ecx<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp; @B<br>@@:&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; ret<br><br>IsDownEnd endp<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>start:<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp; _WinMain<br>&nbsp;&nbsp;&nbsp; invoke&nbsp;&nbsp;&nbsp;&nbsp; ExitProcess, NULL<br>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>end start&nbsp; <br><br><br><br><img src ="http://www.cppblog.com/oxft/aggbug/80586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oxft/" target="_blank">O型饭桶</a> 2009-04-21 09:28 <a href="http://www.cppblog.com/oxft/archive/2009/04/21/80586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单keygen制作[原创]</title><link>http://www.cppblog.com/oxft/archive/2009/04/20/80574.html</link><dc:creator>O型饭桶</dc:creator><author>O型饭桶</author><pubDate>Mon, 20 Apr 2009 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/oxft/archive/2009/04/20/80574.html</guid><wfw:comment>http://www.cppblog.com/oxft/comments/80574.html</wfw:comment><comments>http://www.cppblog.com/oxft/archive/2009/04/20/80574.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/oxft/comments/commentRss/80574.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oxft/services/trackbacks/80574.html</trackback:ping><description><![CDATA[举个简单的例子说明下，以下就是软件的注册码关键代码，根据其生成注册码的函数，分析其思路，写出相应的程序生成注册码即可。<br><br>004011AE . 6A 51 PUSH 51 ; /Count = 51 (81.)<br>004011B0 . 50 PUSH EAX ; |Buffer<br>004011B1 . 6A 6E PUSH 6E ; |ControlID = 6E (110.)<br>004011B3 . 56 PUSH ESI ; |hWnd<br>004011B4 . FFD7 CALL EDI ; \GetDlgItemTextA<br>004011B6 . 8D8C24 9C0000&gt;LEA ECX,DWORD PTR SS:[ESP+9C]<br>004011BD . 6A 65 PUSH 65 ; /Count = 65 (101.)<br>004011BF . 51 PUSH ECX ; |Buffer<br>004011C0 . 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.)<br>004011C5 . 56 PUSH ESI ; |hWnd<br>004011C6 . 8BD8 MOV EBX,EAX ; |EBX存放用户名的长度<br>004011C8 . FFD7 CALL EDI ; \GetDlgItemTextA<br>004011CA . 8A4424 4C MOV AL,BYTE PTR SS:[ESP+4C]<br>004011CE . 84C0 TEST AL,AL ; 是否结束<br>004011D0 . 74 76 JE SHORT TraceMe.00401248<br>004011D2 . 83FB 05 CMP EBX,5<br>004011D5 . 7C 71 JL SHORT TraceMe.00401248 ; 如果用户名长度小于5，跳<br>004011D7 . 8D5424 4C LEA EDX,DWORD PTR SS:[ESP+4C] ; EDX指向用户名<br>004011DB . 53 PUSH EBX ; 用户名长度<br>004011DC . 8D8424 A00000&gt;LEA EAX,DWORD PTR SS:[ESP+A0]<br>004011E3 . 52 PUSH EDX ; 用户名<br>004011E4 . 50 PUSH EAX ; key<br>004011E5 . E8 56010000 CALL TraceMe.00401340 ; 判断注册码是否正确，有三个参数[输入key，用户名，用户名长度]<br>&nbsp;<br>思路：<br>从用户名的第4个字符开始分别与全局的一个长度为7的标识相乘最后和就为key<br>--注册码部分--<br>00401340 /$ 55 PUSH EBP ; 保存EBP<br>00401341 |. 8B6C24 0C MOV EBP,DWORD PTR SS:[ESP+C] ; 获取第2个参数，用户名<br>00401345 |. 56 PUSH ESI ; 保护ESI,EDI<br>00401346 |. 57 PUSH EDI<br>00401347 |. 8B7C24 18 MOV EDI,DWORD PTR SS:[ESP+18] ; 取第一个参数，用户名长度<br>0040134B |. B9 03000000 MOV ECX,3<br>00401350 |. 33F6 XOR ESI,ESI<br>00401352 |. 33C0 XOR EAX,EAX<br>00401354 |. 3BF9 CMP EDI,ECX<br>00401356 |. 7E 21 JLE SHORT TraceMe.00401379 ; 如果用户名长度小于等于3，跳<br>00401358 |. 53 PUSH EBX<br>00401359 |&gt; 83F8 07 /CMP EAX,7<br>0040135C |. 7E 02 |JLE SHORT TraceMe.00401360 ; 如果EAX小于等于7，跳<br>0040135E |. 33C0 |XOR EAX,EAX<br>00401360 |&gt; 33D2 |XOR EDX,EDX<br>00401362 |. 33DB |XOR EBX,EBX<br>00401364 |. 8A1429 |MOV DL,BYTE PTR DS:[ECX+EBP] ; DL存放从用户名中取出的第ECX字符<br>00401367 |. 8A98 30504000 |MOV BL,BYTE PTR DS:[EAX+405030] ; BL存放某个全局变量<br>0040136D |. 0FAFD3 |IMUL EDX,EBX ; 某个用户名&#215;全局变量C<br>00401370 |. 03F2 |ADD ESI,EDX ; ESI似乎是这些值的统计<br>00401372 |. 41 |INC ECX<br>00401373 |. 40 |INC EAX<br>00401374 |. 3BCF |CMP ECX,EDI ; 如果ECX小于用户名的长度则继续循环<br>00401376 |.^ 7C E1 \JL SHORT TraceMe.00401359<br>00401378 |. 5B POP EBX ; 还原EBX，不需要使用了<br>00401379 |&gt; 56 PUSH ESI ; /&lt;%ld&gt;<br>0040137A |. 68 78504000 PUSH TraceMe.00405078 ; |Format = "%ld"<br>0040137F |. 55 PUSH EBP ; |s<br>00401380 |. FF15 9C404000 CALL DWORD PTR DS:[&lt;&amp;USER32.wsprintfA&gt;] ; \wsprintfA<br>00401386 |. 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]<br>0040138A |. 83C4 0C ADD ESP,0C ; C调用方式<br>0040138D |. 55 PUSH EBP ; /String2<br>0040138E |. 50 PUSH EAX ; |String1<br>0040138F |. FF15 04404000 CALL DWORD PTR DS:[&lt;&amp;KERNEL32.lstrcmpA&gt;] ; \lstrcmpA<br>00401395 |. F7D8 NEG EAX<br>00401397 |. 1BC0 SBB EAX,EAX<br>00401399 |. 5F POP EDI<br>0040139A |. 5E POP ESI<br>0040139B |. 40 INC EAX<br>0040139C |. 5D POP EBP<br>0040139D \. C3 RETN<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;GetKey(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;userName,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;userNameLength)<br>{<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;ecx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;eax&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;flag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0x0C</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0A</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x13</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x09</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0C</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0B</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0A</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x08</span><span style="color: #000000;">};<br></span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(ecx&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;userNameLength)<br>{<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(eax&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;flag.Length)<br>eax&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;eax&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;flag.Length;<br>sum&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;userName[ecx]&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;flag[eax];<br>ecx</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>eax</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>}<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;sum.ToString();<br>}</span></div>
<br><img src ="http://www.cppblog.com/oxft/aggbug/80574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oxft/" target="_blank">O型饭桶</a> 2009-04-20 22:17 <a href="http://www.cppblog.com/oxft/archive/2009/04/20/80574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC42.#823函数到底有什么作用[原创]</title><link>http://www.cppblog.com/oxft/archive/2009/04/20/80573.html</link><dc:creator>O型饭桶</dc:creator><author>O型饭桶</author><pubDate>Mon, 20 Apr 2009 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/oxft/archive/2009/04/20/80573.html</guid><wfw:comment>http://www.cppblog.com/oxft/comments/80573.html</wfw:comment><comments>http://www.cppblog.com/oxft/archive/2009/04/20/80573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oxft/comments/commentRss/80573.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oxft/services/trackbacks/80573.html</trackback:ping><description><![CDATA[<p>由于多次跟踪程序的时候碰到了，一直没怎么理会，今天出于好奇，进去逛了下。。。很简单，原来就是分配内存。</p>
<p>注释写的很清楚，而且很简单，所以不多做解释了。</p>
<p>6E26152C &gt;&nbsp; 8BFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV EDI,EDI<br>6E26152E&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EBP<br>6E26152F&nbsp;&nbsp;&nbsp; 8BEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV EBP,ESP<br>6E261531&nbsp;&nbsp;&nbsp; 53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EBX<br>6E261532&nbsp;&nbsp;&nbsp; 8B5D 08&nbsp;&nbsp;&nbsp;&nbsp; MOV EBX,DWORD PTR SS:[EBP+8]&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; ; EBX为第一个参数<br>6E261535&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH ESI<br>6E261536&nbsp;&nbsp;&nbsp; 57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EDI<br>6E261537&nbsp;&nbsp;&nbsp; 53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH EBX<br>6E261538&nbsp;&nbsp;&nbsp; 83CF FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR EDI,FFFFFFFF&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; ; EDI=-1<br>6E26153B&nbsp;&nbsp;&nbsp; FF15 6C10256E&nbsp;&nbsp; CALL DWORD PTR DS:[&lt;&amp;msvcrt.malloc&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; msvcrt.malloc<br>6E261541&nbsp;&nbsp;&nbsp; 8BF0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV ESI,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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ESI保存内存指针<br>6E261543&nbsp;&nbsp;&nbsp; 83C4 04&nbsp;&nbsp;&nbsp;&nbsp; ADD ESP,4&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 堆栈平衡<br>6E261546&nbsp;&nbsp;&nbsp; 85F6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TEST ESI,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;&nbsp;&nbsp;&nbsp; ; 判断分配是否成功<br>6E261548&nbsp;&nbsp;&nbsp; 0F84 9E1E0000&nbsp;&nbsp; JE MFC42.6E2633EC&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>6E26154E&nbsp;&nbsp;&nbsp; 5F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POP 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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 从这里可以看出6E261537H地址处的PUSH为传参而不是寄存器保护<br>6E26154F&nbsp;&nbsp;&nbsp; 8BC6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOV EAX,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;&nbsp;&nbsp;&nbsp;&nbsp; ; 到了这里也就知道了MFC42.#823号函数主要就是分配内存的作用<br>6E261551&nbsp;&nbsp;&nbsp; 5E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POP ESI<br>6E261552&nbsp;&nbsp;&nbsp; 5B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POP EBX<br>6E261553&nbsp;&nbsp;&nbsp; 5D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POP EBP<br>6E261554&nbsp;&nbsp;&nbsp; C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RETN</p><img src ="http://www.cppblog.com/oxft/aggbug/80573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oxft/" target="_blank">O型饭桶</a> 2009-04-20 22:15 <a href="http://www.cppblog.com/oxft/archive/2009/04/20/80573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>