<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[轩辕小聪的blog]]></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/yicong2007</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[OGAEXEC.exe对GetSecurityDescriptorDacl函数的调用结果理解错误导致拒绝服务]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/d879c5a2b9bb76a7caefd04c.html]]></link>
        <description><![CDATA[
		
		<p><strong><font color="#0000ff">摘要：新版Office正版增值计划通知程序组件OGAEXEC.exe在读取odataext.dat文件的安全描述符及其中的DACL内容的过程中，在调用GetSecurityDescriptorDacl后的判断中，忽略了lpbDaclPresent为TRUE而pDacl为NULL的情况，导致直接使用NULL的pDacl指针调用GetAclInformation，从而触发了一个access violation(0xC0000005)，导致程序出错退出。</font></strong></p>
<p>国庆回来，打开电脑，Windows Update更新了OGA通知（KB949810）的一个新版本。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/yicong2007/pic/item/081ee20338d1b0c109fa933e.jpg"><br>
更新完后重启电脑，登录进入桌面时OGAEXEC.exe进程出现错误提示，0x7c94cede处访问的0x00000000内存不能为Read。</p>
<p>网上搜索一下，发现这个问题八月底就有人在微软论坛反映了：<br>
<a href="http://social.microsoft.com/Forums/en-US/genuineoffice/thread/3448c562-7799-45ec-ac41-a3fd4c36c45b">http://social.microsoft.com/Forums/en-US/genuineoffice/thread/3448c562-7799-45ec-ac41-a3fd4c36c45b</a><br>
用户向微软反馈后，微软提供的方法是要求用户取消任务计划中的OGALogon.job，相当于取消这个验证功能来避免这个提示。这说明确实是OGA程序自己的问题。</p>
<p>为了看到问题在哪里，我再次重启电脑，当错误提示出现时点&ldquo;取消&rdquo;，激活了作为JIT调试器的WINDBG：</p>
<p>(bc0.7f0): Access violation - code c0000005 (!!! second chance !!!)<br>
eax=0006fe58 ebx=0000ffff ecx=0006fe64 edx=0006fe80 esi=00000000 edi=80070000<br>
eip=7c94cede esp=0006fe18 ebp=0006fe1c iopl=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  nv up ei pl nz na po nc<br>
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  efl=00000202<br>
ntdll!RtlQueryInformationAcl+0x9:<br>
7c94cede 8a06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  al,byte ptr [esi]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ds:0023:00000000=??</p>
<p>0:000&gt; u ntdll!RtlQueryInformationAcl<br>
ntdll!RtlQueryInformationAcl:<br>
7c94ced5 8bff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi,edi<br>
7c94ced7 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp<br>
7c94ced8 8bec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebp,esp<br>
7c94ceda 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  esi<br>
7c94cedb 8b7508&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  esi,dword ptr [ebp+8]<br>
7c94cede 8a06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  al,byte ptr [esi]<br>
7c94cee0 3c02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  al,2<br>
7c94cee2 7256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ntdll!RtlQueryInformationAcl+0x7d (7c94cf3a)</p>
<p>这个Access Violation是在ntdll!RtlQueryInformationAcl中触发的，原因是这时传入的pAcl参数为NULL。</p>
<p>0:000&gt; kb<br>
ChildEBP RetAddr Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
0006fe1c 77dc7e8f 00000000 0006fe58 0000000c ntdll!RtlQueryInformationAcl+0x9<br>
*** ERROR: Module load completed but symbols could not be loaded for C:\WINDOWS\system32\OGAEXEC.exe<br>
WARNING: Stack unwind information not available. Following frames may be wrong.<br>
0006fe34 01004b5a 00000000 0006fe58 0000000c ADVAPI32!GetAclInformation+0x17<br>
0006fe88 01006b12 00096d28 00000000 0006fec4 OGAEXEC+0x4b5a<br>
0006febc 010090d6 00724e08 0006fed0 00000000 OGAEXEC+0x6b12<br>
0006fed8 0100a183 01034320 00cc0004 00000000 OGAEXEC+0x90d6<br>
0006ff10 0100a49e 00000001 00000000 00020b3e OGAEXEC+0xa183<br>
0006ffa8 0101f9fb 019df984 019df9a4 7ffdb000 OGAEXEC+0xa49e<br>
0006ffc0 7c817077 019df984 019df9a4 7ffdb000 OGAEXEC+0x1f9fb<br>
0006fff0 00000000 0101f984 00000000 78746341 kernel32!BaseProcessStart+0x23</p>
<p>调用是从ADVAPI32!GetAclInformation进来的，ADVAPI32!GetAclInformation只是直接把参数push一遍然后传给了ntdll!RtlQueryInformationAcl，从上面信息看到传入ADVAPI32!GetAclInformation的pAcl参数就是NULL，根据MSDN，这必然会引发Access Violation：</p>
<p>The GetAclInformation function retrieves information about an access control list (ACL).</p>
<p><br>
BOOL GetAclInformation(<br>
PACL pAcl,<br>
LPVOID pAclInformation,<br>
DWORD nAclInformationLength,<br>
ACL_INFORMATION_CLASS dwAclInformationClass<br>
);</p>
<p>Parameters<br>
pAcl <br>
[in] A pointer to an ACL. The function retrieves information about this ACL. If a null value is passed, the function causes an access violation.</p>
<p>显然，这说明OGAEXEC.exe不应该在pAcl为NULL的情况下调用ADVAPI32!GetAclInformation（或者如果知道pAcl在调用时有可能为NULL的话，就应该搞个异常处理）。</p>
<p>进一步对OGAEXEC.exe的分析表明，OGAEXEC.exe调用该函数是为了获得文件odataext.dat的DACL信息。</p>
<p>具体地来说，OGAEXEC.exe调用GetFileSecurityW获取文件C:\Documents and Settings\All Users\Application Data\Office Genuine Advantage\data\odataext.dat的SecurityDescriptor：</p>
<p>.text:01006AD0<br>
.text:01006AD0 loc_1006AD0:&nbsp;&nbsp;&nbsp;&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 XREF: sub_1006A24+A0 j<br>
.text:01006AD0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+nLengthNeeded]<br>
.text:01006AD3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; lpnLengthNeeded<br>
.text:01006AD4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  [ebp+nLengthNeeded] ; nLength<br>
.text:01006AD7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_4], edi<br>
.text:01006ADA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; pSecurityDescriptor<br>
.text:01006ADB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  DACL_SECURITY_INFORMATION ; RequestedInformation<br>
.text:01006ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  [ebp+lpFileName] ; lpFileName<br>
.text:01006AE0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  esi ; GetFileSecurityW</p>
<p>然后对得到的SecurityDescriptor，调用GetSecurityDescriptorDacl获得其中的DACL：</p>
<p>.text:01004AF5<br>
.text:01004AF5 loc_1004AF5:&nbsp;&nbsp;&nbsp;&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 XREF: sub_1004AC0+27 j<br>
.text:01004AF5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebx<br>
.text:01004AF6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edi<br>
.text:01004AF7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+bDaclDefaulted]<br>
.text:01004AFA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; lpbDaclDefaulted<br>
.text:01004AFB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+pAcl]<br>
.text:01004AFE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; pDacl<br>
.text:01004AFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+bDaclPresent]<br>
.text:01004B02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; lpbDaclPresent<br>
.text:01004B03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  [ebp+SecurityDescriptor] ; pSecurityDescriptor<br>
.text:01004B06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:GetSecurityDescriptorDacl<br>
.text:01004B0C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:01004B0E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, 0FFFFh<br>
.text:01004B13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, 80070000h<br>
.text:01004B18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_1004B33<br>
.text:01004B18</p>
<p>对GetSecurityDescriptorDacl调用成功后的输出，OGAEXEC.exe做了这样的判断</p>
<p>.text:01004B33<br>
.text:01004B33 loc_1004B33:&nbsp;&nbsp;&nbsp;&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 XREF: sub_1004AC0+58 j<br>
.text:01004B33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+bDaclPresent], esi ; esi is NULL<br>
.text:01004B36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_1004B49 ; if bDaclPresent is TRUE, pAcl can also be NULL<br>
.text:01004B36<br>
.text:01004B38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+pAcl], esi<br>
.text:01004B3B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_1004B49<br>
.text:01004B3B<br>
.text:01004B3D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_4], 8000FFFFh<br>
.text:01004B44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  loc_1004C6E<br>
.text:01004B44</p>
<p>OGAEXEC.exe的以上判断逻辑认为，只要返回的bDaclPresent为TRUE，那么返回的pAcl值就一定非NULL，只有bDaclPresent为FALSE才需要对pAcl是否为NULL进行判断，这样在bDaclPresent为TRUE的情况下，直接就对该pAcl值调用了GetAclInformation：</p>
<p>.text:01004B49 ; ---------------------------------------------------------------------------<br>
.text:01004B49<br>
.text:01004B49 loc_1004B49:&nbsp;&nbsp;&nbsp;&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 XREF: sub_1004AC0+76 j<br>
.text:01004B49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_1004AC0+7B j<br>
.text:01004B49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; dwAclInformationClass<br>
.text:01004B4B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  0Ch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; nAclInformationLength<br>
.text:01004B4D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+pAclInformation]<br>
.text:01004B50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; pAclInformation<br>
.text:01004B51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  [ebp+pAcl]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; pAcl<br>
.text:01004B54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:GetAclInformation ; cause access violation<br>
.text:01004B5A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:01004B5C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_1004B77</p>
<p>然而，根据MSDN中对GetSecurityDescriptorDacl函数的解释：</p>
<p>A value of TRUE for lpbDaclPresent does not mean that pDacl is not NULL. That is, lpbDaclPresent can be TRUE while pDacl is NULL, meaning that a NULL DACL is in effect. A NULL DACL implicitly allows all access to an object and is not the same as an empty DACL. An empty DACL permits no access to an object. For information about creating a proper DACL, see Creating a DACL.</p>
<p>也就是说，在此处当bDaclPresent为TRUE时，pAcl可能为NULL，这时的NULL DACL表示对该对象允许所有权限。而OGAEXEC.exe没有对这种情况进行判断，导致在bDaclPresent为TRUE的情况下直接把一个为NULL的pAcl指针传给了ADVAPI32!GetAclInformation，导致后者在ntdll!RtlQueryInformationAcl访问这个NULL指针，从而触发了Access Violation异常。</p> <a href="http://hi.baidu.com/yicong2007/blog/item/d879c5a2b9bb76a7caefd04c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/d879c5a2b9bb76a7caefd04c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-08  20:25</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/d879c5a2b9bb76a7caefd04c.html</guid>
</item>

