<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[Gmxpsoft.com - 开发应用]]></title>
<link>http://www.gmxpsoft.com/</link>
<description><![CDATA[不经历风雨,怎能见彩虹]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[gmxp@gmxpsoft.com(Gmxp)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>Gmxpsoft.com</title>
	<url>http://www.gmxpsoft.com/images/logos.gif</url>
	<link>http://www.gmxpsoft.com/</link>
	<description>Gmxpsoft.com</description>
</image>

			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=45</link>
			<title><![CDATA[郁闷的数据包接收问题]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Fri,09 Jan 2009 01:29:00 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=45</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天写好框架的NDIS协议驱动，不管我怎么处理，就是死活收不到下层网卡的数据包。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个东东折磨了我整整一天，让人郁闷的是这个问题本来不应该是问题的。下面贴出相关DDK的文档，标记一下，更希望遇到和我同样的朋友早点解脱。囧。<br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent"><br/><strong>Restrictions on Indicating Receive Packets </strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A connectionless miniport driver must not indicate a receive packet to a protocol driver while the miniport driver’s packet filter for that protocol driver is set to zero. When a miniport driver’s MiniportInitialize function is called, the miniport driver’s packet filter should be set to zero. When the packet filter is zero, receive indications are disabled. After a miniport driver’s MiniportInitialize function has returned, a protocol driver can set OID_GEN_CURRENT_PACKET_FILTER to a nonzero value, thereby enabling the miniport driver to indicate receive packets to that protocol.<br/>......<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A driver’s Protocol(Co)ReceivePacket o&#114; ProtocolReceive function can be called as soon as the protocol sets up a packet filter with OID_GEN_CURRENT_PACKET_FILTER for the binding. For the NULL filter, receive indications are enabled on return from a successful call to NdisOpenAdapter. <br/></div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;翻译成中文，大概就是在绑定完下层网卡后，必须向它发送一个OID_GEN_CURRENT_PACKET_FILTER的Request来指定要接收的数据包的类型，而不发送Request的话，默认是不接收任何数据包。自己向下层网卡正确发送完Request后，就可以收到你想要的数据包了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;让人很郁闷的是，对于协议驱动这么重要的步骤，DDK中仅仅在一个“很角落”的地方提到，而我正在看的网络驱动的那本书更是只字不提，把WinPcap的协议驱动翻了个遍也没有特别提及，网络上更加没有相关消息，似乎大家都认为只要绑定网卡成功就能收到数据了。]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=44</link>
			<title><![CDATA[Dr.COM密码查看器]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Sat,03 Jan 2009 21:41:06 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=44</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天下午看书时看到网络嗅探器的章节，突然想到很久前想就想搞的Dr.COM的账号和密码，研究了一个下午，总算有点成绩：<br/><br/><div align="center"><img src="http://www.gmxpsoft.com/attachments/Images/result.png" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Dr.COM 3.481 + Windows XP SP3下测试通过，其他的版本估计也差不多。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不过，代码不能贴，bin不能放，思路不能说，就贴张图留下自己逆向工程学习过程中的一点脚印而已。这么做是有原因的，望大家理解~]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=5</link>
			<title><![CDATA[逆向工程笔记4]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Wed,05 Nov 2008 01:24:30 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=5</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我一直都认为逆向这个东西是一个高手功力的体现，不可以投机，只可以在无数次的逆向过程中积累。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;初学IDA，今天便拿来逆向分析了一段经典代码，最近刚好要用到的NtCr&#101;ateSection。差太远了，差太远了，错误很多，很多细节都被我忽略了，哎，继续努力把。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 我逆向分析得出的代码 --<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/><span style="color:#000000">NTSTATUS <br/>__stdcall <br/>NtCr&#101;ateSection[color=#0000ff](</span>PHANDLE SectionHandle<span style="color:#0000ff">,</span> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACCESS_MASK DesiredAccess<span style="color:#0000ff">,</span> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POBJECT_ATTRIBUTES ObjectAttributes<span style="color:#0000ff">,</span> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PLARGE_INTEGER SectionSize<span style="color:#0000ff">,</span> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ULONG Protect<span style="color:#0000ff">,</span> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ULONG Attributes<span style="color:#0000ff">,</span> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HANDLE FileHandle<span style="color:#0000ff">)</span><br/><span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NTSTATUS status <span style="color:#0000ff">=</span> 0<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PFILE_OBJECT FileObject<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#ff8000"><strong>int</strong></span> var_1C<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#ff8000"><strong>int</strong></span> var_20<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#ff8000"><strong>int</strong></span> var_24<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#ff8000"><strong>int</strong></span> var_34<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>Attributes <span style="color:#0000ff">&amp;</span> 0E29FFFFFh<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">!</span><span style="color:#0000ff">(</span>Attributes <span style="color:#0000ff">&amp;</span> 0D000000h<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">!</span><span style="color:#0000ff">(</span>Attributes <span style="color:#0000ff">&amp;</span> 1000000h<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>Attributes <span style="color:#0000ff">&amp;</span> 1C400000h<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>Attributes <span style="color:#0000ff">&amp;</span> 8000000h<span style="color:#0000ff">)</span> <span style="color:#0000ff">&amp;</span><span style="color:#0000ff">&amp;</span> <span style="color:#0000ff">(</span>Attributes <span style="color:#0000ff">&amp;</span> 8000000h<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>Protect <span style="color:#0000ff">&lt;</span> PAGE_EXECUTE_READWRITE<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PAGE_PROTECTION<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>UserMode <span style="color:#0000ff">=</span><span style="color:#0000ff">=</span> KeGetPreviousMode<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>try</strong></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MmUserProbeAddress<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#008080">//这里不是太懂</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except <span style="color:#0000ff">(</span>EXCEPTION_EXECUTE_HANDLER<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>return</strong></span> GetExceptionCode<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var_1C <span style="color:#0000ff">=</span> 0<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>while</strong></span> <span style="color:#0000ff">(</span>true<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status <span style="color:#0000ff">=</span> MmCr&#101;ateSection<span style="color:#0000ff">(</span><span style="color:#0000ff">&amp;</span>var_24<span style="color:#0000ff">,</span> DesiredAccess<span style="color:#0000ff">,</span> ObjectAttributes<span style="color:#0000ff">,</span> <span style="color:#0000ff">&amp;</span>var_34<span style="color:#0000ff">,</span> Protect<span style="color:#0000ff">,</span> Attributes<span style="color:#0000ff">,</span> FileHandle<span style="color:#0000ff">,</span> 0<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>status <span style="color:#0000ff">&gt;</span> 0<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>STATUS_FILE_LOCK_CONFLICT <span style="color:#0000ff">=</span><span style="color:#0000ff">=</span> status<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeDelayExecutionThread<span style="color:#0000ff">(</span>0<span style="color:#0000ff">,</span> 0<span style="color:#0000ff">,</span> MmHalfSecond<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>continue</strong></span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>else</strong></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> status<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>else</strong></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>break</strong></span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>0 <span style="color:#0000ff">!</span><span style="color:#0000ff">=</span> <span style="color:#0000ff">*</span><span style="color:#0000ff">(</span><span style="color:#0000ff">&amp;</span>var_24 <span style="color:#0000ff">+</span> 14h<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileObject <span style="color:#0000ff">=</span> <span style="color:#0000ff">*</span><span style="color:#0000ff">(</span><span style="color:#0000ff">*</span><span style="color:#0000ff">(</span><span style="color:#0000ff">&amp;</span>var_24 <span style="color:#0000ff">+</span> 14h<span style="color:#0000ff">)</span> <span style="color:#0000ff">+</span> 24h<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>NULL <span style="color:#0000ff">!</span><span style="color:#0000ff">=</span> FileObject<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CcZeroEndOfLastPage<span style="color:#0000ff">(</span>FileObject<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status <span style="color:#0000ff">=</span> ObIns&#101;rtObject<span style="color:#0000ff">(</span>var_24<span style="color:#0000ff">,</span> 0<span style="color:#0000ff">,</span> DesiredAccess<span style="color:#0000ff">,</span> 0<span style="color:#0000ff">,</span> 0<span style="color:#0000ff">,</span> <span style="color:#0000ff">&amp;</span>var_20<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>status <span style="color:#0000ff">&gt;</span> 0<span style="color:#0000ff">)</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> status<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">*</span>SectionHandle <span style="color:#0000ff">=</span> var_20<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#800000"><strong>return</strong></span> status<span style="color:#0000ff">;</span><br/><span style="color:#0000ff">}</span><br/></div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- WRK 1.2 中提供的代码 –<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/><span style="color:#000000">NTSTATUS<br/>NtCr&#101;ateSection [color=#0000ff](</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__out PHANDLE SectionHandle<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__in ACCESS_MASK DesiredAccess<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__in_opt POBJECT_ATTRIBUTES ObjectAttributes<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__in_opt PLARGE_INTEGER MaximumSize<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__in ULONG SectionPageProtection<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__in ULONG AllocationAttributes<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;__in_opt HANDLE FileHandle<br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">)</span><br/><span style="color:#008080">/*++<br/>Routine Description:<br/>&nbsp;&nbsp;&nbsp;&nbsp;This function cr&#101;ates a section object and opens a handle to the object<br/>&nbsp;&nbsp;&nbsp;&nbsp;with the specified desired access.<br/><br/>Arguments:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;SectionHandle - A pointer to a variable that will<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receive the section object handle value.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;DesiredAccess - The desired types of access for the section.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;DesiredAccess Flags<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXECUTE - Execute access to the section is desired.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; READ - Read access to the section is desired.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WRITE - Write access to the section is desired.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ObjectAttributes - Supplies a pointer to an object attributes structure.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;MaximumSize - Supplies the maximum size of the section in bytes.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This value is rounded up to the host page size and<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;specifies the size of the section (page file<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backed section) o&#114; the maximum size to which a<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file can be extended o&#114; mapped (file backed<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;section).<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;SectionPageProtection - Supplies the protection to place on each page<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in the section.&nbsp;&nbsp;One of PAGE_READ, PAGE_READWRITE,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAGE_EXECUTE, o&#114; PAGE_WRITECOPY and, optionally,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAGE_NOCACHE o&#114; PAGE_WRITECOMBINE<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;may be specified.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;AllocationAttributes - Supplies a set of flags that describe the<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allocation attributes of the section.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AllocationAttributes Flags<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_BASED - The section is a based section and will be<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocated at the same virtual address in each process<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address space that receives the section.&nbsp;&nbsp;This does not<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imply that addresses are reserved for based sections.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rather if the section cannot be mapped at the based address<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an error is returned.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_RESERVE - All pages of the section are set to the reserved state.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_COMMIT - All pages of the section are set to the commit state.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_IMAGE - The file specified by the file handle is an<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executable image file.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_FILE - The file specified by the file handle is a mapped<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file.&nbsp;&nbsp;If a file handle is supplied and neither<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEC_IMAGE o&#114; SEC_FILE is supplied, SEC_FILE is<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assumed.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_NO_CHANGE - Once the file is mapped, the protection cannot<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be changed nor can the view be unmapped.&nbsp;&nbsp;The<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view is unmapped when the process is del&#101;ted.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cannot be used with SEC_IMAGE.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_LARGE_PAGES - The section will be cr&#101;ated using large pages.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This physical memory is allocated immediately upon<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;section creation (instead of upon access).&nbsp;&nbsp;If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contiguous physical memory for the large page(s)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cannot be found, then the section creation will fail<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(rather than use small pages).<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Since this physical memory is allocated up front and<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is nonpaged (to ensure it remains physically<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contiguous and in a large page), privilege is<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required.&nbsp;&nbsp;Since section mappers can extend the<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;section life indefinitely, section creators should<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ensure proper access permissions are used.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note subsequent mapped views must specify a large<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page aligned start address and length (or must<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;have available virtual space so the system can find<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one) for them to automatically receive large page(s)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for the view.&nbsp;&nbsp;Callers of the map APIs do not need<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to specify large pages - the system will automatically<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;provide the mapping in large pages (assuming<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;satisfactory alignment) o&#114; small pages if not.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;FileHandle - Supplies an optional handle of an open file object.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If the value of this handle is NULL, then the<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; section will be backed by a paging file.&nbsp;&nbsp;Otherwise<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the section is backed by the specified data file.<br/><br/>Return Value:<br/>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS.<br/>--*/</span><br/><span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS Status<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;PVOID Section<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE Handle<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER LargeSize<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER CapturedSize<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;ULONG RetryCount<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;PCONTROL_AREA ControlArea<span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>AllocationAttributes <span style="color:#0000ff">&amp;</span> <span style="color:#0000ff">~</span><span style="color:#0000ff">(</span>SEC_COMMIT <span style="color:#0000ff">|</span> SEC_RESERVE <span style="color:#0000ff">|</span> SEC_BASED <span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_LARGE_PAGES <span style="color:#0000ff">|</span> SEC_IMAGE <span style="color:#0000ff">|</span> SEC_NOCACHE <span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_NO_CHANGE<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">!</span><span style="color:#0000ff">=</span> 0<span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>AllocationAttributes <span style="color:#0000ff">&amp;</span> <span style="color:#0000ff">(</span>SEC_COMMIT <span style="color:#0000ff">|</span> SEC_RESERVE <span style="color:#0000ff">|</span> SEC_IMAGE<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">=</span><span style="color:#0000ff">=</span> 0<span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>AllocationAttributes <span style="color:#0000ff">&amp;</span> SEC_IMAGE<span style="color:#0000ff">)</span> <span style="color:#0000ff">&amp;</span><span style="color:#0000ff">&amp;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>AllocationAttributes <span style="color:#0000ff">&amp;</span> <span style="color:#0000ff">(</span>SEC_COMMIT <span style="color:#0000ff">|</span> SEC_RESERVE <span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_LARGE_PAGES <span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_NOCACHE <span style="color:#0000ff">|</span> SEC_NO_CHANGE<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>AllocationAttributes <span style="color:#0000ff">&amp;</span> SEC_COMMIT<span style="color:#0000ff">)</span> <span style="color:#0000ff">&amp;</span><span style="color:#0000ff">&amp;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>AllocationAttributes <span style="color:#0000ff">&amp;</span> SEC_RESERVE<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PARAMETER_6<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// Check the SectionProtection Flag.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>SectionPageProtection <span style="color:#0000ff">&amp;</span> PAGE_NOCACHE<span style="color:#0000ff">)</span> <span style="color:#0000ff">|</span><span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>SectionPageProtection <span style="color:#0000ff">&amp;</span> PAGE_WRITECOMBINE<span style="color:#0000ff">)</span> <span style="color:#0000ff">|</span><span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>SectionPageProtection <span style="color:#0000ff">&amp;</span> PAGE_GUARD<span style="color:#0000ff">)</span> <span style="color:#0000ff">|</span><span style="color:#0000ff">|</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>SectionPageProtection <span style="color:#0000ff">&amp;</span> PAGE_NOACCESS<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// No cache is only specified through the SEC_NOCACHE</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// option in the allocation attributes.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> STATUS_INVALID_PAGE_PROTECTION<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>KeGetPreviousMode<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">!</span><span style="color:#0000ff">=</span> KernelMode<span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>try</strong></span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProbeForWriteHandle<span style="color:#0000ff">(</span>SectionHandle<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>ARGUMENT_PRESENT <span style="color:#0000ff">(</span>MaximumSize<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/><span style="color:#008000"><strong>#if</strong></span> <span style="color:#0000ff">!</span><span style="color:#008000"><strong>defined</strong></span> <span style="color:#0000ff">(</span>_WIN64<span style="color:#0000ff">)</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// Note we only probe for byte alignment because prior to 2195,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// we never probed at all!&nbsp;&nbsp;We don&#34;t want to break user apps</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// that had bad alignment if they worked before.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProbeForReadSmallStructure<span style="color:#0000ff">(</span>MaximumSize<span style="color:#0000ff">,</span> <span style="color:#800000"><strong>sizeof</strong></span><span style="color:#0000ff">(</span>LARGE_INTEGER<span style="color:#0000ff">)</span><span style="color:#0000ff">,</span> <span style="color:#800000"><strong>sizeof</strong></span><span style="color:#0000ff">(</span>UCHAR<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/><span style="color:#008000"><strong>#else</strong></span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProbeForReadSmallStructure<span style="color:#0000ff">(</span>MaximumSize<span style="color:#0000ff">,</span> <span style="color:#800000"><strong>sizeof</strong></span><span style="color:#0000ff">(</span>LARGE_INTEGER<span style="color:#0000ff">)</span><span style="color:#0000ff">,</span> PROBE_ALIGNMENT <span style="color:#0000ff">(</span>LARGE_INTEGER<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/><br/><span style="color:#008000"><strong>#endif</strong></span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LargeSize <span style="color:#0000ff">=</span> <span style="color:#0000ff">*</span>MaximumSize<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>else</strong></span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZERO_LARGE <span style="color:#0000ff">(</span>LargeSize<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span> except <span style="color:#0000ff">(</span>EXCEPTION_EXECUTE_HANDLER<span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> GetExceptionCode<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>else</strong></span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>ARGUMENT_PRESENT <span style="color:#0000ff">(</span>MaximumSize<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LargeSize <span style="color:#0000ff">=</span> <span style="color:#0000ff">*</span>MaximumSize<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>else</strong></span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZERO_LARGE <span style="color:#0000ff">(</span>LargeSize<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;RetryCount <span style="color:#0000ff">=</span> 0<span style="color:#0000ff">;</span><br/><br/>retry<span style="color:#0000ff">:</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;CapturedSize <span style="color:#0000ff">=</span> LargeSize<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT <span style="color:#0000ff">(</span>KeGetCurrentIrql<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">&lt;</span> DISPATCH_LEVEL<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;Status <span style="color:#0000ff">=</span> MmCr&#101;ateSection <span style="color:#0000ff">(</span><span style="color:#0000ff">&amp;</span>Section<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DesiredAccess<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectAttributes<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">&amp;</span>CapturedSize<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SectionPageProtection<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AllocationAttributes<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileHandle<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT <span style="color:#0000ff">(</span>KeGetCurrentIrql<span style="color:#0000ff">(</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">&lt;</span> DISPATCH_LEVEL<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">!</span>NT_SUCCESS<span style="color:#0000ff">(</span>Status<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>Status <span style="color:#0000ff">=</span><span style="color:#0000ff">=</span> STATUS_FILE_LOCK_CONFLICT<span style="color:#0000ff">)</span> <span style="color:#0000ff">&amp;</span><span style="color:#0000ff">&amp;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>RetryCount <span style="color:#0000ff">&lt;</span> 3<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// The file system may have prevented this from working</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// due to log file flushing.&nbsp;&nbsp;Delay and try again.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RetryCount <span style="color:#0000ff">+</span><span style="color:#0000ff">=</span> 1<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeDelayExecutionThread <span style="color:#0000ff">(</span>KernelMode<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">(</span>PLARGE_INTEGER<span style="color:#0000ff">)</span><span style="color:#0000ff">&amp;</span>MmHalfSecond<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>goto</strong></span> retry<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> Status<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ControlArea <span style="color:#0000ff">=</span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>PSECTION<span style="color:#0000ff">)</span>Section<span style="color:#0000ff">)</span><span style="color:#0000ff">-</span><span style="color:#0000ff">&gt;</span>Segment<span style="color:#0000ff">-</span><span style="color:#0000ff">&gt;</span>ControlArea<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span><span style="color:#0000ff">(</span>ControlArea <span style="color:#0000ff">!</span><span style="color:#0000ff">=</span> NULL<span style="color:#0000ff">)</span> <span style="color:#0000ff">&amp;</span><span style="color:#0000ff">&amp;</span> <span style="color:#0000ff">(</span>ControlArea<span style="color:#0000ff">-</span><span style="color:#0000ff">&gt;</span>FilePointer <span style="color:#0000ff">!</span><span style="color:#0000ff">=</span> NULL<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CcZeroEndOfLastPage <span style="color:#0000ff">(</span>ControlArea<span style="color:#0000ff">-</span><span style="color:#0000ff">&gt;</span>FilePointer<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// Note if the ins&#101;rtion fails, Ob will dereference the object for us.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Status <span style="color:#0000ff">=</span> ObIns&#101;rtObject <span style="color:#0000ff">(</span>Section<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DesiredAccess<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">(</span>PVOID <span style="color:#0000ff">*</span><span style="color:#0000ff">)</span>NULL<span style="color:#0000ff">,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color:#0000ff">&amp;</span>Handle<span style="color:#0000ff">)</span><span style="color:#0000ff">;</span><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>if</strong></span> <span style="color:#0000ff">(</span>NT_SUCCESS<span style="color:#0000ff">(</span>Status<span style="color:#0000ff">)</span><span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>try</strong></span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">*</span>SectionHandle <span style="color:#0000ff">=</span> Handle<span style="color:#0000ff">;</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span> except <span style="color:#0000ff">(</span>EXCEPTION_EXECUTE_HANDLER<span style="color:#0000ff">)</span> <span style="color:#0000ff">{</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// If the write attempt fails, then do not report an error.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// When the caller attempts to access the handle value,</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">// an access violation will occur.</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008080">//</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000ff">}</span><br/>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#800000"><strong>return</strong></span> Status<span style="color:#0000ff">;</span><br/><span style="color:#0000ff">}</span><br/></div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后随便总结一下，大概20天前，在南航的大学生程序设计大赛中，我们的队伍拿了二等奖，其中的种种，太久了，也没什么意义，不说也罢，照片也不贴了，自己有存档就好。但是，从那之后，算法的学习在逐步被我重视。《黑客防线》投稿的稿费下来了，这也意味着那篇文件可以自由发布了，改天有时间贴上来。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近一直没有闲着，从早上忙到晚上，又从晚上忙到早上。但是有没有瞎忙我就不知道了:)今天的笔记就是证明了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然离高手们的距离还很远，但是我一直努力的在追赶。]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=8</link>
			<title><![CDATA[逆向工程笔记3]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Tue,16 Sep 2008 01:47:50 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=8</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;几天没有更新逆向工程学习笔记了，因为有一些任务需要完成。通过前几天的分析，我越来越发现了解程序的汇编结构对改善和分析程序的效率有非常大的帮助。今天就来看看平时我很常用的强制类型转换的效率情况吧。<br/>C++ Code:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">int f(int i)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(i &lt; 10)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int* p = &amp;i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char a = (char)i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char b = *((char*)p + 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c = *((char*)p + 2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char d = *((char*)p + 3);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returna * b * c * d;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;returnf(i) + f(i - 1);<br/>}</div></div><br/>ASM(Release Version):<div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>00401000&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保护寄存器<br/>00401001&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx,dword ptr [esp+8] //将i赋给ebx<br/>00401005&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx,0Ah&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //比较i和10的大小(i - 0Ah)<br/>00401008&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 401025h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //大于等于跳转<br/>0040100A&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,byte ptr [esp+0Ah]//ecx = *((char*)p + 2);<br/>0040100F&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx,byte ptr [esp+0Bh]//edx = *((char*)p + 3);<br/>00401014&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,bh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//eax = *((char*)p + 1);<br/>00401017&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //eax = eax * ecx;<br/>0040101A&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //eax = eax * dex;<br/>0040101D&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,bl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ecx = (char)i;<br/>00401020&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //eax = eax * ecx;<br/>00401023&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //恢复寄存器<br/>00401024&nbsp;&nbsp;ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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/>00401025&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx,[ebx-1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //edx = ebx - i;<br/>00401028&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保护寄存器<br/>00401029&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //传递参数<br/>0040102A&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;401000h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //f(i - 1)<br/>0040102F&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //传递参数<br/>00401030&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //esi = eax = f(i - 1)<br/>00401032&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;401000h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //f(i)<br/>00401037&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //维护堆栈平衡<br/>0040103A&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //eax = f(i) + f(i - 1)<br/>0040103C&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //恢复寄存器<br/>0040103D&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //恢复寄存器<br/>0040103E&nbsp;&nbsp;ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回</div></div><br/>分析：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.强制类型转换确实推迟到了代码执行时进行转换，但是复杂的像TypeA x = *(( TypeA*)y + z + t + g)的类型转换，在ASM中也只有一条格式固定汇编语句而已，而简单的像TypeBx = (TypeB)y的类型转换，也对应一条语句。可见，虽然推迟到了执行时转换，但是对性能的影响并不大；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.终于可以不用像以前那样疑神疑鬼的使用强制类型转换了，需要注意的是尽量使用简单的转换，少使用复杂的转换；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.在call之前最后一个push的变量是将要执行的函数的第一个变量，最早push的变量时将要执行的函数的最后一个变量；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.eax仍然是作为返回值，不知道VC2005的编译器是不是一直把eax作为返回值呢？<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.为了效率，VC2005编译器在编译时使用个数尽量少的寄存器；<br/><br/>PS:每分析一次VC2005编译器生成的代码，我就不得不再一次佩服它的设计^_^]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=9</link>
			<title><![CDATA[逆向工程笔记2]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Thu,11 Sep 2008 21:35:39 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=9</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续逆向工程的学习，今天发现Release版本的代码比Debug版本的代码难分析很多，而绝大多说软件最终发布的都是Release版本的代码，还是直接分析Release版本的代码实际。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天分析的内容是函数。<br/>&nbsp;&nbsp;C++ Code: <br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int f(int i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt; 2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f(i) + f(i - 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><br/>&nbsp;&nbsp;ASM(Release Version):<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">00401000&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;esi<br/>00401001&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; esi, dword ptr [esp+8]&nbsp;&nbsp;&nbsp;&nbsp;//esp+8对应的时参数i<br/>00401005&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; esi, 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(i &lt; 2)?<br/>00401008&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp; short 00401011<br/>0040100A&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// eax对应的是返回值，这里返回1<br/>0040100F&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br/>00401010&nbsp;&nbsp;retn<br/>00401011&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esi-2]&nbsp;&nbsp;&nbsp;&nbsp;//eax = i–2;<br/>00401014&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br/>00401015&nbsp;&nbsp;push&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; //传递参数<br/>00401016&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;00401000<br/>0040101B&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp; esi, -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //esi = i–1;<br/>0040101E&nbsp;&nbsp;push&nbsp;&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; //传递参数<br/>0040101F&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; edi, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//edi = f(i–2);<br/>00401021&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;00401000<br/>00401026&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp; esp, 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//参见第4点<br/>00401029&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp; eax, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//eax = f(i–1) + edi<br/>0040102B&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br/>0040102C&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br/>0040102D&nbsp;&nbsp;retn</div></div><br/>附ASM(Debug Version):<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">004114B0&nbsp;&nbsp;&nbsp;&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebp<br/>004114B1&nbsp;&nbsp;&nbsp;&nbsp;8BEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; ebp, esp<br/>004114B3&nbsp;&nbsp;&nbsp;&nbsp;81EC C0000000&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; esp, 0C0<br/>004114B9&nbsp;&nbsp;&nbsp;&nbsp;53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebx<br/>004114BA&nbsp;&nbsp;&nbsp;&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;esi<br/>004114BB&nbsp;&nbsp;&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br/>004114BC&nbsp;&nbsp;&nbsp;&nbsp;8DBD 40FFFFFF&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [ebp-C0]<br/>004114C2&nbsp;&nbsp;&nbsp;&nbsp;B9 30000000&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 30<br/>004114C7&nbsp;&nbsp;&nbsp;&nbsp;B8 CCCCCCCC&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, CCCCCCCC<br/>004114CC&nbsp;&nbsp;&nbsp;&nbsp;F3:AB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rep&nbsp;&nbsp;&nbsp;&nbsp; stos dword ptr es:[edi]<br/>004114CE&nbsp;&nbsp;&nbsp;&nbsp;837D 08 02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+8], 2<br/>004114D2&nbsp;&nbsp;&nbsp;&nbsp;7D 07&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jge&nbsp;&nbsp;&nbsp;&nbsp; short 004114DB<br/>004114D4&nbsp;&nbsp;&nbsp;&nbsp;B8 01000000&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 1<br/>004114D9&nbsp;&nbsp;&nbsp;&nbsp;EB 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp; short 004114FD<br/>004114DB&nbsp;&nbsp;&nbsp;&nbsp;8B45 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [ebp+8]<br/>004114DE&nbsp;&nbsp;&nbsp;&nbsp;83E8 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, 1<br/>004114E1&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br/>004114E2&nbsp;&nbsp;&nbsp;&nbsp;E8 72FCFFFF&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;00411159<br/>004114E7&nbsp;&nbsp;&nbsp;&nbsp;83C4 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 4<br/>004114EA&nbsp;&nbsp;&nbsp;&nbsp;8BF0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; esi, eax<br/>004114EC&nbsp;&nbsp;&nbsp;&nbsp;8B4D 08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [ebp+8]<br/>004114EF&nbsp;&nbsp;&nbsp;&nbsp;83E9 02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; ecx, 2<br/>004114F2&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ecx<br/>004114F3&nbsp;&nbsp;&nbsp;&nbsp;E8 61FCFFFF&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;00411159<br/>004114F8&nbsp;&nbsp;&nbsp;&nbsp;83C4 04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 4<br/>004114FB&nbsp;&nbsp;&nbsp;&nbsp;03C6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp; eax, esi<br/>004114FD&nbsp;&nbsp;&nbsp;&nbsp;5F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br/>004114FE&nbsp;&nbsp;&nbsp;&nbsp;5E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br/>004114FF&nbsp;&nbsp;&nbsp;&nbsp;5B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br/>00411500&nbsp;&nbsp;&nbsp;&nbsp;81C4 C0000000&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 0C0<br/>00411506&nbsp;&nbsp;&nbsp;&nbsp;3BEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; ebp, esp<br/>00411508&nbsp;&nbsp;&nbsp;&nbsp;E8 97FCFFFF&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;004111A4<br/>0041150D&nbsp;&nbsp;&nbsp;&nbsp;8BE5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; esp, ebp<br/>0041150F&nbsp;&nbsp;&nbsp;&nbsp;5D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br/>00411510&nbsp;&nbsp;&nbsp;&nbsp;C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retn</div></div><br/>分析：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1．函数调用时，esp对应的是函数的返回地址，esp+4对应的是函数的最后参数，以此类推。本例开头时因为执行了push&nbsp;&nbsp;esi，esp向前推移4字节，这时函数的返回地址已经不是esp，而是esp+4，最后一个参数也由esp+4变成esp+8了；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2．push和pop指令总是成对出现，功能是将该寄存器的值暂存起来，让本函数使用这个寄存器，用完后在恢复之前暂存的值。例如函数开始的push esi，返回时必须由pop esi，否则堆栈就不平衡了；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3．这个函数里，eax作为返回值；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4．为什么esp要加8呢？注意00401015 push eax和0040101E push esi并没有对应的pop语句，前面提到过堆栈要平衡，返回必须弹出这8字节，00401026 add esp, 8当然还可以换成pop esi, pop eax，但是显然00401026 add esp, 8更有效率。为什么呢？pop esi会把堆栈的栈顶给esi，然后执行add esp, 4，但是后面程序中并不需要esi的内容了，直接add esp, 4免去了一次内存寻址+赋值，pop esi也是一样的；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5．软件发布时一定要用Release版本，对比Debug版本的代码就可以知道效率差了多少倍了（据我非正式测试，通常有4到5倍的效率差别），不过Debug版本的好处时调试方便；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PS：VC2005的编译器非常优秀，在Release版本的编译中，做到了刚刚达到程序需要的效果而有没有一条多余的指令这个苛刻的要求。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=10</link>
			<title><![CDATA[逆向工程笔记1]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Thu,11 Sep 2008 01:57:58 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=10</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续学习逆向工程，今天中午再完成了一个很简单的CrackMe之后，我开始尝试从汇编的角度分析代码的执行以及效率，今天的内容是for语句。<br/><br/>C++ Code:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">for (int i = 0; i &lt; 10; i++)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;int dword = sizeof(int);<br/>}</div></div><br/>ASM(Debug Version):<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">0041137e c745f800000000&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-8],0&nbsp;&nbsp; //int i = 0;<br/>00411385 eb09&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; 00411390&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//跳转到循环条件<br/>00411387 8b45f8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [ebp-8] //i++<br/>0041138a 83c001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp; eax,1<br/>0041138d 8945f8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-8],eax<br/>00411390 837df80a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-8],0Ah //(i &lt; 10)?<br/>00411394 7d09&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp; 0041139f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果i &gt;= 10则跳转<br/>00411396 c745ec04000000&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-14h],4 //循环内容<br/>0041139d ebe8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; 00411387&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//进行下一次循环<br/>0041139f 33c0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; eax,eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //结束</div></div><br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Release版本里面，这段代码居然没有被编译！原函数是这样的：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">void main()<br/>{<br/>&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;int dword = sizeof(dword);<br/>&nbsp;&nbsp; }<br/>}</div></div><br/>ASM(Release Version)<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">00401000 33c0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; eax,eax<br/>00401002 c3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret </div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;估计是编译器任务这个循环对整体程序没有任何影响，直接返回了;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了进一步求证，改了一下代码，以求代码对全局产生影响:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">int main()<br/>{<br/>&nbsp;&nbsp; int t = 0;<br/>&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++)<br/>&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;int dword = sizeof(dword);<br/>&nbsp;&nbsp;&nbsp;&nbsp;t += dword;<br/>&nbsp;&nbsp; }<br/>&nbsp;&nbsp; return t;<br/>}</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对应的ASM(Release Version)为:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">00401000 b828000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax,28h<br/>00401005 c3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;惊，编译器居然直接计算到t = 10 * 4 = 28h，然后直接返回。VC2005的编译器强大的恐怖...<br/>&nbsp;&nbsp;<br/>小结：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.从汇编代码中可以清晰的看到for语句的3个执行部分，同时也体现了for的特性，未执行循环体的代码时，先判断，执行循环体，最后递增，再进行下一次判断，如此循环下去。虽然汇编中for的结构很不清晰；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.int i; for (i = 0; i &lt; 10; i++);和for (int i = 0; i &lt; 10; i++)两条语句在汇编中并没有区别，只是在C++编译时根据语法有所不同而已；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.之前一个很令我担心的性能问题解决了：我在代码中经常使用sizoef()函数并不是运行时函数，在编译时sizeof(int)运算就被自动转成了4(mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-14h],4)，运行时只是简单的赋一个已经计算好的值而已。以后不用担心复杂的sizeof()运算会影响程序速度了，只影响编译速度而已；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.即使VC2005的编译器已经非常优秀了，这样的语句的运行速度还是没有纯汇编的快，纯汇编可以这样写:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; compare<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;increase:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp; eax, 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compare:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 0Ah<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jge&nbsp;&nbsp;&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-14h],4<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; increase <br/>end:&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; eax,eax</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;内存寻址改成了寄存器寻址，快了不少；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.在汇编代码里，for的结构没有while那么清晰，终于懂得为什么有些高手用while代替for的原因了；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.VC2005的编译器非常优秀。]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=11</link>
			<title><![CDATA[逆向工程笔记0 ]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Wed,10 Sep 2008 03:01:21 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=11</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;冠锁2.11完成，可以暂时降低它的优先级了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;记得刚刚学驱动的时候，在驱网看到某牛人逆向卡巴斯基驱动的部分代码时，对他的敬仰犹如XX长江，XX不绝。现在更进一步的了解之后，才越发深刻的认识到，牛人们逆向水平无一不是长期的训练中沉淀，累积下来的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;没有了四，六级呵大部分课程的压力，现在终于可以静下心来学习技术了。昨天和今天（应该时前天和昨天）看了很久黑防的汇编基础课程，今天（应该时昨天）晚上花了一个多小时，终于逆向出Win下一个很简单的API，SetLastError()，接着完成了一个入门级的Crackme，我终于向逆向工程迈开了第一步。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;刚刚写日志时开到一条有趣的留言，有人说突破了冠锁2的驱动保护了，我只是想说，没有绝对安全的技术，随着时间的推移，驱动所有的漏洞都将一个个被修复，非常欢迎你一年以后再来试试突破它。冠锁2所采用的技术，已经比市面上99%的同类软件安全不知道多少倍，对于绝大多说普通用户甚至时系统管理员已经足够。<br/><br/>附：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;被我解决掉的CrackMe的下载地址:<a href="http://www.crackmes.de/users/lucifer/first_c_crackme/" target="_blank" rel="external">http://www.crackmes.de/users/lucifer/first_c_crackme/</a>;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;逆向SetLastError()后的代码：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">void SetLastError(DWORD dwErrCode)<br/>{<br/> //这里的dwLastErr指向当前线程的最后一个错误的缓存地址<br/> extern DWORD *dwLastErr = edi + 34h;<br/> //这条语句估计时调试时用的，暂时不知道g_dwLastErrorToBreakOn这个全局变量有什么用- -<br/> if (0 != g_dwLastErrorToBreakOn &amp;&amp; dwErrCode == g_dwLastErrorToBreakOn)<br/>&nbsp;&nbsp;DbgBreakPoint();<br/>&nbsp;&nbsp;<br/> if (dwErrCode == *dwLastErr)<br/>&nbsp;&nbsp;return;<br/> else<br/> {<br/>&nbsp;&nbsp;*dwLastErr == dwErrCode;<br/>&nbsp;&nbsp;return;<br/> }<br/>}<br/><br/>AMS<br/>0:000&gt; uf Kernel32!SetLastError<br/>kernel32!SetLastError:<br/>7c809342 8bff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; edi,edi<br/>7c809344 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebp<br/>7c809345 8bec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp<br/>7c809347 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;esi<br/>7c809348 57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br/>7c809349 64a118000000&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr fs:[00000018h]<br/>7c80934f 8b7508&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; esi,dword ptr [ebp+8]<br/>7c809352 8bf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; edi,eax<br/>7c809354 a1c456887c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [kernel32!g_dwLastErrorToBreakOn (7c8856c4)]<br/>7c809359 85c0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;eax,eax<br/>7c80935b 0f85a6080300&nbsp;&nbsp;&nbsp;&nbsp;jne&nbsp;&nbsp;&nbsp;&nbsp; kernel32!SetLastError+0x1b (7c839c07)<br/><br/>kernel32!SetLastError+0x24:<br/>7c809361 397734&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [edi+34h],esi<br/>7c809364 0f8541040000&nbsp;&nbsp;&nbsp;&nbsp;jne&nbsp;&nbsp;&nbsp;&nbsp; kernel32!SetLastError+0x29 (7c8097ab)<br/><br/>kernel32!SetLastError+0x2c:<br/>7c80936a 5f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br/>7c80936b 5e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br/>7c80936c 5d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br/>7c80936d c20400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;&nbsp;&nbsp;&nbsp; 4<br/><br/>kernel32!SetLastError+0x29:<br/>7c8097ab 897734&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [edi+34h],esi<br/>7c8097ae e9b7fbffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; kernel32!SetLastError+0x2c (7c80936a)<br/><br/>kernel32!SetLastError+0x1b:<br/>7c839c07 3bf0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; esi,eax<br/>7c839c09 0f8552f7fcff&nbsp;&nbsp;&nbsp;&nbsp;jne&nbsp;&nbsp;&nbsp;&nbsp; kernel32!SetLastError+0x24 (7c809361)<br/><br/>kernel32!SetLastError+0x1f:<br/>7c839c0f e86a6c0400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;kernel32!DbgBreakPoint (7c88087e)<br/>7c839c14 e948f7fcff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp; kernel32!SetLastError+0x24 (7c809361)</div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=13</link>
			<title><![CDATA[Detours]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Sat,19 Jul 2008 14:55:58 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=13</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近在研究一个项目需要使用到的API HOOK时，Google一下时发现了一个非常好用的API HOOK工具，微软的Detours。与其说是工具，倒不如说是一个开源的library。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Detours属于Microsoft Research的一个项目，最新版本是2.1，分为Professional和Express版本，和Visual Studio一样，Professional是收费的，而Express虽然免费，但是功能大受限制。其实我认为版本1.5反而更加好用，1.5里面不仅是免费的，而且还有所有的library的源代码，方便研究Detours的内部机制；但是2.1更先进，解决了一些1.5无法实现的问题，如无法重复HOOK。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好东西要共享，提供下载~<br/><br/>[<a target="_blank" href="http://www.gmxpsoft.com/Downloads/Blog/Detours_V1.5.zip" rel="external">点击下载Microsoft Detours 1.5</a>](595.05KB)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下是利用Detours 1.5完成的一个简易API HOOK，代码仅50余行：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Visual Studio 2005 + Windows XP SP2 通过)<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">#include &#34;windows.h&#34;<br/>#include &#34;detours.h&#34;<br/><br/>//<br/>// Trampolines<br/>//<br/><br/>DETOUR_TRAMPOLINE(int __stdcall Real_MessageBoxW(HWND hWnd, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCWSTR lpText, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCWSTR lpCaption, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT uType),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW);<br/><br/>//<br/>// Detours<br/>//<br/><br/>int __stdcall Mine_MessageBoxW(HWND hWnd, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCWSTR lpText, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCWSTR lpCaption, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT uType)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Real_MessageBoxW(hWnd, lpText, L&#34;嘿嘿,Hook住啦!&#34;, uType);<br/>}<br/><br/>//<br/>// TrampolineWith<br/>//<br/><br/>void TrampolineWith(void)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DetourFunctionWithTrampoline((PBYTE)Real_MessageBoxW,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PBYTE)Mine_MessageBoxW);<br/>}<br/><br/>//<br/>// RemoveTrampoline<br/>//<br/><br/>void RemoveTrampoline(void)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DetourRemove((PBYTE)Real_MessageBoxW,(PBYTE)Mine_MessageBoxW);<br/>}<br/><br/>int main()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(NULL, L&#34;Just a simple test.&#34;, L&#34;Info&#34;, MB_OK);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrampolineWith();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(NULL, L&#34;Just a simple test.&#34;, L&#34;Info&#34;, MB_OK);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoveTrampoline();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBoxW(NULL, L&#34;Just a simple test.&#34;, L&#34;Info&#34;, MB_OK);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>}</div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=18</link>
			<title><![CDATA[有趣的旅行线路问题]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Fri,06 Jun 2008 21:43:44 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=18</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天帮某个来自北邮的同学做了一题他们的课程设计，纯算法的，比我们的课程设计有意思多了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;惭愧没有研究算法已经多年了，都快忘光了，今天这个题目就当重新熟悉基本算法吧，以后有时间一定要多做做这样的题目才行，据说很多公司面试时都问算法的问题的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于算法生疏了，这题我用的方法比较苯，效率比较低，但是可以有效的计算出来。我用了广度搜索，递归计算最小值，单链表以及一些数据结构。现在把代码贴出来，仅供学习交流，还望高手多多指导~<br/><br/>[<a target="_blank" href="http://www.gmxpsoft.com/Downloads/Blog/Road.rar" rel="external">点击这里下载代码(C++代码,VC6通过)</a>]<br/><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">旅行路线问题<br/>有六个城市（城市0—城市5）。两个城市之间若有航班可以到达，则航班至少有一条。<br/>要求是输入两个城市（起点和终点），输出从一个城市到达另一个城市所经历的最短时间和所经节点，该时间<br/><br/>要包括换乘时的等待时间。<br/>可用以下测试数据：<br/>０――２：９点－１１点／７点－１０点<br/>（城市０到城市２有两趟航班，出发时间――到达时间）<br/>０――４：２点－５点／１１点－１４点<br/>０――５：１点－１０点<br/>１――２：１点－５点／１７点－２２点<br/>２――３：１３点－１８点／７点－１２点<br/>３――５：８点－９点／１４点－１５点<br/>４――３：３点－５点／１０点－１４点／２０点－２３点<br/>４――５：７点－８点／９点－１０点<br/>５――４：３点－４点／１６点－１７点<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.gmxpsoft.com/article.asp?id=23</link>
			<title><![CDATA[.Net不小心被溢出了]]></title>
			<author>gmxp@gmxpsoft.com(Gmxp)</author>
			<category><![CDATA[开发应用]]></category>
			<pubDate>Thu,03 Apr 2008 00:24:09 +0800</pubDate>
			<guid>http://www.gmxpsoft.com/default.asp?id=23</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天在用VS05写冠锁2的加密代码时，突然遇到一个奇怪的问题，浪费了近两个小时才发现，原来C#代码在调用C++的Dll时被溢出了...如下面的代码，BUFFER_SIZE不小心多了就形成了非常经典的缓冲区溢出漏洞了，而我今天就使遇到了这样的问题，BUFFER_SIZE被我不小心改大了很多，结果，VS05，.Net CLR纷纷瘫痪...<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">unsafe<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;fixed (byte* ptr = &amp;key[0])<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Encrypt(ptr, BUFFER_SIZE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}</div></div><br/><div class="UBBPanel quotePanel"><div class="UBBTitle"><img src="http://www.gmxpsoft.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用内容"/> 引用内容</div><div class="UBBContent">FatalExecutionEngineError was detected<br/>Message: The runtime has encountered a fatal error. The address of the error was at 0x79f783dd, on thread 0x6d8. The error code is 0xc0000005. This error may be a bug in the CLR o&#114; in the unsafe o&#114; non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop o&#114; PInvoke, which may corrupt the stack.</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看来，.Net溢出也不是非常困难，可以考虑从Dll入手啊~]]></description>
		</item>
		
</channel>
</rss>
