<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Yas Kernel Debugger]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[记录记得的点滴]]></description>
<link>http://hi.baidu.com/sysnap</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[对象名字劫持，如何隐藏IRP DISPATCH HOOK]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/f28c62fe83c0942e5d60081a.html]]></link>
        <description><![CDATA[
		
		<p>翻看大学写的代码，发现一段XXX代码，遂写成篇简单文章。<br />驱动程序中通过一个驱动对象名来获取对应的驱动对象通常是调用ObReferenceObjectByName，ObReferenceObjectByName的声明如下</p><p>NTSTATUS</p><p>ObReferenceObjectByName (</p><p>&nbsp;&nbsp; &nbsp;__in PUNICODE_STRING ObjectName,</p><p>&nbsp;&nbsp; &nbsp;__in ULONG Attributes,</p><p>&nbsp;&nbsp; &nbsp;__in_opt PACCESS_STATE AccessState,</p><p>&nbsp;&nbsp; &nbsp;__in_opt ACCESS_MASK DesiredAccess,</p><p>&nbsp;&nbsp; &nbsp;__in POBJECT_TYPE ObjectType,</p><p>&nbsp;&nbsp; &nbsp;__in KPROCESSOR_MODE AccessMode,</p><p>&nbsp;&nbsp; &nbsp;__inout_opt PVOID ParseContext,</p><p>&nbsp;&nbsp; &nbsp;__out PVOID *Object</p><p>&nbsp;&nbsp; &nbsp;)</p><p>对象管理器就会根据ObjectName去遍历对应对象目录下的所有对象，看哪些对象的名字跟ObjectName匹配。那驱动对象的名字是存储在哪里呢？答案就是在</p><p>OBJECT_HEADER_NAME_INFO里面。</p><p>typedef struct _OBJECT_HEADER_NAME_INFO {</p><p>&nbsp;&nbsp; &nbsp;POBJECT_DIRECTORY Directory; &nbsp; //对象所属的路径</p><p>&nbsp;&nbsp; &nbsp;UNICODE_STRING Name;//对象名</p><p>&nbsp;&nbsp; &nbsp;ULONG QueryReferences;</p><p>} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_NAME_INFO;</p><p>&nbsp;</p><p>那这样修改对象名，那通过ObReferenceObjectByName就无法获取到正确的驱动对象了。下面介绍如何隐藏IRP DISPATCH HOOK。</p><p>&nbsp;</p><p>1) 调用ObReferenceObjectByName获取\FileSystem\ntfs对应的驱动对象的指针pDrvObj</p><p>2）替换掉你想要替换的DISPACTH指针</p><p>3）修改\FileSystem\ntfs这个名字</p><p><span></span>OBJECT_HEADER* lpObjectHeader = NULL;</p><p><span></span>POBJECT_HEADER_NAME_INFO lpObjectNameInfo = NULL;</p><p><span></span>UNICODE_STRING uniXX;</p><p><span></span>RtlInitUnicodeString (&amp;uniXX, L&quot;Hello 123&quot;);<span></span></p><p><span></span>RtlCopyUnicodeString(&amp;pDrvObj-&gt;DriverName,&amp;uniXX);</p><p><span></span>lpObjectHeader = OBJECT_TO_OBJECT_HEADER(pDrvObj);</p><p><span></span>lpObjectNameInfo = (POBJECT_HEADER_NAME_INFO)((DWORD)lpObjectHeader - (DWORD)lpObjectHeader-&gt;NameInfoOffset);</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RtlCopyUnicodeString(&amp;lpObjectNameInfo-&gt;Name,&amp;uniXX);</p><p>4) 保存好原来的驱动对象信息</p><p><span></span>RtlCopyMemory(&amp;pDrvObject,pDrvObj,sizeof(DRIVER_OBJECT));</p><p>5）用IoCreateDriverc创建一个同名的驱动对象，初始化DISPACTH指针为原始指针</p><p>NTKERNELAPI</p><p>NTSTATUS</p><p>IoCreateDriver(</p><p>&nbsp;&nbsp; &nbsp;__in_opt PUNICODE_STRING DriverName,</p><p>&nbsp;&nbsp; &nbsp;__in PDRIVER_INITIALIZE &nbsp;DriverEntry</p><p>&nbsp;&nbsp; &nbsp;);</p><p>&nbsp;</p><p>任务完成。</p><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/f28c62fe83c0942e5d60081a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/f28c62fe83c0942e5d60081a.html#comment">查看评论</a>]]></description>
        <pubDate>2012年02月11日 星期六  22:37</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/f28c62fe83c0942e5d60081a.html</guid>
</item>

<item>
        <title><![CDATA[WINDBG扩展应用 - 统计源代码行数]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/fa54562ace422284023bf674.html]]></link>
        <description><![CDATA[
		
		<div><p><span style="color: #000000;">下面的代码比较简单，能实现下面俩个功能</span></p><p><span style="color: #000000;">1）代码行数统计,只需要PDB就可以，而且统计出来的行数是有效行数，那些空行的不包括在内。</span></p><p><span style="color: #000000;">2）函数的局部变量占用空间统计，对驱动程序来讲，堆栈是宝贵资源。</span></p>HRESULT<br />SymGetFunctionInfo(<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PCSTR&nbsp;FunctionName,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG64&nbsp;*Offset,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG&nbsp;*Size,<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG&nbsp;*Locals,&nbsp;OPTIONAL<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG&nbsp;*Params,&nbsp;OPTIONAL<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG&nbsp;*cbFrame,&nbsp;OPTIONAL<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;BOOLEAN&nbsp;*fHasSEH&nbsp;OPTIONAL<br />&nbsp;&nbsp;&nbsp;&nbsp;)<br />{<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;=&nbsp;S_FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;Type&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG64&nbsp;tmpOffset&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;FPO_DATA&nbsp;Fpo&nbsp;=&nbsp;{&nbsp;<span style="color: #0000ff;">0</span>&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;IMAGE_FUNCTION_ENTRY&nbsp;FucEntry&nbsp;=&nbsp;{&nbsp;<span style="color: #0000ff;">0</span>&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FunctionName&nbsp;==&nbsp;NULL&nbsp;||&nbsp;Offset&nbsp;==&nbsp;NULL&nbsp;||&nbsp;Size&nbsp;==&nbsp;NULL&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Control-&gt;GetActualProcessorType(&amp;Type);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr&nbsp;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;SymGetOffset(FunctionName,&nbsp;&amp;tmpOffset);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr&nbsp;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;Type&nbsp;==&nbsp;IMAGE_FILE_MACHINE_I386&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Symbols3-&gt;GetFunctionEntryByOffset(tmpOffset,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_GETFNENT_DEFAULT,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PVOID)&amp;Fpo,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>sizeof</b></span>(Fpo),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr&nbsp;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Offset&nbsp;=&nbsp;tmpOffset;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Size&nbsp;=&nbsp;Fpo.cbProcSize;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;Locals&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Locals&nbsp;=&nbsp;Fpo.cdwLocals;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;Params&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Params&nbsp;=&nbsp;Fpo.cdwParams;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;cbFrame&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*cbFrame&nbsp;=&nbsp;Fpo.cbFrame;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;fHasSEH&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*fHasSEH&nbsp;=&nbsp;Fpo.fHasSEH;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #000080;"><b>else</b></span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Symbols3-&gt;GetFunctionEntryByOffset(tmpOffset,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_GETFNENT_DEFAULT,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PVOID)&amp;FucEntry,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>sizeof</b></span>(FucEntry),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr&nbsp;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Offset&nbsp;=&nbsp;tmpOffset;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*Size&nbsp;=&nbsp;(ULONG)(FucEntry.EndingAddress&nbsp;-&nbsp;FucEntry.StartingAddress);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />__EXIT0:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>return</b></span>&nbsp;hr;<br /><br /><br />}<br /><br />HRESULT<br />SymGetFunctionLineInfoByName(<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PCSTR&nbsp;FunctionName,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG&nbsp;*StartLine,<br />&nbsp;&nbsp;&nbsp;&nbsp;OUT&nbsp;ULONG&nbsp;*EndLine<br />&nbsp;&nbsp;&nbsp;&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;=&nbsp;S_FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG64&nbsp;StartOffset&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>,&nbsp;EndOffset&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;Size&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FunctionName&nbsp;==&nbsp;NULL&nbsp;||&nbsp;StartLine&nbsp;==&nbsp;NULL&nbsp;||&nbsp;EndLine&nbsp;==&nbsp;NULL&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;SymGetFunctionInfo(FunctionName,&nbsp;&amp;StartOffset,&nbsp;&amp;Size,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EndOffset&nbsp;=&nbsp;(ULONG64)Size&nbsp;+&nbsp;StartOffset&nbsp;-&nbsp;<span style="color: #0000ff;">1</span>;&nbsp;<span style="color: #008800;"><i>//&nbsp;make&nbsp;sure</i></span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Symbols-&gt;GetLineByOffset(StartOffset,&nbsp;StartLine,&nbsp;NULL,&nbsp;<span style="color: #0000ff;">0</span>,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>goto</b></span>&nbsp;__EXIT0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Symbols-&gt;GetLineByOffset(EndOffset,&nbsp;EndLine,&nbsp;NULL,&nbsp;<span style="color: #0000ff;">0</span>,&nbsp;NULL,&nbsp;NULL);<br /><br /><br />__EXIT0:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>return</b></span>&nbsp;hr;<br />}<br /><br />使用<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;StartLine&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>,&nbsp;EndLine&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;SymGetFunctionLineInfoByName(<span style="color: #0000ff;">&quot;SysPrj!KernelTimeToSystemTime&quot;</span>,&nbsp;&amp;StartLine,&nbsp;&amp;EndLine);<br /><br /><span style="color: #000000;">枚举程序PDB所有函数，调用SymGetFunctionLineInfoByName则可以。如果你想把那些全局变量之类占用的行数也统计出来，那可以用</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008800;"><i>//</i></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008800;"><i>//获取整页代码的行信息</i></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008800;"><i>//</i></span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PDEBUG_SYMBOL_SOURCE_ENTRY&nbsp;&nbsp;pEntries&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Symbols3-&gt;GetSourceEntriesByLine(<span style="color: #0000ff;">1</span>,&nbsp;FileBuffer,&nbsp;DEBUG_GSEL_ALLOW_HIGHER&nbsp;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">0</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;EntriesAvail<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr&nbsp;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pEntries&nbsp;=&nbsp;<span style="color: #000080;"><b>new</b></span>&nbsp;DEBUG_SYMBOL_SOURCE_ENTRY[EntriesAvail];<br />&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;=&nbsp;gDpVar.Symbols3-&gt;GetSourceEntriesByLine(<span style="color: #0000ff;">1</span>,&nbsp;FileBuffer,&nbsp;DEBUG_GSEL_ALLOW_HIGHER&nbsp;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntries,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntriesAvail,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>if</b></span>(&nbsp;FAILED(&nbsp;hr&nbsp;)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000080;"><b>for</b></span>(&nbsp;<span style="color: #000080;"><b>int</b></span>&nbsp;j&nbsp;=&nbsp;<span style="color: #0000ff;">0</span>;&nbsp;j&nbsp;&lt;&nbsp;EntriesAvail;&nbsp;j++&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span style="color: #0000ff;">&quot;Lines&nbsp;=&nbsp;%d-%d&nbsp;&nbsp;&nbsp;&nbsp;ModuleBase&nbsp;=&nbsp;0x%I64x&nbsp;Offset&nbsp;=&nbsp;0x%I64x&nbsp;Size&nbsp;=&nbsp;%d&nbsp;\n&quot;</span>,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntries[j].StartLine,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntries[j].EndLine&nbsp;,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntries[j].ModuleBase&nbsp;&amp;&nbsp;<span style="color: #0000ff;">0</span>xffffffff,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntries[j].Offset&nbsp;&amp;&nbsp;<span style="color: #0000ff;">0</span>xffffffff,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEntries[j].Size);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp; &nbsp;<br /></div><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/fa54562ace422284023bf674.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/fa54562ace422284023bf674.html#comment">查看评论</a>]]></description>
        <pubDate>2012年02月07日 星期二  14:43</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/fa54562ace422284023bf674.html</guid>
</item>

<item>
        <title><![CDATA[NDIS层如何实现PING]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/ef37a71fc83dd5d7a68669f4.html]]></link>
        <description><![CDATA[
		
		<span>以前做流量控制的时候需要用到PING,因为精确的流量控制在每建立一条TCP链接的时候，需要PING一下获取数据包的返回时间。（需要了解下TCP/IP协议）<br /><table border="0" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td><div>#include&nbsp;&quot;precomp.h&quot;<br />#include&nbsp;&quot;packet.h&quot;<br />#pragma&nbsp;hdrstop<br /><br /><br /><br />#pragma&nbsp;pack(1)<i>//内存对齐,使内存紧凑</i><br /><br /><i>/*&nbsp;IPv4&nbsp;header&nbsp;structure&nbsp;*/</i><br /><b>typedef</b>&nbsp;<b>struct</b>&nbsp;_IPv4_HEADER<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;IHL:4;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Version:4;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;TOS;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;Length;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;Id;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;FragFlags;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;TTL;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Protocol;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;Checksum;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;SrcAddress;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;DstAddress;<br />}&nbsp;IPv4_HEADER,&nbsp;*PIPv4_HEADER;<br /><br /><i>/*&nbsp;ICMP&nbsp;echo&nbsp;request/reply&nbsp;header&nbsp;structure&nbsp;*/</i><br /><b>typedef</b>&nbsp;<b>struct</b>&nbsp;_ICMP_HEADER<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Type;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;Code;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;Checksum;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;Id;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;SeqNum;<br />}&nbsp;ICMP_HEADER,&nbsp;*PICMP_HEADER;<br /><br /><b>typedef</b>&nbsp;<b>struct</b>&nbsp;_ICMP_ECHO_PACKET<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ICMP_HEADER&nbsp;Icmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;Timestamp;&nbsp;<i>//从这里开始是数据</i><br />&nbsp;&nbsp;&nbsp;&nbsp;PTCP_CONNECTIONINFO_IPV4&nbsp;ConnectionInfo;<br />}&nbsp;ICMP_ECHO_PACKET,&nbsp;*PICMP_ECHO_PACKET;<br /><br /><br /><b>typedef</b>&nbsp;<b>struct</b>&nbsp;__ICMP_ECHOPACKET<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;EtherHeader&nbsp;&nbsp;EthernetHeader;<br />&nbsp;&nbsp;&nbsp;&nbsp;IPV4HEADER&nbsp;IpHeader;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICMP_ECHO_PACKET&nbsp;IcmpEchoHeader;<br />}ICMPECHOPACKET,&nbsp;*PICMPECHOPACKET;<br /><br />#pragma&nbsp;pack()<br /><br />NTSTATUS<br />inNdisSendIcmpEchoRequestMsg(<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;NDIS_HANDLE&nbsp;&nbsp;AdapterContext,<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;ULONG&nbsp;SrcIp,&nbsp;<i>//网络顺序</i><br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;ULONG&nbsp;DstIp,<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;UCHAR&nbsp;EtherSrcMacAddress[],&nbsp;<i>//6</i><br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;UCHAR&nbsp;EtherDstMacAddress[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PICMPECHOPACKET&nbsp;IcmpEchoPacket;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<b>if</b>&nbsp;(((PADAPT)AdapterContext)-&gt;MPDeviceState&nbsp;&gt;&nbsp;NdisDeviceStateD0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>return</b>&nbsp;NDIS_STATUS_FAILURE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket&nbsp;=&nbsp;ExAllocatePoolWithTag(NonPagedPool,&nbsp;<b>sizeof</b>(ICMPECHOPACKET),&nbsp;'ICMP');<br />&nbsp;&nbsp;&nbsp;&nbsp;<b>if</b>(IcmpEchoPacket)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlZeroMemory(IcmpEchoPacket,&nbsp;<b>sizeof</b>(ICMPECHOPACKET));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//Fill&nbsp;ethernet&nbsp;header</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlCopyMemory(&amp;IcmpEchoPacket-&gt;EthernetHeader.ether_src,&nbsp;EtherSrcMacAddress,&nbsp;6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlCopyMemory(&amp;IcmpEchoPacket-&gt;EthernetHeader.ether_dst,&nbsp;EtherDstMacAddress,&nbsp;6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;EthernetHeader.ether_type&nbsp;=&nbsp;htons(NDIS_ETH_TYPE_IPV4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//Fill&nbsp;ip&nbsp;header</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_v&nbsp;=&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_hl&nbsp;=&nbsp;5;&nbsp;<i>//&nbsp;一般是5</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_tos&nbsp;=&nbsp;0;&nbsp;<i>//一般为0</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_len&nbsp;=&nbsp;htons(<b>sizeof</b>(<b>struct</b>&nbsp;ip_hdr)&nbsp;+&nbsp;<b>sizeof</b>(ICMP_ECHO_PACKET));&nbsp;<i>//我们没有带数据的</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_id&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//&nbsp;XXX&nbsp;make&nbsp;it&nbsp;something&nbsp;meaningful</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_off&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_ttl&nbsp;=&nbsp;64;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//或许从注册表取得该值，一般是64或者128</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_p&nbsp;=&nbsp;IPPROTO_ICMP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_sum&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//&nbsp;for&nbsp;checksum&nbsp;calculation</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_src&nbsp;=&nbsp;SrcIp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_dst&nbsp;=&nbsp;DstIp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_sum&nbsp;=&nbsp;__Checksum((USHORT*)&amp;IcmpEchoPacket-&gt;IpHeader,&nbsp;20)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//Fill&nbsp;IcmpEchoHeader</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;ICMPMSG_ECHOREQUEST&nbsp;8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ICMPMSG_ECHOREQUEST;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(USHORT)2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.SeqNum&nbsp;&nbsp;&nbsp;=&nbsp;htons((USHORT)0xeedd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Checksum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeQueryTickCount(&amp;IcmpEchoPacket-&gt;IcmpEchoHeader.Timestamp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Checksum&nbsp;=&nbsp;__Checksum((PUSHORT)&amp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>sizeof</b>(ICMP_ECHO_PACKET));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint(<i>&quot;Send&nbsp;Ping&nbsp;TimeStamp&nbsp;=&nbsp;0x%I64d\n&quot;</i>,&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Timestamp.QuadPart);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>return</b>&nbsp;SendPacket2(AdapterContext,&nbsp;(PUCHAR)IcmpEchoPacket,&nbsp;<b>sizeof</b>(ICMPECHOPACKET));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<b>return</b>&nbsp;STATUS_SUCCESS;<br />}<br /><br /><br /><b>typedef</b>&nbsp;VOID&nbsp;(*__IcmpReplyCallback)(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PVOID&nbsp;Packet,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PVOID&nbsp;Context1,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PVOID&nbsp;Context2);<br /><br /><br /><i>//</i><br /><i>//NET&nbsp;IN</i><br /><i>//</i><br />VOID&nbsp;IcmpReplyCallBack(<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PVOID&nbsp;Packet)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<b>struct</b>&nbsp;ether_hdr&nbsp;*Etheader=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<b>struct</b>&nbsp;ip_hdr&nbsp;*IpHeader&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICMP_HEADER&nbsp;*IcmpHeader&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;Etheader&nbsp;=&nbsp;(<b>struct</b>&nbsp;ether_hdr&nbsp;*)Packet;<br />&nbsp;&nbsp;&nbsp;&nbsp;IpHeader&nbsp;=&nbsp;(<b>struct</b>&nbsp;ip_hdr&nbsp;*)(Etheader&nbsp;+&nbsp;1);<br />&nbsp;&nbsp;&nbsp;&nbsp;IcmpHeader&nbsp;=&nbsp;(ICMP_HEADER*)(&nbsp;(PUCHAR)IpHeader&nbsp;+&nbsp;((IpHeader-&gt;ip_hl&nbsp;&amp;&nbsp;0x0F)&lt;&lt;2)&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>if</b>(&nbsp;IcmpHeader-&gt;Type&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;IcmpHeader-&gt;SeqNum&nbsp;==&nbsp;htons(0xeedd)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;CurTimestamp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PICMP_ECHO_PACKET&nbsp;echoPacket&nbsp;=&nbsp;(PICMP_ECHO_PACKET)IcmpHeader;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CurTimestamp.QuadPart&nbsp;=&nbsp;KeQueryInterruptTime();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>if</b>(&nbsp;echoPacket-&gt;ConnectionInfo&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echoPacket-&gt;ConnectionInfo-&gt;RoundTime&nbsp;=&nbsp;CurTimestamp.QuadPart&nbsp;-&nbsp;echoPacket-&gt;Timestamp.QuadPart;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />}<br /><br />NTSTATUS<br />NdisSendIcmpEchoRequestMsg(<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;NDIS_HANDLE&nbsp;&nbsp;AdapterContext,<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;ULONG&nbsp;SrcIp,&nbsp;<i>//网络顺序</i><br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;ULONG&nbsp;DstIp,<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;UCHAR&nbsp;EtherSrcMacAddress[],&nbsp;<i>//6</i><br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;UCHAR&nbsp;EtherDstMacAddress[],<br />&nbsp;&nbsp;&nbsp;&nbsp;IN&nbsp;PVOID&nbsp;ConnectionInfo)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PICMPECHOPACKET&nbsp;IcmpEchoPacket;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>if</b>&nbsp;(((PADAPT)AdapterContext)-&gt;MPDeviceState&nbsp;&gt;&nbsp;NdisDeviceStateD0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>return</b>&nbsp;NDIS_STATUS_FAILURE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket&nbsp;=&nbsp;ExAllocatePoolWithTag(NonPagedPool,&nbsp;<b>sizeof</b>(ICMPECHOPACKET),&nbsp;'ICMP');<br />&nbsp;&nbsp;&nbsp;&nbsp;<b>if</b>(IcmpEchoPacket)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlZeroMemory(IcmpEchoPacket,&nbsp;<b>sizeof</b>(ICMPECHOPACKET));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//Fill&nbsp;ethernet&nbsp;header</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlCopyMemory(&amp;IcmpEchoPacket-&gt;EthernetHeader.ether_src,&nbsp;EtherSrcMacAddress,&nbsp;6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlCopyMemory(&amp;IcmpEchoPacket-&gt;EthernetHeader.ether_dst,&nbsp;EtherDstMacAddress,&nbsp;6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;EthernetHeader.ether_type&nbsp;=&nbsp;htons(NDIS_ETH_TYPE_IPV4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//Fill&nbsp;ip&nbsp;header</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_v&nbsp;=&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_hl&nbsp;=&nbsp;5;&nbsp;<i>//&nbsp;一般是5</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_tos&nbsp;=&nbsp;0;&nbsp;<i>//一般为0</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_len&nbsp;=&nbsp;htons(<b>sizeof</b>(<b>struct</b>&nbsp;ip_hdr)&nbsp;+&nbsp;<b>sizeof</b>(ICMP_ECHO_PACKET));&nbsp;<i>//我们没有带数据的</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_id&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//&nbsp;XXX&nbsp;make&nbsp;it&nbsp;something&nbsp;meaningful</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_off&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_ttl&nbsp;=&nbsp;64;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//或许从注册表取得该值，一般是64或者128</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_p&nbsp;=&nbsp;IPPROTO_ICMP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_sum&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//&nbsp;for&nbsp;checksum&nbsp;calculation</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_src&nbsp;=&nbsp;SrcIp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_dst&nbsp;=&nbsp;DstIp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IpHeader.ip_sum&nbsp;=&nbsp;__Checksum((USHORT*)&amp;IcmpEchoPacket-&gt;IpHeader,&nbsp;20)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//Fill&nbsp;IcmpEchoHeader</i><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>//</i><br />#define&nbsp;ICMPMSG_ECHOREQUEST&nbsp;8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ICMPMSG_ECHOREQUEST;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(USHORT)2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.SeqNum&nbsp;&nbsp;&nbsp;=&nbsp;htons((USHORT)0xeedd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Checksum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Timestamp.QuadPart&nbsp;=&nbsp;KeQueryInterruptTime();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.ConnectionInfo&nbsp;=&nbsp;ConnectionInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp.Checksum&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__Checksum((PUSHORT)&amp;IcmpEchoPacket-&gt;IcmpEchoHeader.Icmp,&nbsp;<b>sizeof</b>(ICMP_ECHO_PACKET));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>return</b>&nbsp;SendPacket2(AdapterContext,&nbsp;(PUCHAR)IcmpEchoPacket,&nbsp;<b>sizeof</b>(ICMPECHOPACKET));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>return</b>&nbsp;STATUS_SUCCESS;<br />}<br /></div></td></tr></tbody></table><p><span><span>NDIS_STATUS&nbsp;SendPacket2(&nbsp;IN&nbsp;NDIS_HANDLE&nbsp;MiniportAdapterContext,<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;IN&nbsp;PUCHAR&nbsp;pPacketBuff,&nbsp;<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;IN&nbsp;UINT&nbsp;uPacketSize)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;NDIS_STATUS&nbsp;&nbsp;status&nbsp;=&nbsp;NDIS_STATUS_SUCCESS;<br />&nbsp;&nbsp;&nbsp;&nbsp;NDIS_PHYSICAL_ADDRESS&nbsp;HighestAcceptableAddress;<br />&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;&nbsp;VirtualAddress&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;PNDIS_BUFFER&nbsp;pNdisPacketBuffer&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;PSEND_RSVD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendRsvd&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;PNDIS_PACKET&nbsp;pNewPacket&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;PADAPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAdapt&nbsp;=&nbsp;(PADAPT)MiniportAdapterContext;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>if</b></span>(&nbsp;pAdapt&nbsp;==&nbsp;NULL&nbsp;||&nbsp;pPacketBuff&nbsp;==&nbsp;NULL&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>return</b></span>&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NdisAllocatePacket(&amp;status,&nbsp;&amp;pNewPacket,&nbsp;pAdapt-&gt;SendPacketPoolHandle);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>if</b></span>(status&nbsp;!=&nbsp;NDIS_STATUS_SUCCESS)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint(&quot;SendPacket2&nbsp;-&gt;&nbsp;NdisAllocatePacket&nbsp;failed\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>return</b></span>&nbsp;status;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;HighestAcceptableAddress.QuadPart&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;NdisAllocateMemory(&nbsp;&amp;VirtualAddress,&nbsp;uPacketSize,&nbsp;0,&nbsp;HighestAcceptableAddress&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>if</b></span>(status&nbsp;!=&nbsp;NDIS_STATUS_SUCCESS)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>return</b></span>&nbsp;status;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NdisAllocateBuffer(&nbsp;&amp;status,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;pNdisPacketBuffer,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAdapt-&gt;SendPacketPoolHandle,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualAddress,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uPacketSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>if</b></span>&nbsp;(NDIS_STATUS_SUCCESS&nbsp;!=&nbsp;status)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NdisFreeMemory(VirtualAddress,&nbsp;uPacketSize,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>return</b></span>&nbsp;status;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NdisMoveMemory(&nbsp;VirtualAddress,&nbsp;pPacketBuff,&nbsp;uPacketSize&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;NdisChainBufferAtFront(pNewPacket,&nbsp;pNdisPacketBuffer&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;SendRsvd&nbsp;=&nbsp;(PSEND_RSVD)(pNewPacket-&gt;ProtocolReserved);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SendRsvd-&gt;OriginalPkt&nbsp;=&nbsp;NULL;&nbsp;<span style="color: #786000;">//这样当发送包返回NDIS_STATUS_PENDING时需要在PtSendComplete释放相关资源时，通过判断</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #786000;">//&nbsp;SendRsvd-&gt;OriginalPkt来确定是否我们构造的数据包。</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pNewPacket-&gt;Private.Head-&gt;Next=NULL;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pNewPacket-&gt;Private.Tail=NULL;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NdisSetPacketFlags(pNewPacket,&nbsp;NDIS_FLAGS_DONT_LOOPBACK);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #786000;">//DbgPrint(&quot;NdisSend&nbsp;&nbsp;ACK&nbsp;\n&quot;);</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;NdisSend(&amp;status,&nbsp;pAdapt-&gt;BindingHandle,&nbsp;pNewPacket);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #786000;">//DbgPrint(&quot;NdisSend&nbsp;&nbsp;ACK&nbsp;status&nbsp;=&nbsp;0x%x\n&quot;,&nbsp;status);</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>if</b></span>(status&nbsp;!=&nbsp;NDIS_STATUS_PENDING)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uSendBufferLen;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PVOID&nbsp;pSendPacketBuffer&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NdisUnchainBufferAtFront(pNewPacket,&nbsp;&amp;pNdisPacketBuffer);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NdisQueryBufferSafe(pNdisPacketBuffer,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PVOID&nbsp;*)&amp;pSendPacketBuffer,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;uSendBufferLen,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HighPagePriority&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NdisFreeBuffer(pNdisPacketBuffer);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NdisFreeMemory(pSendPacketBuffer,&nbsp;uSendBufferLen,&nbsp;0);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NdisFreePacket(pNewPacket);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #1f3f81;"><b>return</b></span>&nbsp;status;<br /><br />}</span></span></p></span><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/ef37a71fc83dd5d7a68669f4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/ef37a71fc83dd5d7a68669f4.html#comment">查看评论</a>]]></description>
        <pubDate>2012年02月03日 星期五  11:43</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/ef37a71fc83dd5d7a68669f4.html</guid>
</item>

<item>
        <title><![CDATA[WINDBG内核调试，进程启动时在其入口点断下]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/532d16eecdf43b362cf534e0.html]]></link>
        <description><![CDATA[
		
		bp nt!NtTestAlert &quot;r $t0 = @@c++( ((nt!_EPROCESS*)@$proc)-&gt;ActiveThreads );.if(@$t0==1){r $t1=@@c++( ((nt!_ETHREAD*)@$thread)-&gt;Win32StartAddress);.printf\&quot;Win32StartAddress:\%x\\n\&quot;,@$t1;bp /p &nbsp;@$proc @$t1;g;}.else{g;}&quot;<p></p> <a href="http://hi.baidu.com/sysnap/blog/item/532d16eecdf43b362cf534e0.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/532d16eecdf43b362cf534e0.html#comment">查看评论</a>]]></description>
        <pubDate>2012年02月02日 星期四  16:45</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/532d16eecdf43b362cf534e0.html</guid>
</item>

<item>
        <title><![CDATA[拦截PRC/LPC不能随便返回状态码]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/70bafb31a882b206eac4af15.html]]></link>
        <description><![CDATA[
		
		<div>*** An Access Violation occurred in C:\Windows\system32\services.exe:</div><div>&nbsp;</div><div>The instruction at 76EE32CC tried to write to a NULL pointer</div><div>&nbsp;</div><div>&nbsp;*** enter .exr 00BCF5B0 for the exception record<br />&nbsp;***&nbsp; enter .cxr 00BCF5CC for the context<br />&nbsp;*** then kb to get the faulting stack</div><div>&nbsp;</div><div>Break instruction exception - code 80000003 (first chance)<br />ntdll!DbgBreakPoint:<br />001b:774e7dfe cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; 3</div><div>&nbsp;</div><div>kd&gt; u 76ee32cc<br />RPCRT4!RpcpStrictAlpcToRpcStatus+0x13:<br />76ee32cc 890d00000000&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr ds:[0],ecx<br />76ee32d2 b8e6060000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,6E6h</div><div>&nbsp;</div><div><strong>而RPC只接受下面的固定错误返回值</strong><br />kd&gt; dd 76430750<br />76430750&nbsp; 00000000 00000000 c0000037 000006be<br />76430760&nbsp; c0000703 000006be c0000017 0000000e<br />76430770&nbsp; c0000040 0000000e c0000097 0000000e<br />76430780&nbsp; c000009a 0000000e c00000a1 0000000e<br />76430790&nbsp; c0000007 0000000e c000012d 0000000e<br /><p>764307a0&nbsp; c0000702 000006be c0000022 000006be</p><p><strong>另外拒绝也不能简单返回DENY</strong></p></div><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/70bafb31a882b206eac4af15.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/70bafb31a882b206eac4af15.html#comment">查看评论</a>]]></description>
        <pubDate>2012年02月02日 星期四  16:31</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/70bafb31a882b206eac4af15.html</guid>
</item>

<item>
        <title><![CDATA[解决问题的基本态度和方法]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/a4b28846d28b73176a63e549.html]]></link>
        <description><![CDATA[
		
		<p>技术上有时会碰到一些问题，遂总结成几条（纯粹个人看法）。为什么它是个问题？你从什么角度觉得它是个问题。</p><p>基本态度：</p><p>1）不要试图同时去解决所有问题，找出最基本最迫切的。</p><p>2）用最高效简单的办法解决80%的问题而不是100%的问题。</p><p>3）解决问题之前先确认是不是自己的问题。</p><p>4）不是所有问题都能给出一个答案，有些问题的答案可遇不可求。</p><p>5）怎样做可以减少错误又能满足需求，而不是去解决所有可能的问题。</p><p>6）一件事，做了80%没做到100%并不代表就没做，不能有完美主义和理想主义情结。</p><p>7）一种解决办法可能会同时引入一些其他问题，有的时候只能这样。</p><p>7）学会放弃。</p><p>&nbsp;</p><p>基本方法：</p><p>定义: 为混乱定义规则，使变得简单。</p><p>替代：衡量代价，找出最高效的解决办法。</p><p>规避：只需要知道怎样做可以减少错误又能满足需求。</p><p>转移：转移矛盾，在云查杀还没出来之前，可能木马们大多不会去断网。</p><p>排除: 缩小问题的范围。</p><p>放弃：有许多事受到客观的限制，不可行的，暂时不能解决的，采用上面办法也无法解决的，放弃。</p><div><br /></div><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/a4b28846d28b73176a63e549.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/a4b28846d28b73176a63e549.html#comment">查看评论</a>]]></description>
        <pubDate>2012年01月15日 星期日  15:39</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/a4b28846d28b73176a63e549.html</guid>
</item>

<item>
        <title><![CDATA[防护的一些简单个人总结]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/2f66b829529021e099250a9a.html]]></link>
        <description><![CDATA[
		
		<p>1）不对称对抗</p><p>比如应用层跟应用层，驱动跟驱动对抗，那任意一方显然没有优势。安全的软件的优势就是: 先进入用户系统，进入内核，占据入口优势。所以应该坚守好这些优势。</p><p>2）信任关系</p><p>信任的单位越大，风险越大，处理逻辑也会越复杂。部分信任，有限制信任，而不是全信任是首选策略。另外信任关系所依赖的点也要把握好。</p><p>3）整体，个体</p><p>不为%0.01的问题，付出200%的维护精力，或者使本来简单的框架变得更复杂，防护是整套体系，而不是只依赖某个点。当一个点做强了的时候，这个点就不是被攻击最猛的点。寻找短板，优化整体框架以减少逻辑上的攻击。</p><p>4）及时响应速度</p><p>有什么机制去响应突发的威胁，把影响降到最低：尽量保护用户重要数据不被泄漏，破坏。</p><p>&nbsp;</p><p>最后，对抗是一个持续的过程，在这过程中防守一方只能增加攻击的难度，而不能消灭攻击，整个过程中保证用户机器稳定，性能始终是最重要的。</p><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/2f66b829529021e099250a9a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/2f66b829529021e099250a9a.html#comment">查看评论</a>]]></description>
        <pubDate>2012年01月12日 星期四  12:50</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/2f66b829529021e099250a9a.html</guid>
</item>

<item>
        <title><![CDATA[2011.11最近感悟]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/4d215309f9da999fd1581bff.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp; &nbsp;1) 人生旅途中往往会为一些事一些人而停留，如果最后还是要离开，那请别停留太久。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;2) 有时候为了走捷径，而花费了许多时间在寻找捷径上。</p><p>&nbsp;&nbsp;&nbsp; 3) 我们需要的是方向而不是目的地。</p><p>&nbsp;&nbsp;&nbsp; 4) 如果想突破现处的环境，首先不要指望能在这个环境得到更多。学会放弃。</p><p>&nbsp;&nbsp;&nbsp; 5) <span>希望之后就是等待, 如果希望是虚幻的，那等待便是没有尽头的。不要怕失望。有耐心去等，有勇气去追。</span></p><p><span>&nbsp;&nbsp;&nbsp;&nbsp;6) 有执着就必有错过，有得到就必有失去。</span></p><p><span>&nbsp;&nbsp;&nbsp; 7) <span>没有交集，距离再近，也只是檫肩而过。</span></span></p><p><span><span>&nbsp;&nbsp;&nbsp; 8) 
许多事情都如此，看着美好，听着美好，想着美好，但当自己身处其中时，便没有当初那种感觉了，大概美好的东西是不可触摸的，也无法寻找。</span></span></p><p><span><span><span>&nbsp;&nbsp;&nbsp; 
9）<span>我们做事情的初衷，即为了什么，很大程度上影响我们的态度，行为，心态，看事物的角度等。不同的初衷，做相同的事，结果也不同，去向也不同。所以从一个人的行为和心态可以推出内心看重的是什么。<br /><span><img src="http://hiphotos.baidu.com/sysnap/pic/item/8d1f5216e627336e972b4390.jpg" small="0" /></span><br /><br /></span></span></span></span></p><p></p> <a href="http://hi.baidu.com/sysnap/blog/item/4d215309f9da999fd1581bff.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/4d215309f9da999fd1581bff.html#comment">查看评论</a>]]></description>
        <pubDate>2011年11月12日 星期六  17:13</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/4d215309f9da999fd1581bff.html</guid>
</item>

<item>
        <title><![CDATA[PE LOADER，可运行MS自带的程序]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/a970c9363ba6a6c1a3cc2bc4.html]]></link>
        <description><![CDATA[
		
		<p>之前放着的代码，没啥用，干脆把以前的文档整理下发出来。<br />下面就是在实现一个PE&nbsp;LOADER过程中碰到的问题以及一些解决办法，更详细的请自己阅读代码，这个PE&nbsp;LOADER可以跑WINDOWS的大部分程序，在XP&nbsp;下几乎MS的程序都可以跑，包括NOTEPAD,&nbsp;REGEDIT,&nbsp;计算器等。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主要的问题如下<br /><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）FormatMessage<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）GetModuleFileName<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）msvcrt与参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4）TLS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5）捕获输出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6）地址被占用的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7）进程退出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8）命令行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9）重定向</strong><br />&nbsp;<br />Loader&nbsp;要做的事情<br />1）&nbsp;读取磁盘文件到内存<br />2）&nbsp;处理导入表，重定位表，资源表<br />3）&nbsp;CALL入口函数<br /><br />因为是加载EXE模块，XP的话默认加载基地址就是PE头种的ImageBase，这个地址空间一般状态是MEM_FREE，<br />XP<br />0:000&gt;&nbsp;!address&nbsp;0x01000000<br />&nbsp;&nbsp;&nbsp;&nbsp;003a3000&nbsp;:&nbsp;003a3000&nbsp;-&nbsp;5fc4d000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00000000&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Protect&nbsp;&nbsp;00000001&nbsp;PAGE_NOACCESS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;State&nbsp;&nbsp;&nbsp;&nbsp;00010000&nbsp;MEM_FREE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usage&nbsp;&nbsp;&nbsp;&nbsp;RegionUsageFree<br />所以申请这地址开始的内存成功概率很大，这种情况下Loader会变得比较简单，只需要处理导入表就可以，而WIN&nbsp;7因为采用了&nbsp;地址随机分布&nbsp;机制，EXE加载的地址不一定是ImageBase，ImageBase开始的内存已经被占用了<br />WIN&nbsp;7<br />Usage:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryMappedFile<br />Allocation&nbsp;Base:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00870000<br />Base&nbsp;Address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0096d000<br />End&nbsp;Address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;01470000&nbsp;；@@@@@@@@@@<br />Region&nbsp;Size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00b03000<br />Type:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00040000&nbsp;MEM_MAPPED<br />State:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00002000&nbsp;MEM_RESERVE<br />Protect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00000000&nbsp;<br />Mapped&nbsp;file&nbsp;name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PageFile<br />强制使用的后果是造成莫名的崩溃。<br />在XP为了让程序尽可能的在其默认加载的基地址运行，<br />需要减低ImageBase跟我们的EXE地址冲，解决办法就是我们编译的模块选一个加载的基地址。<br />这里我选的是&nbsp;0x5FFF0000，这个地址就可以避免跟要RUN的EXE模块的基地址冲突了，另外为了能在WIN&nbsp;7跑，还需要Disable&nbsp;Image&nbsp;Randomization&nbsp;(/DYNAMICBASE:NO)。为了避免DEP而导致出错，所以分配的内存的属性一律改为PAGE_EXECUTE_READWRITE<br />&nbsp;<br />1）FormatMessage<br />XP很多程序的字符串都放在资源中，这样只要访问资源就可以了。但WIN&nbsp;7中，很多字符串都是存在.MUI文件中而不是资源中。<br />因为微软的控制台程序几乎都会调用FormatMessage，所以这个函数如果失败，后面的功能就得不到执行。在WIN&nbsp;7中需要对这个API进行处理，因为它没有去访问资源而是.MUI文件。MUI文件一般放在SYSTEM32\ZH-CN\目录下<br />，文件对应的.MUI文件可以通过GetFileMUIPath来获取<br />注:如果操作系统是&nbsp;英文的或者其他语言的，那就不是ZH-CN了，具体可以通过API&nbsp;<br />BOOL&nbsp;SetThreadPreferredUILanguages(<br />&nbsp;&nbsp;DWORD&nbsp;&nbsp;dwFlags,<br />&nbsp;&nbsp;PCWSTR&nbsp;&nbsp;pwszLanguagesBuffer,<br />&nbsp;&nbsp;PULONG&nbsp;&nbsp;pulNumLanguages<br />);来获取。<br />.MUI加载的时机<br />.MUI加载的时机是比较早的，也就是在进入MAIN之前被LDR给加载了。arp为例子，当运行arp.exe时，LdrpRunInitializeRoutines就会加载arp.exe.mui这个文件，然后才会进入到MAIN函数里面。<br />问题来了，因为我们自己加载要运行的模块，并没有走LdrpRunInitializeRoutines，自然我们进程空间就没有相应的.mui文件。解决办法就是需要自己LoadLibraryEx(RUN_IMAGE_FILE_PATH,&nbsp;NULL,&nbsp;NULL);一下。。最主要就是获取&nbsp;.MUI文件的全路径。<br />DWORD&nbsp;WINAPI&nbsp;FormatMessage(<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwFlags,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPCVOID&nbsp;lpSource,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwMessageId,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwLanguageId,<br />&nbsp;&nbsp;__out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpBuffer,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;nSize,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list*&nbsp;Arguments<br />);<br />对访问.MUI获取字符串来说，dwFlags必须是要有FORMAT_MESSAGE_FROM_HMODULE<br />，所以这个标志是我们判断的重要依据。MS自己的lpSource传入为NULL，这样它会自动访问.MUI文件。而如果.MUI是我们自己加载的，那传入NULL无疑会导致失败，没能找到资源。所以需要HOOK这个API把lpSource改成我们LOAD&nbsp;.MUI文件的内存地址。<br />&nbsp;<br />&nbsp;<br />2）GetModuleFileName<br />崩溃<br />7282f0ef&nbsp;ff766c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[esi+6Ch]<br />7282f0f2&nbsp;ff1568838372&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[MFC42u!_imp__GetModuleFileNameW&nbsp;(72838368)]<br />7282f0f8&nbsp;8d8584010000&nbsp;&nbsp;&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,[ebp+184h]<br />7282f0fe&nbsp;6a2e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;2Eh<br />7282f100&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br />7282f101&nbsp;ff1558878372&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[MFC42u!_imp__wcsrchr&nbsp;(72838758)]<br />7282f107&nbsp;66832000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;word&nbsp;ptr&nbsp;[eax],0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds:0023:00000000=????<br />eax&nbsp;=&nbsp;0，可见GetModuleFileNameW返回的是NULL，而微软又没有对这个函数的返回值进行判断。所以导致崩溃。<br />为什么GetModuleFileNameW会崩溃呢？<br />GetModuleFileName的定义<br />DWORD&nbsp;WINAPI&nbsp;GetModuleFileName(<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HMODULE&nbsp;hModule,<br />&nbsp;&nbsp;__out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpFilename,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;nSize<br />);<br /><br />跟进去看堆栈<br />0:000&gt;&nbsp;kvnf<br />&nbsp;#&nbsp;&nbsp;&nbsp;Memory&nbsp;&nbsp;ChildEBP&nbsp;RetAddr&nbsp;&nbsp;Args&nbsp;to&nbsp;Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0012f650&nbsp;7282f0f8&nbsp;01000000&nbsp;0012f874&nbsp;00000104&nbsp;kernel32!GetModuleFileNameW&nbsp;(FPO:&nbsp;[Non-Fpo])<br />传入的&nbsp;&nbsp;&nbsp;hModule&nbsp;的值是&nbsp;01000000，注意这个值不是我们主程序的基地址，而是被RUN的EXE得基地址。<br />接着看<br />GetModuleFileName内部实现：<br />.text:7C80B458&nbsp;loc_7C80B458:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;GetModuleFileNameW(x,x,x)+85j<br />.text:7C80B458&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ebp+var_38],&nbsp;esi<br />.text:7C80B45B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;[ebp+var_24]<br />.text:7C80B45E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;[esi+18h]<br />.text:7C80B461&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;loc_7C80B481<br />.text:7C80B463&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,&nbsp;[esi]<br />.text:7C80B465<br />.text:7C80B465&nbsp;loc_7C80B465:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;GetModuleFileNameW(x,x,x)+54j<br />.text:7C80B465&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ebp+var_2C],&nbsp;esi<br />.text:7C80B468&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,&nbsp;eax<br />.text:7C80B46A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;loc_7C80B458<br />..........<br />.text:7C80B413&nbsp;loc_7C80B413:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;GetModuleFileNameW(x,x,x)+1C9j<br />.text:7C80B413&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;GetModuleFileNameW(x,x,x)+35979j<br />.text:7C80B413&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;[ebp+var_1C]<br />.text:7C80B416&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br />.text:7C80B417&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br />.text:7C80B418&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;1<br />.text:7C80B41A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;_LdrLockLoaderLock@12&nbsp;;&nbsp;LdrLockLoaderLock(x,x,x)<br />.text:7C80B41F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ebp+ms_exc.disabled],&nbsp;edi<br />.text:7C80B422&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;large&nbsp;fs:18h&nbsp;；@@@@@@@@@@&nbsp;TEB<br />.text:7C80B428&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ebp+var_30],&nbsp;eax<br />.text:7C80B42B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;[eax+30h]&nbsp;；@@@@@@@@PEB<br />.text:7C80B42E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;[eax+0Ch]&nbsp;；&nbsp;@@@@@@@@&nbsp;_PEB_LDR_DATA<br />.text:7C80B431&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;0Ch&nbsp;；@@@@@@@@&nbsp;nLoadOrderModuleList&nbsp;:&nbsp;_LIST_ENTRY<br />.text:7C80B434&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ebp+var_34],&nbsp;eax<br />.text:7C80B437&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,&nbsp;[eax]<br />.text:7C80B439&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;loc_7C80B465<br />nLoadOrderModuleList&nbsp;链表中成员的结构是：<br />typedef&nbsp;struct&nbsp;_LDR_MODULE<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;LIST_ENTRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InLoadOrderModuleList;&nbsp;&nbsp;&nbsp;+0x00<br />&nbsp;&nbsp;&nbsp;&nbsp;LIST_ENTRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InMemoryOrderModuleList;&nbsp;+0x08&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LIST_ENTRY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InInitializationOrderModuleList;&nbsp;+0x10<br />&nbsp;&nbsp;&nbsp;&nbsp;void*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BaseAddress;&nbsp;&nbsp;+0x18<br />&nbsp;&nbsp;&nbsp;&nbsp;void*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EntryPoint;&nbsp;&nbsp;&nbsp;+0x1c<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SizeOfImage;<br />&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FullDllName;<br />&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BaseDllName;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flags;<br />&nbsp;&nbsp;&nbsp;&nbsp;SHORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;SHORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TlsIndex;<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SectionHandle;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckSum;<br />&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeDateStamp;<br />}&nbsp;LDR_MODULE,&nbsp;*PLDR_MODULE;<br />可见&nbsp;GetModuleFileName是通过遍历LoadOrderModuleList，然后看hModule&nbsp;跟LDR_MODULE：：BaseAddress&nbsp;相等，相等的话就取出里面的FullDllName。但由于我们传入的hModule是被处理过的，所以自然在链表里找不到导致返回NULL，而返回之后MS又不做判断就直接引用返回值，导致崩溃。<br />&nbsp;<br />&nbsp;<br />3）msvcrt与参数<br />WIN&nbsp;7&nbsp;ARP.EXE<br />.text:0100239E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword_1005968<br />.text:010023A4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword_1005960<br />.text:010023AA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;_main<br />msvcrt.dll&nbsp;第一次被加载的时候，会调用GetCommandLine来获取当前参数，然后进行处理填充msvcrt的内部变量&nbsp;<br />msvcrt!__argc&nbsp;和&nbsp;msvcrt!__argv。之后通过__getmainargs,&nbsp;__wgetmainargs就可以获取到相应参数，这时候并不会再走GetCommandLine。WIN&nbsp;7的ARP.EXE获取命令行参数就是通过__getmainargs。因为msvcrt.dll在进程运行的时候已经被加载，所以无法拦截到GetCommandLine.&nbsp;俩个参数在LOAD&nbsp;msvcrt.dll时被初始化。。WIN&nbsp;7每个进程一运行就会加载这个DLL.所以需要自己HOOK&nbsp;__getmainargs,&nbsp;__wgetmainargs<br />&nbsp;<br />&nbsp;<br />4）TLS<br />0100887a&nbsp;648b0d2c000000&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,dword&nbsp;ptr&nbsp;fs:[2Ch]<br />01008881&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;esi<br />01008882&nbsp;8d3481&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,[ecx+eax*4]<br />01008885&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br />01008886&nbsp;8b3e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,dword&nbsp;ptr&nbsp;[esi]&nbsp;&nbsp;ds:0023:00000000=????????<br />01008888&nbsp;83bf0400000000&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[edi+4],0<br /><br />因为是&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,dword&nbsp;ptr&nbsp;fs:[2Ch]&nbsp;访问TEB&nbsp;的&nbsp;ThreadLocalStoragePointer，&nbsp;如果我们没模拟LOADER初始话得话就会失败。。。所以需要自己分析TLS目录获取数据，填到内存，然后修改&nbsp;ThreadLocalStoragePointer指针。其实只需要分配合适空间大小就可以。。里面的内容程序自己会添加，如果你得程序没使用TLS，那你得线程的ThreadLocalStoragePointer就为NULL，显然如果要跑的程序使用TLS，那访问该地方就蹦而了<br />void&nbsp;LdrInitThreadTls(PIMAGE_TLS_DIRECTORY&nbsp;pTlsDir)<br />{<br />&nbsp;PVOID&nbsp;*ThreadLocalStoragePointer&nbsp;=&nbsp;NULL;<br />&nbsp;UCHAR&nbsp;*pData&nbsp;=&nbsp;NULL;<br />&nbsp;ULONG&nbsp;TlsSize&nbsp;=&nbsp;0;<br />&nbsp;ULONG&nbsp;TlsInitDataSize&nbsp;=&nbsp;0;<br />&nbsp;TlsInitDataSize&nbsp;=&nbsp;pTlsDir-&gt;EndAddressOfRawData&nbsp;-&nbsp;pTlsDir-&gt;StartAddressOfRawData;&nbsp;<br />&nbsp;TlsSize&nbsp;=&nbsp;(pTlsDir-&gt;EndAddressOfRawData&nbsp;-&nbsp;pTlsDir-&gt;StartAddressOfRawData)&nbsp;+&nbsp;pTlsDir-&gt;SizeOfZeroFill;<br />&nbsp;ThreadLocalStoragePointer&nbsp;=&nbsp;(PVOID*)malloc(TlsSize+&nbsp;sizeof(PVOID));<br />&nbsp;pData&nbsp;=&nbsp;(UCHAR*)ThreadLocalStoragePointer&nbsp;+&nbsp;sizeof(PVOID);<br />&nbsp;pData&nbsp;=&nbsp;(UCHAR*)ThreadLocalStoragePointer&nbsp;;<br />&nbsp;memcpy(&nbsp;pData,&nbsp;(void&nbsp;*)pTlsDir-&gt;StartAddressOfRawData,&nbsp;TlsInitDataSize&nbsp;);<br />&nbsp;memset(&nbsp;pData&nbsp;+&nbsp;TlsInitDataSize,&nbsp;0,&nbsp;pTlsDir-&gt;SizeOfZeroFill&nbsp;);<br />&nbsp;NtCurrentTeb()-&gt;ThreadLocalStoragePointer&nbsp;=&nbsp;ThreadLocalStoragePointer;<br />&nbsp;*(PVOID*)ThreadLocalStoragePointer&nbsp;=&nbsp;ThreadLocalStoragePointer;<br />}<br />&nbsp;<br />5）捕获输出<br />MS控制台的输出不是用printf，而是fprintf<br />.text:0100215B&nbsp;loc_100215B:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;_PutMsg+5Ej<br />.text:0100215B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dl,&nbsp;[eax]<br />.text:0100215D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax<br />.text:0100215E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;dl,&nbsp;dl<br />.text:01002160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jnz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;loc_100215B<br />.text:01002162&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;ecx<br />.text:01002164&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;cchDstLength<br />.text:01002165&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp+lpszSrc]&nbsp;;&nbsp;lpszDst<br />.text:01002168&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp+lpszSrc]&nbsp;;&nbsp;lpszSrc<br />.text:0100216B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;ds:__imp__CharToOemBuffA@12&nbsp;;&nbsp;CharToOemBuffA(x,x,x)<br />.text:01002171&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp+lpszSrc]<br />.text:01002174&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;aS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&quot;%s&quot;<br />.text:01002179&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;File<br />.text:0100217A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;ds:__imp__fprintf<br />.text:01002180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,&nbsp;0Ch<br />.text:01002183&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp+lpszSrc]&nbsp;;&nbsp;hMem<br />.text:01002186&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;ds:__imp__LocalFree@4&nbsp;;&nbsp;LocalFree(x)<br />.text:0100218C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;edi<br />.text:0100218E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi<br />所以只要&nbsp;IAT&nbsp;HOOK&nbsp;fprintf就可以。<br />&nbsp;<br />6）地址被占用的问题<br />PELOADER地址被占用的问题<br />问题引人<br />LOADER要加载一个EXE文件，这个EXE文件加载的地址是在0x400000。在我们LOADER的MAIN函数里面，这个地址已经被占用，而你是不能去Free这个地址重新分布的，这样可能会导致程序崩溃。<br />问题产生<br />LOADER引用了一些DLL里面的API，这样导入表里会出现这些DLL，当你LOADER运行的时候，系统会帮你加载这些DLL，这些DLL会进行初始话，创建线程等操作，那地址被占用的概率是非常大的。这个也是在TLS执行之前的。<br />问题解决<br />1）延迟加载DLL，保证导入表中只有kernel32.dll<br />2)不要使用MFC，因为这个时候很难有机会占用要加载的地址<br />3）用驱动HOOK&nbsp;分配内存的函数，禁止其分配某个地址开始的一片地址。<br />如果要使用MFC写LOADER，那唯一的办法就是<br />延迟加载DLL，保证导入表中只有kernel32.dll<br />接着挂起创建自己，分配保留内存，退出。<br />&nbsp;<br />&nbsp;<br />7）进程退出<br />问题：<br />当在内存中运行的程序，比如arp.EXE执行完之后就会退出，那结果是ExitProcess被调用，那将是我们主进程也结束，显然我们不希望这样。<br />处理办法：HOOK&nbsp;ExitProcess。问题来了<br />对MS的许多控制台程序，它们退出都是调用exit<br />&nbsp;#&nbsp;&nbsp;&nbsp;Memory&nbsp;&nbsp;ChildEBP&nbsp;RetAddr&nbsp;&nbsp;Args&nbsp;to&nbsp;Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;003ef554&nbsp;7c92df5a&nbsp;7c939b23&nbsp;000007f4&nbsp;00000000&nbsp;ntdll!KiFastSystemCallRet&nbsp;(FPO:&nbsp;[0,0,0])<br />01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;003ef558&nbsp;7c939b23&nbsp;000007f4&nbsp;00000000&nbsp;00000000&nbsp;ntdll!NtWaitForSingleObject+0xc&nbsp;(FPO:&nbsp;[3,0,0])<br />02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;88&nbsp;003ef5e0&nbsp;7c921046&nbsp;00c31ae8&nbsp;77c0a5eb&nbsp;77c31ae8&nbsp;ntdll!RtlpWaitForCriticalSection+0x132&nbsp;(FPO:&nbsp;[Non-Fpo])<br />03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;003ef5e8&nbsp;77c0a5eb&nbsp;77c31ae8&nbsp;7c8099cf&nbsp;003ef608&nbsp;ntdll!RtlEnterCriticalSection+0x46&nbsp;(FPO:&nbsp;[1,0,0])<br />04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;003ef5f8&nbsp;77c09de8&nbsp;00000008&nbsp;7c8099cf&nbsp;003ef61c&nbsp;msvcrt!_lock+0x30&nbsp;(FPO:&nbsp;[Non-Fpo])<br />05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;003ef608&nbsp;77c09e90&nbsp;00000000&nbsp;00000000&nbsp;00000000&nbsp;msvcrt!_cinit+0x5e&nbsp;(FPO:&nbsp;[Non-Fpo])<br />06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;003ef61c&nbsp;01002735&nbsp;00000000&nbsp;00000000&nbsp;003efbc4&nbsp;msvcrt!exit+0x12&nbsp;(FPO:&nbsp;[Non-Fpo])<br /><br />里面持有了一个锁，所以如果HOOK&nbsp;ExitProcess，&nbsp;那我们俩次在内存中运行arp.EXE之后就会死锁。所以对这类程序而言，不能HOOK&nbsp;ExitProcess，只能HOOK&nbsp;msvcrt!exit<br /><br />另外还需要一个技巧，在内存运行的程序由我们EXE的一个线程来完成，否则HOOK&nbsp;msvcrt!exit也没办法处理好逻辑<br />void&nbsp;Fakeexit(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;status&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;)<br />{<br />&nbsp;if(&nbsp;status&nbsp;==&nbsp;0xbeebee&nbsp;)<br />&nbsp;&nbsp;Oldexit(status);<br />&nbsp;ExitThread(0xbeebee);<br />}<br />&nbsp;<br />因为是创建的线程，所以只需要替换成ExitThread(0xbeebee);之后，进程退出这动作就被捕获了，然后我们替exit代为ExitThread(0xbeebee)后线程就退出返回控制到我们主EXE模块而不会出错。另外创建线程时要自己注意堆栈问题，否则堆栈可能会占用我们要放EXE的地址空间，导致失败，所以必须先分配内存空间后才能创建线程。<br />&nbsp;<br />&nbsp;<br />8）命令行<br />MIAN的参数怎样压的？<br /><br />int&nbsp;__cdecl&nbsp;_tmainCRTStartup()<br />.text:60022B50&nbsp;;&nbsp;int&nbsp;__cdecl&nbsp;_tmainCRTStartup()<br />//<br />//调用GetCommandLineA之后调用setargv设置命令行，其实就是设置内部变量___argv和___argc，之后PUSH这俩个变量，在CALL&nbsp;MAIN<br />//<br />.text:60022BE8&nbsp;loc_60022BE8:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;__tmainCRTStartup+8Cj<br />.text:60022BE8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;ds:__imp__GetCommandLineA@0&nbsp;;&nbsp;GetCommandLineA()<br />.text:60022BEE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__acmdln,&nbsp;eax<br />.text:60022BF3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;j____crtGetEnvironmentStringsA<br />.text:60022BF8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__aenvptr,&nbsp;eax<br />.text:60022BFD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;j___setargv<br /><br />....<br />.text:60022C42&nbsp;loc_60022C42:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;__tmainCRTStartup+E4j<br />.text:60022C42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;__environ<br />.text:60022C48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___initenv,&nbsp;ecx<br />.text:60022C4E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx,&nbsp;__environ<br />.text:60022C54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edx<br />.text:60022C55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;___argv&nbsp;;@@@@@@@@@内部变量<br />.text:60022C5A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br />.text:60022C5B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;___argc&nbsp;&nbsp;;@@@@@@@@@内部变量<br />.text:60022C61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ecx<br />.text:60022C62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;j__main<br />&nbsp;<br />int&nbsp;__cdecl&nbsp;_setargv()<br />.text:60031F40&nbsp;;&nbsp;int&nbsp;__cdecl&nbsp;_setargv()<br />.text:60031F40&nbsp;__setargv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;near&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;j___setargvj<br />.text:60031F6E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;hModule<br />.text:60031F70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;ds:__imp__GetModuleFileNameA@12&nbsp;;&nbsp;GetModuleFileNameA(x,x,x)<br />.text:60031F76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;_pgmname&nbsp;;&nbsp;_Value<br />.text:6003201B&nbsp;loc_6003201B:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;CODE&nbsp;XREF:&nbsp;__setargv+D4j<br />.text:6003201B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;[ebp+numchars]<br />.text:6003201E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;numchars<br />.text:6003201F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx,&nbsp;[ebp+numargs]<br />.text:60032022&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;numargs<br />.text:60032023&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;[ebp+numargs]<br />.text:60032026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;[ebp+p]<br />.text:60032029&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx,&nbsp;[ecx+eax*4]<br />.text:6003202C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;args<br />.text:6003202D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;[ebp+p]<br />.text:60032030&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;argv<br />.text:60032031&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,&nbsp;[ebp+cmdstart]<br />.text:60032034&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;cmdstart<br />.text:60032035&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;parse_cmdline<br />.text:6003203A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,&nbsp;14h<br />.text:6003203D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx,&nbsp;[ebp+numargs]<br />.text:60032040&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx,&nbsp;1<br />.text:60032043&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___argc,&nbsp;edx&nbsp;&nbsp;;@@@@@@@@@内部变量<br />.text:60032049&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;[ebp+p]<br />.text:6003204C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;___argv,&nbsp;eax&nbsp;;@@@@@@@@@内部变量<br />.text:60032051&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,&nbsp;eax<br /><br />kernel32!GetCommandLineA:<br />7c812fbd&nbsp;a1f455887c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[kernel32!BaseAnsiCommandLine+0x4&nbsp;(7c8855f4)]&nbsp;ds:0023:7c8855f4=00151ee0<br />kernel32!GetCommandLineW:<br />7c817023&nbsp;a10450887c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[kernel32!BaseUnicodeCommandLine+0x4&nbsp;(7c885004)]<br />7c817028&nbsp;c3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret<br />可见他们没走PEB。HOOK&nbsp;&nbsp;GetCommandLine或者修改BaseAnsiCommandLine，BaseUnicodeCommandLine就可以捕获或者修改命令行传入的命令行<br />&nbsp;<br />&nbsp;<br />9)重定向<br />因为是加载EXE模块，XP的话默认加载基地址就是PE头种的ImageBase，而WIN&nbsp;7因为采用了&nbsp;地址随机分布&nbsp;机制，EXE加载的地址不一定是<br />ImageBase。<br />所以需要重定向，但这里有个问题，就是加了/GS编译选项后编译出来的EXE会有问题。<br />在进入MAIN函数之前会执行这么一段代码<br />60022e60&nbsp;8bff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,edi<br />60022e62&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebp<br />60022e63&nbsp;8bec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp,esp<br />60022e65&nbsp;e84ba6ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;_________!ILT+1200(___security_init_cookie)&nbsp;(6001d4b5)<br />60022e6a&nbsp;e811000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;_________!__tmainCRTStartup&nbsp;(60022e80)<br />_________!__security_init_cookie:<br />600312f0&nbsp;8bff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,edi<br />600312f2&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebp<br />600312f3&nbsp;8bec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp,esp<br />600312f5&nbsp;83ec18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,18h<br />600312f8&nbsp;c745f800000000&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-8],0<br />600312ff&nbsp;c745fc00000000&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-4],0<br />60031306&nbsp;813d38d108604ee640bb&nbsp;cmp&nbsp;dword&nbsp;ptr&nbsp;[_________!__security_cookie&nbsp;(6008d138)],0BB40E64Eh<br />...........<br /><br />里面会引用许多security&nbsp;cookie的全局变量，而这些变量没有在重定向表里，所以如果加载的&nbsp;地址不是PE头种的ImageBase，就会出现访问错误，导致崩溃。<br />解决办法：<br /><br />不要加载到&nbsp;PE头的ImageBase&nbsp;以外的地址。那如果跟我们的EXE地址冲突怎么办？&nbsp;解决办法就是我们编译的模块选一个加载的基地址。<br />这里我选的是&nbsp;0x5FFF0000，这个地址就可以避免跟要RUN的EXE模块的基地址冲突了，另外为了能在WIN&nbsp;7跑，还需要Disable&nbsp;Image&nbsp;Randomization&nbsp;(/DYNAMICBASE:NO)。&nbsp;为了避免DEP而导致出错，所以分配的内存的属性一律改为<br />PAGE_EXECUTE_READWRITE</p><p>&nbsp;</p><p><strong><span style="color: #ff0000; background-color: #ffffff;">代码 http://bbs.pediy.com/showthread.php?t=141891</span></strong></p> <a href="http://hi.baidu.com/sysnap/blog/item/a970c9363ba6a6c1a3cc2bc4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/a970c9363ba6a6c1a3cc2bc4.html#comment">查看评论</a>]]></description>
        <pubDate>2011年10月25日 星期二  18:51</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/a970c9363ba6a6c1a3cc2bc4.html</guid>
</item>

<item>
        <title><![CDATA[关于IDebugSymbols]]></title>
        <link><![CDATA[http://hi.baidu.com/sysnap/blog/item/5df2241e856ed30340341737.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp;&nbsp; 最近写个个人小东西需要用到符号相关的一些东西，为图方便想直接用 IDebugSymbols，奈何在调用StartSymbolMatch时死活失败，发现出错是在</p><p>.text:0212343B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ?g_EngineNesting@@3KA, eax ; ulong g_EngineNesting<br /><strong>.text:02123440&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ?g_Process@@3PAVProcessInfo@@A, 0 ; ProcessInfo * g_Process</strong><br />.text:02123447&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; short loc_212345A<br />.text:02123449&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_C], 8000FFFFh<br />.text:02123450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp; loc_21235E3</p><p>也就是是在调用该方式之前先要有一个TARGET，可以是DUMP文件，也可以是应用程序，总之就是不能直接用，用了也只能得到TARGET里有的模块的符号信息</p><p>&nbsp;</p><p><strong>结论：单独解析PDB不适合用IDebugSymbols，还是用DIA SDK吧</strong></p><p>&nbsp; </p> <a href="http://hi.baidu.com/sysnap/blog/item/5df2241e856ed30340341737.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/sysnap/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/sysnap/blog/item/5df2241e856ed30340341737.html#comment">查看评论</a>]]></description>
        <pubDate>2011年10月09日 星期日  14:30</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[Sysnap]]></author>
		<guid>http://hi.baidu.com/sysnap/blog/item/5df2241e856ed30340341737.html</guid>
</item>


</channel>
</rss>