<item>
        <title><![CDATA[PsLoadedModuleList中系统内核文件的BaseDllName永远是ntoskrnl.exe？]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/bee43d34e3210b315ab5f5f7.html]]></link>
        <description><![CDATA[
		
		<p>系统环境：XP sp3 简体中文版</p>
<p>源起<a href="http://bbs.pediy.com/showthread.php?p=686228">http://bbs.pediy.com/showthread.php?p=686228</a><br>
如果该帖楼主的问题是这样表述的：</p>
<p>&ldquo;Intel或AMD的CPU情况下，系统内核文件应分别为ntoskrnl.exe和ntkrnlpa.exe，为什么我通过PsLoadedModuleList读取到的永远是ntoskrnl.exe？&rdquo;</p>
<p>那么我可能很快就理解，然而楼主错误地把问题指向单核与双核的区别，说出了&ldquo;内核文件名字ntkrnlmp.exe或者 ntoskrnl.exe&rdquo;的话，结果我也就停留在告诉他&ldquo;双核下内核文件名也不会叫ntkrnlmp.exe，虽然其源文件名是这个&rdquo;。</p>
<p>之后自己动手试了一下才了解他问的问题的现象不是把双核内核文件显示成单核，而是系统把ntkrnlpa.exe的相应表项的BaseDllName也给显示成了ntoskrnl.exe。</p>
<p>lkd&gt; dd PsLoadedModuleList<br>
8055e720 855fc3b0 844dd2e0 00000000 00000000<br>
8055e730 00000000 00000000 00000000 00000000<br>
8055e740 80565bc0 80562de0 00000000 00000000<br>
8055e750 00000000 00000000 00000000 00000000<br>
8055e760 00000000 00000000 00000000 00000000<br>
8055e770 00000000 00000000 8054b800 8054b000<br>
8055e780 8054a200 80549000 8054d400 8054c000<br>
8055e790 00000000 0000000c 0000000c 84e1db50<br>
lkd&gt; dt 855fc3b0 _LDR_DATA_TABLE_ENTRY<br>
nt!_LDR_DATA_TABLE_ENTRY<br>
&nbsp;&nbsp;  +0x000 InLoadOrderLinks : _LIST_ENTRY [ 0x855fc348 - 0x8055e720 ]<br>
&nbsp;&nbsp;  +0x008 InMemoryOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]<br>
&nbsp;&nbsp;  +0x010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]<br>
&nbsp;&nbsp;  +0x018 DllBase&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 0x804d8000 <br>
&nbsp;&nbsp;  +0x01c EntryPoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 0x806a2c08 <br>
&nbsp;&nbsp;  +0x020 SizeOfImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 0x20d000<br>
&nbsp;&nbsp;  +0x024 FullDllName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : _UNICODE_STRING &quot;\WINDOWS\system32\ntkrnlpa.exe&quot;<br>
&nbsp;&nbsp;  +0x02c BaseDllName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : _UNICODE_STRING &quot;ntoskrnl.exe&quot;<br>
&nbsp;&nbsp;  +0x034 Flags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 0xc004000<br>
&nbsp;&nbsp;  +0x038 LoadCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 1<br>
&nbsp;&nbsp;  +0x03a TlsIndex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 0<br>
&nbsp;&nbsp;  +0x03c HashLinks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : _LIST_ENTRY [ 0x0 - 0x1f3a86 ]<br>
&nbsp;&nbsp;  +0x03c SectionPointer&nbsp;&nbsp;  : (null) <br>
&nbsp;&nbsp;  +0x040 CheckSum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  : 0x1f3a86<br>
&nbsp;&nbsp;  +0x044 TimeDateStamp&nbsp;&nbsp;&nbsp;  : 0<br>
&nbsp;&nbsp;  +0x044 LoadedImports&nbsp;&nbsp;&nbsp;  : (null) <br>
&nbsp;&nbsp;  +0x048 EntryPointActivationContext : (null) <br>
&nbsp;&nbsp;  +0x04c PatchInformation : 0x0074006e</p>
<p>事实俱在，用FullDllName就可以了。ZwQuerySystemInformation(SystemModuleInformation)也是用FullDllName的。</p>
<p>问题是这样解决了，然而我不死心，想知道为什么。于是只能一头扎进系统初始化的过程。</p>
<p>ntoskrnl.exe或ntkrnlpa.exe是在NTLDR!osloader.exe里加载的，相应LDR_DATA_TABLE_ENTRY也是在那里创建的，之后Windows内核初始化时再把BlLoaderBlock中的相应列表复制到PsLoadedModuleList中。</p>
<p>为了找到为什么相应LDR_DATA_TABLE_ENTRY中的BaseDllName永远是ntoskrnl.exe，我不得不去看看NTLDR!osloader.exe里是怎么创建它的。</p>
<p>NTLDR!osloader.exe里是在BlOsLoader函数中加载内核映像文件的。<br>
BlOsLoader函数调用Blx86CheckForPaeKernel函数来判断应该加载哪个内核文件：</p>
<p>Blx86CheckForPaeKernel函数部分内容：<br>
.text:00423B27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  esi, offset s_Ntoskrnl_exe ; &quot;ntoskrnl.exe&quot;<br>
.text:00423B2C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, offset s_Ntkrnlpa_exe ; &quot;ntkrnlpa.exe&quot;<br>
.text:00423B31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_423B3D<br>
.text:00423B31<br>
.text:00423B33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  byte ptr [ebp+PAEEnabled], 0<br>
.text:00423B37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, ebx<br>
.text:00423B39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_423B3D<br>
.text:00423B39<br>
.text:00423B3B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, esi<br>
.text:00423B3B</p>
<p>调用BlLoadImageEx加载相应的内核文件。在此之后又加载了hal.dll和kdcom.dll</p>
<p>加载完这三个映像文件之后，就调用BlAllocateDataTableEntry函数为这三个文件创建LDR_DATA_TABLE_ENTRY表项。</p>
<p>对Windows内核文件创建LDR_DATA_TABLE_ENTRY表项的代码是这样的：</p>
<p>.text:004228E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+PNewDataEntry]<br>
.text:004228E8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; PNewDataEntry<br>
.text:004228E9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  [ebp+DllBase]&nbsp;&nbsp;  ; DllBase<br>
.text:004228EF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+FullKernelName]<br>
.text:004228F5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; FullDllName<br>
.text:004228F6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  offset s_Ntoskrnl_exe ; &quot;ntoskrnl.exe&quot;<br>
.text:004228FB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  _BlUsableLimit, 20000h<br>
.text:00422905&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  BlAllocateDataTableEntry(x,x,x,x)</p>
<p>该函数原型为</p>
<p>int __stdcall BlAllocateDataTableEntry(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  char *BaseDllName,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  char *FullDllName,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PVOID DllBase,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OUT&nbsp;&nbsp;&nbsp;&nbsp;  PLDR_DATA_TABLE_ENTRY *PNewDataEntry)</p>
<p>其中第一参数指定的是填入LDR_DATA_TABLE_ENTRY 表项的BaseDllName.Buffer的字符串。</p>
<p>可以看到这里直接指定了BaseDllName为&quot;ntoskrnl.exe&quot;，这就是导致这里永远是ntoskrnl.exe的原因。</p>
<p>BlAllocateDataTableEntry的反汇编分析结果如下，可以很清楚地看出它是怎么填充结构内容的。</p>
<p><br>
.text:00415927<br>
.text:00415927 ; int __stdcall BlAllocateDataTableEntry(char *BaseDllName,char *FullDllName,PVOID DllBase,int PNewDataEntry)<br>
.text:00415927 __stdcall BlAllocateDataTableEntry(x, x, x, x) proc near<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: AEInitializeIo(x)+8Bp<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BlScanImportDescriptorTable(x,x,x)+1A0p<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BlLoadDeviceDriver(x,x,x,x,x)+176p<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BlOsLoader(x,x,x)+E1Fp<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BlOsLoader(x,x,x)+E52p<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BlOsLoader(x,x,x)+E8Ep<br>
.text:00415927<br>
.text:00415927 BaseDllName&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 8<br>
.text:00415927 FullDllName&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 0Ch<br>
.text:00415927 DllBase&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 10h<br>
.text:00415927 PNewDataEntry&nbsp;&nbsp;  = dword ptr 14h<br>
.text:00415927<br>
.text:00415927&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, edi<br>
.text:00415929&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp<br>
.text:0041592A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebp, esp<br>
.text:0041592C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  esi<br>
.text:0041592D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  4Ch<br>
.text:0041592F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  BlAllocateHeap(x) ; Allocate buffer for LDR_DATA_TABLE_ENTRY structure<br>
.text:0041592F<br>
.text:00415934&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  esi, eax<br>
.text:00415936&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  esi, esi<br>
.text:00415938&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_415942<br>
.text:00415938<br>
.text:0041593A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  10h<br>
.text:0041593C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:0041593D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  loc_415A12<br>
.text:0041593D<br>
.text:00415942 ; ---------------------------------------------------------------------------<br>
.text:00415942<br>
.text:00415942 loc_415942:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+11j<br>
.text:00415942&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebx<br>
.text:00415943&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edi<br>
.text:00415944&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, [ebp+DllBase]<br>
.text:00415947&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; ImageBase<br>
.text:00415948&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  RtlImageNtHeader(x)<br>
.text:00415948<br>
.text:0041594D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, [ebp+BaseDllName]<br>
.text:00415950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.DllBase], edi<br>
.text:00415953&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [eax+IMAGE_NT_HEADERS.OptionalHeader.SizeOfImage]<br>
.text:00415956&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.SizeOfImage], ecx<br>
.text:00415959&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [eax+IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint]<br>
.text:0041595C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  add&nbsp;&nbsp;&nbsp;&nbsp;  ecx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; DllBase+EntryPoint<br>
.text:0041595E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  and&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.HashLinks.Flink], 0<br>
.text:00415962&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.EntryPoint], ecx<br>
.text:00415965&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [eax+IMAGE_NT_HEADERS.OptionalHeader.CheckSum]<br>
.text:00415968&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+IMAGE_OPTIONAL_HEADER32.CheckSum], eax<br>
.text:0041596B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BaseDllName<br>
.text:0041596D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edi, [eax+1]<br>
.text:0041596D<br>
.text:00415970<br>
.text:00415970 loc_415970:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+4Ej<br>
.text:00415970&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  cl, [eax]<br>
.text:00415972&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:00415973&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  cl, cl<br>
.text:00415975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_415970<br>
.text:00415975<br>
.text:00415977&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sub&nbsp;&nbsp;&nbsp;&nbsp;  eax, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; the length of the BaseDllName<br>
.text:00415979&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edi, [eax+eax]<br>
.text:0041597C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movzx&nbsp;&nbsp;  eax, di<br>
.text:0041597F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax<br>
.text:00415980&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  BlAllocateHeap(x) ; AllocateBuffer for BaseDllName UNICODE_STRING<br>
.text:00415980<br>
.text:00415985&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:00415987&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_4159C7<br>
.text:00415987<br>
.text:00415989&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.BaseDllName.Length], di<br>
.text:0041598D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.BaseDllName.MaximumLength], di<br>
.text:00415991&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.BaseDllName.Buffer], eax<br>
.text:00415994&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  short loc_4159A0<br>
.text:00415994<br>
.text:00415996 ; ---------------------------------------------------------------------------<br>
.text:00415996<br>
.text:00415996 loc_415996:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+7Dj<br>
.text:00415996&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movsx&nbsp;&nbsp;  cx, cl<br>
.text:0041599A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax], cx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; Copy BaseDllName into Buffer<br>
.text:0041599D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:0041599E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:0041599F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  ebx<br>
.text:0041599F<br>
.text:004159A0<br>
.text:004159A0 loc_4159A0:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+6Dj<br>
.text:004159A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  cl, [ebx]<br>
.text:004159A2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  cl, cl<br>
.text:004159A4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_415996<br>
.text:004159A4<br>
.text:004159A6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, [ebp+FullDllName]<br>
.text:004159A9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, ebx<br>
.text:004159AB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edx, [eax+1]<br>
.text:004159AB<br>
.text:004159AE<br>
.text:004159AE loc_4159AE:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+8Cj<br>
.text:004159AE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  cl, [eax]<br>
.text:004159B0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:004159B1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  cl, cl<br>
.text:004159B3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_4159AE<br>
.text:004159B3<br>
.text:004159B5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sub&nbsp;&nbsp;&nbsp;&nbsp;  eax, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; get the length of FullDllName<br>
.text:004159B7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edi, [eax+eax]<br>
.text:004159BA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movzx&nbsp;&nbsp;  eax, di<br>
.text:004159BD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax<br>
.text:004159BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  BlAllocateHeap(x) ; Allocate Buffer for FullDllName UNICODE_STRING<br>
.text:004159BE<br>
.text:004159C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:004159C5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_4159CC<br>
.text:004159C5<br>
.text:004159C7<br>
.text:004159C7 loc_4159C7:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+60j<br>
.text:004159C7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  10h<br>
.text:004159C9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:004159CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  short loc_415A10<br>
.text:004159CA<br>
.text:004159CC ; ---------------------------------------------------------------------------<br>
.text:004159CC<br>
.text:004159CC loc_4159CC:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+9Ej<br>
.text:004159CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.FullDllName.Length], di<br>
.text:004159D0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.FullDllName.MaximumLength], di<br>
.text:004159D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.FullDllName.Buffer], eax<br>
.text:004159D7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  short loc_4159E3<br>
.text:004159D7<br>
.text:004159D9 ; ---------------------------------------------------------------------------<br>
.text:004159D9<br>
.text:004159D9 loc_4159D9:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+C0j<br>
.text:004159D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movsx&nbsp;&nbsp;  cx, cl<br>
.text:004159DD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax], cx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; Copy FullDllName into buffer<br>
.text:004159E0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:004159E1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  eax<br>
.text:004159E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  ebx<br>
.text:004159E2<br>
.text:004159E3<br>
.text:004159E3 loc_4159E3:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+B0j<br>
.text:004159E3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  cl, [ebx]<br>
.text:004159E5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  cl, cl<br>
.text:004159E7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_4159D9<br>
.text:004159E7<br>
.text:004159E9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.Flags], 4000h<br>
.text:004159F0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.LoadCount], 1<br>
.text:004159F6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, _BlLoaderBlock<br>
.text:004159FB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [eax+LOADER_PARAMETER_BLOCK.LoadOrderListHead.Blink]<br>
.text:004159FE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edx, [ecx]<br>
.text:00415A00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.InLoadOrderLinks.Flink], eax<br>
.text:00415A02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+PNewDataEntry]<br>
.text:00415A05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+LDR_DATA_TABLE_ENTRY.InLoadOrderLinks.Blink], edx<br>
.text:00415A08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [edx+LDR_DATA_TABLE_ENTRY.InLoadOrderLinks.Flink], esi<br>
.text:00415A0A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ecx], esi<br>
.text:00415A0C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax], esi<br>
.text:00415A0E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  xor&nbsp;&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:00415A0E<br>
.text:00415A10<br>
.text:00415A10 loc_415A10:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+A3j<br>
.text:00415A10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  edi<br>
.text:00415A11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ebx<br>
.text:00415A11<br>
.text:00415A12<br>
.text:00415A12 loc_415A12:&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: BlAllocateDataTableEntry(x,x,x,x)+16j<br>
.text:00415A12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  esi<br>
.text:00415A13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ebp<br>
.text:00415A14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  retn&nbsp;&nbsp;&nbsp;  10h<br>
.text:00415A14<br>
.text:00415A14 __stdcall BlAllocateDataTableEntry(x, x, x, x) endp</p>
<p>加载Boot驱动时BlLoadBootDriver-&gt;BlLoadDeviceDriver同样有调用BlAllocateDataTableEntry添加项目，但是这时的BaseDllName来自于对驱动注册表项的ImagePath键值取其中的文件名，因此与FullDllName中的内容会保持一致。</p> <a href="http://hi.baidu.com/yicong2007/blog/item/bee43d34e3210b315ab5f5f7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/bee43d34e3210b315ab5f5f7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-14  04:28</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/bee43d34e3210b315ab5f5f7.html</guid>
</item>

<item>
        <title><![CDATA[Win32系统中进程主线程初始化时，ebx为什么指向PEB]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/c21de81f0a2a6303304e1592.html]]></link>
        <description><![CDATA[
		
		<p>阳光在阅读《脱壳的艺术》，其中阐述某些壳修改程序流程的方法，是使用CreateProcess(<span>CREATE_SUSPENDED</span>)创建新的被挂起的进程，此时其初始化线程上下文中，ebx即为其PEB指针。</p>
<p>于是阳光找我讨论这是为什么。我相信大家在用OD的过程中也早已发现，如果不使用<span>CREATE_SUSPENDED，初始化线程在跑到入口点后，其ebx同样指向PEB结构。</span></p>
<p><span>显然，我们必须进入Win32系统新进程创建的过程来找这个真相。由于我们知道初始化线程被创建后（尚未Resume）ebx就已经指向PEB了，所以要不然就是在NtCreateThread过程中，要不然就是在它前面。同时也应该在NtCreatePeb之后。因此我就在这个范围内找寻。</span></p>
<p><span>应该说这里我犯了个错误，就是没有详细看CreateProcess的流程，而是使劲往NtCreateThread的内核代码看去，N多函数调用关系看得我眼花，虽然这些内核函数对线程的Context有诸多操作，但是均并不涉及其Ebx。</span></p>
<p><span>最后终于回过头来看CreateProcessInternalW在NtCreateThread之前的过程。《Windows Internals 4th》在这里一句话带过了：</span></p>
<p><span>Before the thread can be created, it needs a stack and a context in which to run, so these are set up now.</span></p>
<p><span>原来是恰恰在NtCreateThread之前，在用户态初始化了新线程的Context，再结合网上其他的文章，终于找到关键函数：kernel32!BaseInitializeContext。</span></p>
<p><span>BaseInitializeContext(PCONTEXT Context, // 0x200 bytes<br>
PPEB Peb,<br>
PVOID EntryPoint,<br>
DWORD StackTop,<br>
int Type // union (Process, Thread, Fiber)<br>
);</span></p>
<p><span>IDA中看一下这个函数：</span></p>
<p><span>.text:7C810443<br>
.text:7C810443 __stdcall BaseInitializeContext(x, x, x, x, x) proc near<br>
.text:7C810443&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: CreateRemoteThread(x,x,x,x,x,x,x)+84 p<br>
.text:7C810443&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CreateProcessInternalW(x,x,x,x,x,x,x,x,x,x,x,x)+690 p<br>
.text:7C810443&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CreateFiberEx(x,x,x,x,x)+82 p<br>
.text:7C810443<br>
.text:7C810443 Context&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 8<br>
.text:7C810443 PPeb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 0Ch<br>
.text:7C810443 EntryPoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 10h<br>
.text:7C810443 StackTop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 14h<br>
.text:7C810443 Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr 18h<br>
.text:7C810443<br>
.text:7C810443 ; FUNCTION CHUNK AT .text:7C81508E SIZE 00000019 BYTES<br>
.text:7C810443 ; FUNCTION CHUNK AT .text:7C82FF86 SIZE 0000000F BYTES<br>
.text:7C810443<br>
.text:7C810443&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, edi<br>
.text:7C810445&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp<br>
.text:7C810446&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebp, esp<br>
.text:7C810448&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+Context]<br>
.text:7C81044B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebp+EntryPoint]<br>
.text:7C81044E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  and&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.SegGs], 0<br>
.text:7C810455&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+Type], 1<br>
.text:7C810459&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.Eax], ecx<br>
.text:7C81045F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebp+PPeb]<br>
.text:7C810462&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.Ebx], ecx<br>
.text:7C810468&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  20h<br>
.text:7C81046A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ecx<br>
.text:7C81046B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.SegEs], ecx<br>
.text:7C810471&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.SegDs], ecx<br>
.text:7C810477&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.SegSs], ecx<br>
.text:7C81047D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebp+StackTop]<br>
.text:7C810480&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.SegFs], 38h<br>
.text:7C81048A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.SegCs], 18h<br>
.text:7C810494&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.EFlags], 3000h<br>
.text:7C81049E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.Esp], ecx<br>
.text:7C8104A4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  loc_7C81508E<br>
.text:7C8104A4<br>
.text:7C8104AA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [eax+CONTEXT.Eip], offset BaseThreadStartThunk(x,x)<br>
.text:7C8104AA<br>
.text:7C8104B4<br>
.text:7C8104B4 loc_7C8104B4:&nbsp;&nbsp;&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 XREF: BaseInitializeContext(x,x,x,x,x)+4C5F j<br>
.text:7C8104B4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; BaseInitializeContext(x,x,x,x,x)+1FB4D j<br>
.text:7C8104B4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  add&nbsp;&nbsp;&nbsp;&nbsp;  ecx, 0FFFFFFFCh<br>
.text:7C8104B7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.ContextFlags], 10007h<br>
.text:7C8104BD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.Esp], ecx<br>
.text:7C8104C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ebp<br>
.text:7C8104C4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  retn&nbsp;&nbsp;&nbsp;  14h<br>
.text:7C8104C4<br>
.text:7C8104C4 __stdcall BaseInitializeContext(x, x, x, x, x) endp<br>
.text:7C8104C4</span></p>
<p><span>.text:7C81508E<br>
.text:7C81508E loc_7C81508E:&nbsp;&nbsp;&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 XREF: BaseInitializeContext(x,x,x,x,x)+61 j<br>
.text:7C81508E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+Type], 2<br>
.text:7C815092&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  loc_7C82FF86<br>
.text:7C815092<br>
.text:7C815098&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [eax+CONTEXT.Eip], offset BaseProcessStartThunk(x,x)<br>
.text:7C8150A2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  loc_7C8104B4<br>
.text:7C8150A2</span></p>
<p><span>.text:7C82FF86<br>
.text:7C82FF86 loc_7C82FF86:&nbsp;&nbsp;&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 XREF: BaseInitializeContext(x,x,x,x,x)+4C4F j<br>
.text:7C82FF86&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [eax+CONTEXT.Eip], offset BaseFiberStart()<br>
.text:7C82FF90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  loc_7C8104B4<br>
.text:7C82FF90</span></p>
<p><span>这个函数就是新线程的线程上下文初始化的关键。下面这两行代码：</span></p>
<p><span>.text:7C81045F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebp+PPeb]<br>
.text:7C810462&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+CONTEXT.Ebx], ecx</span></p>
<p><span>将其Ebx指向了PEB。同时这个函数也对几个段选择子进行了初始化，因此诸如为什么Ring3进线程初始化时这几个段选择子总是那样的值的问题，也一并解决了。</span></p>
<p><span>因为BaseInitializeContext在CreateRemoteThread中也被调用（CreateThread则又调用了CreateRemoteThread），所以Ring3下用这些常规方式创建的进线程，初始化时都经过这个函数，其线程上下文的相关内容便也保持一致的特点。</span></p>
<p><span>Update：</span></p>
<p><span>之前的说法还是有点不足之处，BaseInitializeContext的第二个参数，准确地来说应该是PPebOrPParameter。当被CreateProcessInternalW调用时，此处传入的是新进程的PEB指针（由父进程对新进程调用NtQueryInformationProcess得到）；当被CreateRemoteThread调用时，这里传入的是CreateRemoteThread的第五个输入参数，也就是lpParameter，也就是为新线程指定的传入参数。</span></p>
<p><span>BaseInitializeContext函数将相应CONTEXT结构中的Eip字段指定为BaseProcessStartThunk（新进程创建时CreateProcessInternalW调用的时候）或BaseThreadStartThunk（创建非主线程时，由CreateRemoteThread调用的时候），将Eax字段内容指定为线程入口点，将Ebx字段内容指定为新进程的PEB指针（新进程创建时CreateProcessInternalW调用的时候）或创建远程线程时传给新线程的参数（创建非主线程时，由CreateRemoteThread调用的时候）。<br>
</span></p>
<p><span>新进程的主线程进入BaseProcessStartThunk后：<br>
xor ebp, ebp<br>
push eax; 线程入口点<br>
push 0<br>
jmp BaseProcessStart<br>
<br>
BaseProcessStart之后使用这个push eax时压入栈的线程入口点值来调用入口点函数，当入口点函数返回时，使用其返回值调用ExitThread退出线程：<br>
call&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+8] ; 之前压入栈的线程入口点<br>
push&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 进入主线程入口点时，[esp]的值就是这行指令的地址<br>
call&nbsp;&nbsp;&nbsp;&nbsp; ExitThread<br>
<br>
远程线程进入BaseThreadStartThunk后的行为有点类似，但push的参数中多了一个ebx，即传入参数：<br>
xor ebp, ebp<br>
push ebx; 传入参数<br>
push eax; 线程入口点<br>
push 0<br>
jmp BaseThreadStart<br>
<br>
BaseThreadStart之后使用前面压入栈的线程入口点值和传入参数来调用入口点函数，当入口点函数返回时，使用其返回值调用ExitThread退出线程：<br>
push&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+0Ch] ; 之前压入栈的传入参数<br>
call&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+8] ; 之前压入栈的线程入口点<br>
push&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 进入远程线程入口点时，[esp]的值就是这行指令的地址<br>
call&nbsp;&nbsp;&nbsp;&nbsp; ExitThread</span></p>
<p><span>另外除了进程和线程这两种类型之外，BaseInitializeContext还会被CreateFiberEx调用，相应的对象称为纤程，我还不知道这个纤程具体是怎么回事。</span></p> <a href="http://hi.baidu.com/yicong2007/blog/item/c21de81f0a2a6303304e1592.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/c21de81f0a2a6303304e1592.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-06  04:29</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/c21de81f0a2a6303304e1592.html</guid>
</item>

<item>
        <title><![CDATA[Opera Mobile 8.65 for Symbian60 v3 keygen]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/dd8b56a91e4221f51f17a259.html]]></link>
        <description><![CDATA[
		
		<p>昨天想往我新买的手机上装Opera Mobile浏览器。Google了一下注册机，发现了网上提供的&ldquo;Opera Mobile 8.65 for Symbian60 v3 注册机&rdquo;程序。该程序用UPX加壳，使用Delphi编写，由于其FormCreate例程中有使用Indy组件进行后台联网行为，杀毒软件至今仍将其认定为病毒。</p>
<p>虽然该注册机可以照常使用，计算出来的注册码也是正确的，但是即使不算病毒，至少也算有AD行为，搜索过程中看到网友们慨叹&ldquo;找到的注册机都是病毒&rdquo;，实在有点不爽。</p>
<p>于是我逆向了该注册机程序，了解了它的注册码算法，发现算法并不复杂：</p>
<p>注册码以手机IMEI号为基础，程序中保存一段长10字节的密钥，先将表示IMEI号的字符串与此密钥逐个字节进行循环的XOR，将得到的新字符串作MD5，然后将得到的MD5结果的每个字节值使用10进制显示并连起来，最后得到的字符串的前10个字符，就是注册码。</p>
<p>于是我自己重写了一个注册机。我的注册机使用Win32汇编编写，MD5计算使用网上公开的静态库，程序界面的资源是使用VS2005生成的（所以图标我也没改了，看起来像MFC程序）。</p>
<p>我重写的注册机的好处，就是很干净，除了计算注册码的算法和GUI的窗口响应函数之外，没有任何多余的代码，因此体积小巧（程序未加壳，只有26K，压缩之后只有12K，而原来那个注册机加壳压缩完都要218K），无毒无害。我觉得这样简约实用的风格才是真正的cracker应该写出来的作品（虽然我专长不是做crack的……）。</p>
<p>注册机的使用方法也很简单，在IMEI栏里填入手机IMEI号，按&quot;Generate&quot;按钮，注册码即显示在下面的Reg栏里。</p>
<p>注册机下载网盘链接：<br>
<a href="http://www.rayfile.com/files/41aa210a-98bb-11de-a8e0-0014221b798a/">http://www.rayfile.com/files/41aa210a-98bb-11de-a8e0-0014221b798a/</a></p>
<p>不爽的是我的注册机，放上virustotal扫描照样有杀软报毒：</p>
<p>CAT-QuickHeal 10.00 2009.09.02 Win32.TrojanDownloader.Small.FC.4 <br>
Sophos 4.45.0 2009.09.03 Sus/Keygen-A</p>
<p>Sophos报疑似注册机报得很对（因为我用的GetDlgItemText和SetDlgItemText这些函数对于注册机来说太&ldquo;标准&rdquo;了，我不知道如果我把调用的API处理一下还会不会报），另一家报的就太荒谬了吧……</p>
<p>PS：本来想发到IT168诺基亚手机论坛的（原来的注册机就是在那里下的），发现我是新手没有上传rar附件权限，所以只能放网盘（我不喜欢rayfile，因为我用raysource下载从来没有成功过，但是急切又找不到其他方便别人下载的网盘，幸好文件够小可以直接下载），再加上本来我要解决的就是其病毒问题，偏偏我写出来的还有杀软误报……不发出来又不甘心，干脆放自己blog了，至少经常来我blog的人，应该还是能区分什么是误报的。</p>
<p>因此这次变成我第一次在blog上发注册机（不过我绕了个弯，因为我没有也不会逆向手机平台上的Opera Mobile，我只是逆向了在PC平台上Windows系统下运行的别人的注册机而已），很可能也是唯一一次，下不为例。</p> <a href="http://hi.baidu.com/yicong2007/blog/item/dd8b56a91e4221f51f17a259.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/dd8b56a91e4221f51f17a259.html#comment">查看评论</a>]]></description>
        <pubDate>2009-09-04  03:22</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/dd8b56a91e4221f51f17a259.html</guid>
</item>

<item>
        <title><![CDATA[MPEG-2 0day续：一个&引发的漏洞]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/74d99f82f78d0a99f703a600.html]]></link>
        <description><![CDATA[
		
		<p><a href="http://bbs.pediy.com/showthread.php?t=92912">http://bbs.pediy.com/showthread.php?t=92912</a>帖子发出后，得到了MJ0011和云砉生等人的指正，特别是最后弄清楚了这个漏洞产生的原因：代码编写者犯了一个程序员经常犯的错误（感谢云砉生指出这一点），即将保存缓冲区指针的堆栈地址当成缓冲区指针本身传入（将传入参数buff误写为&amp;buff），从而导致了溢出。</p>
<p>弄清楚了原因，漏洞补丁就很简单了，正如<a target="_blank" href="http://hi.baidu.com/pshpan">pshpan</a>的blog中提到的方法：</p>
<p>.text:59F0D748&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx, [ebp+8]</p>
<p>改为</p>
<p>.text:59F0D748&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx, [ebp+8]</p>
<p>即可修复该漏洞。</p>
<p>微软的程序员也会出这样的错误，从这里也可以看出在编程序的过程中细心是多么的重要。</p> <a href="http://hi.baidu.com/yicong2007/blog/item/74d99f82f78d0a99f703a600.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/74d99f82f78d0a99f703a600.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-07  00:09</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/74d99f82f78d0a99f703a600.html</guid>
</item>

<item>
        <title><![CDATA[MPEG-2 0day：缓冲区溢出覆盖SEH]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/15f07209c5c14dc63ac763b7.html]]></link>
        <description><![CDATA[
		
		<p>考完一个期末考回来，发现自己很多事情火星了。昨晚jun跟我说起最近出了个MPEG-2 0day的洞。Google一搜索，果然一大把新闻。于是在新闻里提到的被挂马网页中找了一个，实机触发了一下这个漏洞。搞着搞着越搞越上瘾，把这个玩意的来龙去脉粗略搞清了，结果通宵了<img src="http://img.baidu.com/hi/jx/j_0050.gif"></p>
<p>blog里字数限制太烦人，等以后有空再全文搬上来，先给个看雪帖子链接：</p>
<p><a href="http://bbs.pediy.com/showthread.php?t=92912">http://bbs.pediy.com/showthread.php?t=92912</a></p>
<p>我在看雪的主题帖只有四篇，不知道算不算贵精不贵多呢……</p> <a href="http://hi.baidu.com/yicong2007/blog/item/15f07209c5c14dc63ac763b7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/15f07209c5c14dc63ac763b7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-06  06:17</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/15f07209c5c14dc63ac763b7.html</guid>
</item>

<item>
        <title><![CDATA[WinMount 2.2.2 蓝了]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/e11aa61c6169198386d6b624.html]]></link>
        <description><![CDATA[
		
		<p>本本上装的WinMount在把一个有密码的压缩包Mount到新驱动器的时候，我输完密码按确定之后，BSOD了。搞得我深夜分析dump。</p>
<p>dump加载后windbg产生的信息摘要：</p>
<p>DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)<br>
An attempt was made to access a pageable (or completely invalid) address at an<br>
interrupt request level (IRQL) that is too high.  This is usually<br>
caused by drivers using improper addresses.<br>
If kernel debugger is available get stack backtrace.<br>
Arguments:<br>
Arg1: ff116000, memory referenced<br>
Arg2: 00000002, IRQL<br>
Arg3: 00000000, value 0 = read operation, 1 = write operation<br>
Arg4: f907347f, address which referenced memory</p>
<p>Debugging Details:<br>
------------------</p>
<p> </p>
<p><br>
READ_ADDRESS:  ff116000</p>
<p>CURRENT_IRQL:  2</p>
<p>FAULTING_IP: <br>
WinMTBus+1647f<br>
f907347f f3a5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  rep movs dword ptr es:[edi],dword ptr [esi]</p>
<p>CUSTOMER_CRASH_COUNT:  1</p>
<p>DEFAULT_BUCKET_ID:  DRIVER_FAULT</p>
<p>BUGCHECK_STR:  0xD1</p>
<p>PROCESS_NAME:  WinMount.exe</p>
<p>LAST_CONTROL_TRANSFER:  from f907a8cc to f907347f</p>
<p>STACK_TEXT:  <br>
WARNING: Stack unwind information not available. Following frames may be wrong.<br>
f0cf2ba4 f907a8cc ff115fb0 03300000 fee97d48 WinMTBus+0x1647f<br>
f0cf2bd8 f90647d7 03300000 feea9950 81d85c40 WinMTBus+0x1d8cc<br>
f0cf2c18 f905d759 00ea9950 f905d64c 81d85c40 WinMTBus+0x77d7<br>
f0cf2c58 8057ba9f 81d85b88 feea9950 ff0fa398 WinMTBus+0x759<br>
f0cf2d00 8058ffe3 0000011c 00000000 00000000 nt!IopXxxControlFile+0x611<br>
f0cf2d34 804df7ec 0000011c 00000000 00000000 nt!NtDeviceIoControlFile+0x2a<br>
f0cf2d34 7c92e514 0000011c 00000000 00000000 nt!KiFastCallEntry+0xf8<br>
023eff38 00000000 00000000 00000000 00000000 0x7c92e514</p>
<p><br>
STACK_COMMAND:  kb</p>
<p>FOLLOWUP_IP: <br>
WinMTBus+1647f<br>
f907347f f3a5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  rep movs dword ptr es:[edi],dword ptr [esi]</p>
<p>SYMBOL_STACK_INDEX:  0</p>
<p>SYMBOL_NAME:  WinMTBus+1647f</p>
<p>FOLLOWUP_NAME:  MachineOwner</p>
<p>MODULE_NAME: WinMTBus</p>
<p>IMAGE_NAME:  WinMTBus.sys</p>
<p>DEBUG_FLR_IMAGE_TIMESTAMP:  45d27c40</p>
<p>FAILURE_BUCKET_ID:  0xD1_WinMTBus+1647f</p>
<p>BUCKET_ID:  0xD1_WinMTBus+1647f</p>
<p>Followup: MachineOwner<br>
---------</p>
<p>从以上内容可以看到系统在IRQL==DISPATCH_LEVEL的时候读取了一个分页地址或无效地址，从而触发了BSOD。</p>
<p>kd&gt; !process<br>
GetPointerFromAddress: unable to read from 80560bd4<br>
PROCESS feeb2da0  SessionId: none  Cid: 0f54&nbsp;&nbsp;&nbsp;  Peb: 7ffda000  ParentCid: 0938<br>
&nbsp;&nbsp;&nbsp;  DirBase: 07530000  ObjectTable: e11c1fb8  HandleCount: &lt;Data Not Accessible&gt;<br>
&nbsp;&nbsp;&nbsp;  Image: WinMount.exe<br>
&nbsp;&nbsp;&nbsp;  VadRoot ff5f7a60 Vads 186 Clone 0 Private 3086. Modified 1951. Locked 256.<br>
（以下省略一些信息）</p>
<p>kd&gt; r edi, esi, ecx<br>
edi=03300060 esi=ff116000 ecx=00000004<br>
kd&gt; dd esi<br>
ff116000  ???????? ???????? ???????? ????????<br>
ff116010  ???????? ???????? ???????? ????????<br>
ff116020  ???????? ???????? ???????? ????????<br>
ff116030  ???????? ???????? ???????? ????????<br>
ff116040  ???????? ???????? ???????? ????????<br>
ff116050  ???????? ???????? ???????? ????????<br>
ff116060  ???????? ???????? ???????? ????????<br>
ff116070  ???????? ???????? ???????? ????????</p>
<p>发生BSOD的进程是WinMount.exe，位置在驱动 WinMTBus+1647f处，为一条rep movsd指令，这条指令在读取esi的地址所指向的内存时由于此内存地址无效而引发了BSOD。从ecx=4可以看出这里本来还要有0x10字节以供拷贝的。</p>
<p>从栈回溯信息可以看出这个操作来源是WinMount.exe在用户层的一次NtDeviceIoControlFile与驱动交互的调用，从进入NtDeviceIoControlFile时的堆栈：<br>
kd&gt; dd f0cf2d38<br>
f0cf2d38  804df7ec 0000011c 00000000 00000000<br>
f0cf2d48  00000000 023eff14 0022200a 00000000<br>
f0cf2d58  00000000 03300000 00100000 023eff38<br>
对照NtDeviceIoControlFile的函数原型可以看出，驱动符号链接句柄是0x11c（或许因为dump文件信息太少，查不出这个句柄对应的对象信息），IOCTL为0x0022200a，用于从驱动输出缓冲区信息到用户层，OutputBuffer为0x03300000，OutputBufferLength为0x100000。<br>
可以看到edi=03300060正是在输出缓冲区中，可以判断此时正是驱动向里面拷数据。</p>
<p>kd&gt; r eax<br>
eax=03300000</p>
<p>可以看到eax正是指向缓冲区开头。</p>
<p>kd&gt; dd eax<br>
03300000  00000002 00000000 00000000 00000000<br>
03300010  000b0050 00000000 00000000 00000000<br>
03300020  00000000 00000000 00000012 ff0f1b58<br>
03300030  00000000 00000000 00000000 00000000<br>
03300040  ff115fb0 00000040 00000000 00000000<br>
03300050  e244fd50 00000000 010000aa 00000000<br>
03300060  00000000 00000000 00000000 00000000<br>
03300070  00000000 00000000 00000000 00000000<br>
kd&gt; dd esi-60<br>
ff115fa0  00000000 00000001 0a0b0007 53414d55<br>
ff115fb0  000b0050 00000000 00000000 00000000<br>
ff115fc0  00000000 00000000 00000012 ff0f1b58<br>
ff115fd0  00000000 00000000 00000000 00000000<br>
ff115fe0  ff115fb0 00000040 00000000 00000000<br>
ff115ff0  e244fd50 00000000 010000aa 00000000<br>
ff116000  ???????? ???????? ???????? ????????<br>
ff116010  ???????? ???????? ???????? ????????<br>
<br>
以上两部分内存对比，看出rep movsd指令已经把一部分数据拷过去了，可以猜测这条指令执行前ecx大概为0x18。</p>
<p>WinMount作者最令人佩服的是他的扭曲变换，可以说把代码混淆发挥到极致了，驱动被扭曲之后反汇编结果看起来也令人十分痛苦，故而我也没进一步分析这个的想法了，发此文章纯属记录。</p>
<p>因为我用的是WinMount 2.x最后一个稳定版本，不知道3.x怎么样，beta版的又怕怕，暂时不鼓捣它了。不过就其功能而言，WinMount的确是个比较强大的东东。</p>
<p>睡觉去了……</p> <a href="http://hi.baidu.com/yicong2007/blog/item/e11aa61c6169198386d6b624.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/e11aa61c6169198386d6b624.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-16  05:36</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/e11aa61c6169198386d6b624.html</guid>
</item>

<item>
        <title><![CDATA[金山客服内部考试题22，你会不会做错？]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/d3cf5f90b4483d85a877a446.html]]></link>
        <description><![CDATA[
		
		<p>原帖<a href="http://bbs.duba.net/viewthread.php?tid=22035421">http://bbs.duba.net/viewthread.php?tid=22035421</a>，25楼回复</p>
<p>在铁军blog上看到这一系列金山客服内部考试题，其中这一题，我认为大家比较容易犯错。</p>
<p>以下哪个修改过的userinit键值的数据会导致用户开机反复注销<br>
A.%systemroot%\system32\userinit.exe<br>
B.userinit.exe<br>
C.c:\windows\system32\userinit.exe,virus.exe<br>
D.c:\windows\system32\userinit.exe</p>
<p>答案是A。这是一个极具迷惑性的题目。迷惑项目主要是C。因为一般的答题者通常会认为，由于病毒跟随userinit.exe启动，才导致了反复注销。其实这种理解是错误的。<br>
出现开机反复注销的根源是系统找不到userinit.exe文件，而不是在启动userinit.exe的同时启动了病毒。<br>
那么，A项选择为什么会导致系统找不到userinit.exe文件呢？<br>
原因是A项的字符串中使用了环境变量%systemroot%<br>
对于环境变量，这又是一个答题者容易忽略的注册表常识：在注册表中并不是所有字符串类型的键值，都支持环境变量的替换。<br>
注册表键值中两种主要的字符串形式的键类型，一个是REG_SZ，一个是REG_EXPAND_SZ，两者的一个显著区别就是只有REG_EXPAND_SZ类型的键支持在键值中使用%systemroot%这样的环境变量。</p>
<p>具体到本题，相关注册表键位于<br>
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]<br>
大家可以打开注册表，睁大眼睛看看这个键，你会发现在默认情况下它的类型是REG_SZ！</p>
<p>因此，这个键值不支持A选项这种包含环境变量的设置方法。当系统启动过程中读取这个键值时，没有办法将其中的%systemroot%当成环境变量并转化为WINDOWS文件夹的路径，于是导致系统找不到userinit.exe文件，不能启动userinit.exe，因此用户会遭遇登录后立即注销的问题。</p>
<p>REG_SZ与REG_EXPAND_SZ类型的某些区别是经常被我们忽略的问题，比如SREng的启动项添加和编辑功能，默认只是创建REG_SZ类型的，因此不支持环境变量。</p>
<p>然而事情是不是如此简单？未必。因为在注册表键值中使用环境变量，不单单要考虑键类型的问题，在某些条件下还要考虑这个环境变量是否已经被初始化的问题。</p>
<p>环境变量一般分为系统环境变量和用户环境变量。从系统启动到成功创建用户会话，到用户终于可以看到桌面的过程中，系统环境变量和用户环境变量的初始化是在不同的阶段进行的。</p>
<p>系统环境变量的初始化，是由会话管理器smss.exe完成的。smss.exe完成初始化后，创建csrss.exe和winlogon.exe进程，winlogon.exe进程再创建其他用户态进程。</p>
<p>userinit.exe进程是由winlogon.exe创建的，执行用户环境的初始化工作，完成如环境变量初始化、运行登陆脚本和应用安全策略等任务后运行缺省的Shell，即explorer.exe</p>
<p>从以上的两段中，你看出了什么？对了，在userinit.exe被启动之前，用户环境变量未被初始化，已被初始化的只有系统环境变量。</p>
<p>因此，即使Userinit键的类型是REG_EXPAND_SZ，也不代表它能使用所有的环境变量。这说明，在我们对系统的修改涉及到系统启动过程的时候，我们的考虑应该更加细致。</p> <a href="http://hi.baidu.com/yicong2007/blog/item/d3cf5f90b4483d85a877a446.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/d3cf5f90b4483d85a877a446.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-01  21:00</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/d3cf5f90b4483d85a877a446.html</guid>
</item>

<item>
        <title><![CDATA[Conficker的运行检测条件]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/44bd9ed4fc3bc909a18bb79a.html]]></link>
        <description><![CDATA[
		
		<p><font face="新宋体">剑盟原帖</font><a href="http://bbs.janmeng.com/viewthread.php?tid=856992&amp;extra=page%3D1" target="_blank"><font face="新宋体" color="#0070af">http://bbs.janmeng.com/viewthread.php?tid=856992&amp;extra=page%3D1</font></a>，第5楼回复<br>
<font face="新宋体">hmily发了一个Conficker，为了便于会员测试修改了可能影响的跳转。<br>
未修改时：<br>
0041B6A4&nbsp;&nbsp;&nbsp;&nbsp; 8D45 F0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">lea</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #808000">eax</span>, <span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-10]<br>
0041B6A7&nbsp;&nbsp;&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">push</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">eax</span><br>
0041B6A8&nbsp;&nbsp;&nbsp;&nbsp; FF15 14104000&nbsp;&nbsp;  <span style="color: #0000ff">call</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [&lt;&amp;KERNEL32.GetSystemTime&gt;]&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: #008000">; kernel32.GetSystemTime</span><br>
0041B6AE&nbsp;&nbsp;&nbsp;&nbsp; 66:817D F0 D907 <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">word</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-10], 7D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 2009年</span><br>
0041B6B4&nbsp;&nbsp;&nbsp;&nbsp; 8B3D 80104000&nbsp;&nbsp;  <span style="color: #0000ff">mov</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #808000">edi</span>, <span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [&lt;&amp;MSVCRT.sprintf&gt;]&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: #008000">; MSVCRT.sprintf</span><br>
0041B6BA&nbsp;&nbsp;&nbsp;&nbsp; 0F87 6A010000&nbsp;&nbsp;  <span style="color: #0000ff">ja</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0041B82A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 大于则跳</span><br>
0041B6C0&nbsp;&nbsp;&nbsp;&nbsp; 75 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">jnz</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">short</span> 0041B6DA<br>
0041B6C2&nbsp;&nbsp;&nbsp;&nbsp; 66:837D F2 03&nbsp;&nbsp;  <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">word</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-E], 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 3月</span><br>
0041B6C7&nbsp;&nbsp;&nbsp;&nbsp; 0F87 5D010000&nbsp;&nbsp;  <span style="color: #0000ff">ja</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0041B82A<br>
0041B6CD&nbsp;&nbsp;&nbsp;&nbsp; 75 0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">jnz</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">short</span> 0041B6DA<br>
0041B6CF&nbsp;&nbsp;&nbsp;&nbsp; 66:837D F6 13&nbsp;&nbsp;  <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">word</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-A], 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 19日</span><br>
0041B6D4&nbsp;&nbsp;&nbsp;&nbsp; 0F87 50010000&nbsp;&nbsp;  <span style="color: #0000ff">ja</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0041B82A<br>
0041B6DA&nbsp;&nbsp;&nbsp;&nbsp; FF15 18104000&nbsp;&nbsp;  <span style="color: #0000ff">call</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [&lt;&amp;KERNEL32.GetVersion&gt;]&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: #008000">; kernel32.GetVersion</span><br>
0041B6E0&nbsp;&nbsp;&nbsp;&nbsp; 3C 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #808000">al</span>, 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; Windows2000/XP/2k3</span><br>
0041B6E2&nbsp;&nbsp;&nbsp;&nbsp; 0F82 42010000&nbsp;&nbsp;  <span style="color: #0000ff">jb</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0041B82A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 小于则跳</span><br>
0041B6E8&nbsp;&nbsp;&nbsp;&nbsp; 0F00C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">sldt</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">ax</span><br>
0041B6EB&nbsp;&nbsp;&nbsp;&nbsp; 66:85C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">test</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">ax</span>, <span style="color: #808000">ax</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 虚拟机环境中ax!=0</span><br>
0041B6EE&nbsp;&nbsp;&nbsp;&nbsp; 0F85 36010000&nbsp;&nbsp;  <span style="color: #0000ff">jnz</span>&nbsp;&nbsp;&nbsp;&nbsp;  0041B82A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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: #008000">; 非零则跳</span><br>
0041B6F4&nbsp;&nbsp;&nbsp;&nbsp; 8885 DCFEFFFF&nbsp;&nbsp;  <span style="color: #0000ff">mov</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">byte</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-124], <span style="color: #808000">al</span><br>
<br>
修改后：<br>
0041B6A4&nbsp;&nbsp;&nbsp;&nbsp; 8D45 F0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">lea</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #808000">eax</span>, <span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-10]<br>
0041B6A7&nbsp;&nbsp;&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">push</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">eax</span><br>
0041B6A8&nbsp;&nbsp;&nbsp;&nbsp; FF15 14104000&nbsp;&nbsp;  <span style="color: #0000ff">call</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [&lt;&amp;KERNEL32.GetSystemTime&gt;]&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: #008000">; kernel32.GetSystemTime</span><br>
0041B6AE&nbsp;&nbsp;&nbsp;&nbsp; 66:817D F0 D907 <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">word</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-10], 7D9<br>
0041B6B4&nbsp;&nbsp;&nbsp;&nbsp; 8B3D 80104000&nbsp;&nbsp;  <span style="color: #0000ff">mov</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #808000">edi</span>, <span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [&lt;&amp;MSVCRT.sprintf&gt;]&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: #008000">; MSVCRT.sprintf</span><br>
0041B6BA&nbsp;&nbsp;&nbsp;&nbsp; EB 1E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">jmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">short</span> 0041B6DA<br>
0041B6BC&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6BD&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6BE&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6BF&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6C0&nbsp;&nbsp;&nbsp;&nbsp; 75 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">jnz</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">short</span> 0041B6DA<br>
0041B6C2&nbsp;&nbsp;&nbsp;&nbsp; 66:837D F2 03&nbsp;&nbsp;  <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">word</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-E], 3<br>
0041B6C7&nbsp;&nbsp;&nbsp;&nbsp; 0F87 5D010000&nbsp;&nbsp;  <span style="color: #0000ff">ja</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0041B82A<br>
0041B6CD&nbsp;&nbsp;&nbsp;&nbsp; 75 0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">jnz</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">short</span> 0041B6DA<br>
0041B6CF&nbsp;&nbsp;&nbsp;&nbsp; 66:837D F6 13&nbsp;&nbsp;  <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">word</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-A], 13<br>
0041B6D4&nbsp;&nbsp;&nbsp;&nbsp; 0F87 50010000&nbsp;&nbsp;  <span style="color: #0000ff">ja</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0041B82A<br>
0041B6DA&nbsp;&nbsp;&nbsp;&nbsp; FF15 18104000&nbsp;&nbsp;  <span style="color: #0000ff">call</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">dword</span> <span style="color: #ff0000">ptr</span> [&lt;&amp;KERNEL32.GetVersion&gt;]&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: #008000">; kernel32.GetVersion</span><br>
0041B6E0&nbsp;&nbsp;&nbsp;&nbsp; 3C 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">cmp</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #808000">al</span>, 5<br>
0041B6E2&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6E3&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6E4&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6E5&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6E6&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6E7&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6E8&nbsp;&nbsp;&nbsp;&nbsp; 0F00C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">sldt</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">ax</span><br>
0041B6EB&nbsp;&nbsp;&nbsp;&nbsp; 66:85C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #0000ff">test</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">ax</span>, <span style="color: #808000">ax</span><br>
0041B6EE&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6EF&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6F0&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6F1&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6F2&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6F3&nbsp;&nbsp;&nbsp;&nbsp; 90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">nop</span><br>
0041B6F4&nbsp;&nbsp;&nbsp;&nbsp; 8885 DCFEFFFF&nbsp;&nbsp;  <span style="color: #0000ff">mov</span>&nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: #ff0000">byte</span> <span style="color: #ff0000">ptr</span> [<span style="color: #808000">ebp</span>-124], <span style="color: #808000">al</span><br>
<br>
可以看到被修改的地方涉及三个运行条件的检测：<br>
1.系统时间超过2009年3月19日则跳走，这是对系统时间的限制<br>
2.系统版本低于Win2000则跳走，这是操作系统版本的限制<br>
3.系统在虚拟机下运行，则跳走，这是对病毒分析员利用虚拟机调试病毒的限制</font></p>
<p> </p> <a href="http://hi.baidu.com/yicong2007/blog/item/44bd9ed4fc3bc909a18bb79a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/44bd9ed4fc3bc909a18bb79a.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-01  20:10</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/44bd9ed4fc3bc909a18bb79a.html</guid>
</item>

<item>
        <title><![CDATA[MS09-002，刚刚触发了一下（二）]]></title>
        <link><![CDATA[http://hi.baidu.com/yicong2007/blog/item/69816df078065cc47831aa63.html]]></link>
        <description><![CDATA[
		
		<p>前面已经知道call进shellcode的代码位于mshtml!CFunctionPointer::PrivateAddRef</p>
<p>用IDA加载mshtml.dll，找到mshtml!CFunctionPointer::PrivateAddRef函数：<br>
.text:42AF7811 public: virtual unsigned long __stdcall CFunctionPointer::PrivateAddRef(void) proc near<br>
.text:42AF7811&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; DATA XREF: .text:42A3B3C4 o<br>
.text:42AF7811</p>
<p>从函数头部的交叉参考进入，可以看到它被一个常量所引用：<br>
.text:42A3B3C0 const CFunctionPointer::`vftable' dd offset CFunctionPointer::PrivateQueryInterface(_GUID const &amp;,void * *)<br>
.text:42A3B3C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; DATA XREF: CFunctionPointer::CFunctionPointer(CBase *,long)+15 o<br>
.text:42A3B3C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CElement::get_nodeType(long *)+1660 o<br>
.text:42A3B3C4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dd offset CFunctionPointer::PrivateAddRef(void)<br>
.text:42A3B3C8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dd offset CFunctionPointer::PrivateRelease(void)</p>
<p>这里可以说是一个messages dispatcher的表了，这个位置又被CFunctionPointer::CFunctionPointer所引用。CFunctionPointer::CFunctionPointer是一个类的构造函数：</p>
<p>.text:42AF79D9 public: __thiscall CFunctionPointer::CFunctionPointer(class CBase *, long) proc near<br>
.text:42AF79D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 XREF: CBase::ContextInvokeEx(long,ulong,ushort,tagDISPPARAMS *,tagVARIANT *,tagEXCEPINFO *,IServiceProvider *,IUnknown *)+AF361 p<br>
.text:42AF79D9<br>
.text:42AF79D9 arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr  8<br>
.text:42AF79D9 arg_4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr  0Ch<br>
.text:42AF79D9<br>
.text:42AF79D9 ; FUNCTION CHUNK AT .text:42B3F2C0 SIZE 00000020 BYTES<br>
.text:42AF79D9<br>
.text:42AF79D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, edi<br>
.text:42AF79DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp<br>
.text:42AF79DC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebp, esp<br>
.text:42AF79DE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  esi<br>
.text:42AF79DF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  esi, ecx<br>
.text:42AF79E1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  CBase::CBase(void)<br>
.text:42AF79E1<br>
.text:42AF79E6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebp+arg_0]<br>
.text:42AF79E9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  ecx, ecx<br>
.text:42AF79EB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+arg_4]<br>
.text:42AF79EE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [esi], offset const CFunctionPointer::`vftable'<br>
.text:42AF79F4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+10h], ecx<br>
.text:42AF79F7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+14h], eax<br>
.text:42AF79FA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_42AF7A19<br>
.text:42AF79FA<br>
.text:42AF79FC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ecx]<br>
.text:42AF79FE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  dword ptr [eax+34h]<br>
.text:42AF7A01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:42AF7A03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+18h], eax<br>
.text:42AF7A06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  loc_42B3F2C0<br>
.text:42AF7A06<br>
.text:42AF7A0C<br>
.text:42AF7A0C loc_42AF7A0C:&nbsp;&nbsp;&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 XREF: CFunctionPointer::CFunctionPointer(CBase *,long)+47902 j<br>
.text:42AF7A0C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [esi+18h]<br>
.text:42AF7A0F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:42AF7A11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_42AF7A19<br>
.text:42AF7A11<br>
.text:42AF7A13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [eax]<br>
.text:42AF7A15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax<br>
.text:42AF7A16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  dword ptr [ecx+4]<br>
.text:42AF7A16<br>
.text:42AF7A19<br>
.text:42AF7A19 loc_42AF7A19:&nbsp;&nbsp;&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 XREF: CFunctionPointer::CFunctionPointer(CBase *,long)+21 j<br>
.text:42AF7A19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CFunctionPointer::CFunctionPointer(CBase *,long)+38 j<br>
.text:42AF7A19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, esi<br>
.text:42AF7A1B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  esi<br>
.text:42AF7A1C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ebp<br>
.text:42AF7A1D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  retn&nbsp;&nbsp;&nbsp;  8</p>
<p>那么微软怎么把这个漏洞改掉的呢？打上KB961260补丁，我们返回来看刚刚那个表：</p>
<p>.text:42A39708 const CFunctionPointer::`vftable' dd offset CFunctionPointer::PrivateQueryInterface(_GUID const &amp;,void * *)<br>
.text:42A39708&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; DATA XREF: CFunctionPointer::CFunctionPointer(CBase *,long)+15 o<br>
.text:42A39708&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CElement::get_nodeType(long *)+1658 o<br>
.text:42A3970C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dd offset CIVersionVectorThunk::AddRef(void)<br>
.text:42A39710&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dd offset CBase::PrivateRelease(void)</p>
<p>把CFunctionPointer::PrivateAddRef从表上换掉了，换成了CIVersionVectorThunk::AddRef(void)，这个函数的动作：</p>
<p>.text:42A4156D public: virtual unsigned long __stdcall CIVersionVectorThunk::AddRef(void) proc near<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; DATA XREF: .text:42A0355C o<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; .text:42A38434 o<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; .text:42A384B4 o<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; .text:42A38534 o<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; .text:42A385BC o<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; .text:42A38644 o ...<br>
.text:42A4156D<br>
.text:42A4156D arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr  8<br>
.text:42A4156D<br>
.text:42A4156D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, edi<br>
.text:42A4156F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp<br>
.text:42A41570&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebp, esp<br>
.text:42A41572&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+arg_0]<br>
.text:42A41575&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  inc&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [eax+4]<br>
.text:42A41578&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  xor&nbsp;&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:42A4157A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ebp<br>
.text:42A4157B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  retn&nbsp;&nbsp;&nbsp;  4<br>
.text:42A4157B<br>
.text:42A4157B public: virtual unsigned long __stdcall CIVersionVectorThunk::AddRef(void) endp</p>
<p>与之前的CFunctionPointer::PrivateAddRef对比可以发现，现在的CIVersionVectorThunk::AddRef只是设置一个引用计数（inc&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [eax+4]），没有其他调用了。</p>
<p>同时修改的还有CFunctionPointer::PrivateRelease，在表中它的位置直接被替换成了基类的方法CBase::PrivateRelease。</p>
<p>看看修改前的CFunctionPointer::PrivateRelease函数：</p>
<p>.text:42B1E30D public: virtual unsigned long __stdcall CFunctionPointer::PrivateRelease(void) proc near<br>
.text:42B1E30D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; DATA XREF: .text:42A3B3C8 o<br>
.text:42B1E30D<br>
.text:42B1E30D arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  = dword ptr  8<br>
.text:42B1E30D<br>
.text:42B1E30D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, edi<br>
.text:42B1E30F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp<br>
.text:42B1E310&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebp, esp<br>
.text:42B1E312&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  esi<br>
.text:42B1E313&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  esi, [ebp+arg_0]<br>
.text:42B1E316&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [esi+10h], 0<br>
.text:42B1E31A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  loc_42B22250<br>
.text:42B1E31A<br>
.text:42B1E320&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [esi+4], 1<br>
.text:42B1E324&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jbe&nbsp;&nbsp;&nbsp;&nbsp;  loc_42B22250<br>
.text:42B1E324<br>
.text:42B1E32A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  add&nbsp;&nbsp;&nbsp;&nbsp;  dword ptr [esi+8], 8<br>
.text:42B1E32E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edi<br>
.text:42B1E32F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  esi<br>
.text:42B1E330&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  CBase::PrivateRelease(void)<br>
.text:42B1E330<br>
.text:42B1E335&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, eax<br>
.text:42B1E337&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [esi+10h]<br>
.text:42B1E33A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [eax]<br>
.text:42B1E33C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax<br>
.text:42B1E33D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  dword ptr [ecx+8]<br>
.text:42B1E340&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, esi<br>
.text:42B1E342&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  CBase::SubRelease(void)<br>
.text:42B1E342<br>
.text:42B1E347&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, edi<br>
.text:42B1E349&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  edi<br>
.text:42B1E349<br>
.text:42B1E34A<br>
.text:42B1E34A loc_42B1E34A:&nbsp;&nbsp;&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 XREF: CElement::get_nodeType(long *)+1627 j<br>
.text:42B1E34A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  esi<br>
.text:42B1E34B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  pop&nbsp;&nbsp;&nbsp;&nbsp;  ebp<br>
.text:42B1E34C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  retn&nbsp;&nbsp;&nbsp;  4<br>
.text:42B1E34C<br>
.text:42B1E34C public: virtual unsigned long __stdcall CFunctionPointer::PrivateRelease(void) endp</p>
<p>显然也存在与CFunctionPointer::PrivateAddRef相类似的问题，可能call进shellcode中。现在换成了CBase::PrivateRelease，同样也就是直接把对象的引用计数标志减1而已。</p> <a href="http://hi.baidu.com/yicong2007/blog/item/69816df078065cc47831aa63.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yicong2007/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yicong2007/blog/item/69816df078065cc47831aa63.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-21  22:57</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yicong2007]]></author>
		<guid>http://hi.baidu.com/yicong2007/blog/item/69816df078065cc47831aa63.html</guid>
</item>


</channel>
</rss>