<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Anti-Rootkit]]></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技术]]></description>
<link>http://hi.baidu.com/antirootkit</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[预见2008]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/37b981f4d859d4eb7709d771.html]]></link>
        <description><![CDATA[
		
		<p>换工作,找个女朋友,庸俗,贪婪并快乐着.</p>
<p>本来打算公布些源代码的,后来想想,放出来又被别人A去卖钱,何必呢?真有兴趣的朋友自然也会交换.</p>
<p>最后,祝愿中国的病毒越来越邪恶,没有你们的邪恶就没有乐趣的存在.感谢CCTV,感谢狗日报,感谢百度,是你们给了我一个八卦的平台.</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%C9%FA%BB%EE%C0%E0">生活类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/37b981f4d859d4eb7709d771.html#comment">查看评论</a>]]></description>
        <pubDate>2008-01-01  15:07</pubDate>
        <category><![CDATA[生活类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/37b981f4d859d4eb7709d771.html</guid>
</item>

<item>
        <title><![CDATA[年底周期综合症]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/8742a82d057c3f30349bf713.html]]></link>
        <description><![CDATA[
		
		最近一段时间比较消沉，可能还会持续数周吧.rootkit已经很难有新突破了，以后我也不想再写这个题材了.blog留着继续写，写什么呢?漏洞挖掘利用，病毒引擎，脚本注射.<br>
<br>
xfocus,pediy,driverdevelop都没有讨论热了，怀念以前nsfocus的氛围了，技术交流已经开始消亡. 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%C9%FA%BB%EE%C0%E0">生活类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/8742a82d057c3f30349bf713.html#comment">查看评论</a>]]></description>
        <pubDate>2007-12-29  14:30</pubDate>
        <category><![CDATA[生活类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/8742a82d057c3f30349bf713.html</guid>
</item>

<item>
        <title><![CDATA[意淫-虚拟机anti-rootkit(一)]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/f2d5bbd399e812033af3cf95.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp;&nbsp;   为了解决生理需求，我打算大胆的写一篇。没错，就拿Virtual Machine开刀，毕竟现在市面上已经出现了一些基于虚拟机的rootkit以及很具备威胁性的bootkit。虚拟机的antivirus已经不足为奇了，然而，作为一个商业级的产品，那些基于虚拟机运作的安全类软件都显得毫无意义，我的一个大胆的想法是重构环境（VMware类软件）,VMware一个另人遗憾的地方是在虚拟CPU指令的同时并未做额外的安全措施，它只是在忠实的模拟环境。</p>
<p><br>
Virtual Machine Anti-Rootkit可行性分析:<br>
1.操作系统将在我们的Anti-Rootkit虚拟环境中运行:随着硬件设备性能和用户安全意识的不断提高，相信用不了多久，基于虚<br>
拟机的安全防范会得到重视（可行）<br>
2.可靠稳定的模拟系统:Xen、VMware、Virual PC是一些可靠稳定的产品，然而，对于我个人而言写一款这样的东西显然是件不<br>
靠谱的事(不可行）<br>
3.特殊虚拟指令的处理:一个初步简单的例子是IDT GDT SDT的处理,针对特定Virtual Machine Rootkit做出反应(可行)</p>
<p>总结:见标题前4个字节</p>
<p>例子代码：<br>
typedef struct _EFLAGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //虚拟的EFLAGS<br>
{<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved1&nbsp;&nbsp;&nbsp;&nbsp;   :10;<br>
&nbsp;&nbsp;&nbsp;   unsigned ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 识别标识<br>
&nbsp;&nbsp;&nbsp;   unsigned VIP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 虚拟中断pending<br>
&nbsp;&nbsp;&nbsp;   unsigned VIF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 虚拟中断 flag<br>
&nbsp;&nbsp;&nbsp;   unsigned AC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 检测队列标识<br>
&nbsp;&nbsp;&nbsp;   unsigned VM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 8086模式<br>
&nbsp;&nbsp;&nbsp;   unsigned RF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 恢复标识<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved2&nbsp;&nbsp;&nbsp;&nbsp;   :1;<br>
&nbsp;&nbsp;&nbsp;   unsigned NT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned IOPL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // I/O特权级别<br>
&nbsp;&nbsp;&nbsp;   unsigned OF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;<br>
&nbsp;&nbsp;&nbsp;   unsigned DF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;<br>
&nbsp;&nbsp;&nbsp;   unsigned IF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned TF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned SF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned ZF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved3&nbsp;&nbsp;&nbsp;&nbsp;   :1;<br>
&nbsp;&nbsp;&nbsp;   unsigned AF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved4&nbsp;&nbsp;&nbsp;&nbsp;   :1;<br>
&nbsp;&nbsp;&nbsp;   unsigned PF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved5&nbsp;&nbsp;&nbsp;&nbsp;   :1;<br>
&nbsp;&nbsp;&nbsp;   unsigned CF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // 进位标识 [Bit 0]</p>
<p>} EFLAGS;</p>
<p>typedef struct _MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //MSR结构<br>
{<br>
&nbsp;&nbsp;&nbsp;   ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Hi;<br>
&nbsp;&nbsp;&nbsp;   ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   Lo;</p>
<p>} MSR;</p>
<p>typedef struct _IA32_VMX_BASIC_MSR<br>
{</p>
<p>&nbsp;&nbsp;&nbsp;   unsigned RevId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :32;&nbsp;&nbsp;&nbsp;   // Bits 31...0 contain the VMCS revision identifier<br>
&nbsp;&nbsp;&nbsp;   unsigned szVmxOnRegion  :12;&nbsp;&nbsp;&nbsp;   // Bits 43...32 report # of bytes for VMXON region <br>
&nbsp;&nbsp;&nbsp;   unsigned RegionClear&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Bit 44 set only if bits 32-43 are clear<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Undefined<br>
&nbsp;&nbsp;&nbsp;   unsigned PhyAddrWidth&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Physical address width for referencing VMXON, VMCS, etc.<br>
&nbsp;&nbsp;&nbsp;   unsigned DualMon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Reports whether the processor supports dual-monitor<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // treatment of SMI and SMM<br>
&nbsp;&nbsp;&nbsp;   unsigned MemType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Memory type that the processor uses to access the VMCS<br>
&nbsp;&nbsp;&nbsp;   unsigned VmExitReport&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Reports weather the procesor reports info in the VM-exit<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // instruction information field on VM exits due to execution<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // of the INS and OUTS instructions<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :9;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Undefined</p>
<p>} IA32_VMX_BASIC_MSR;</p>
<p>typedef struct _IA32_FEATURE_CONTROL_MSR<br>
{<br>
&nbsp;&nbsp;&nbsp;   unsigned Lock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Bit 0 is the lock bit - cannot be modified once lock is set<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Undefined<br>
&nbsp;&nbsp;&nbsp;   unsigned EnableVmxon&nbsp;&nbsp;&nbsp;   :1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   // Bit 2. If this bit is clear, VMXON causes a general protection exception<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :29;&nbsp;&nbsp;&nbsp;   // Undefined<br>
&nbsp;&nbsp;&nbsp;   unsigned Reserved3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   :32;&nbsp;&nbsp;&nbsp;   // Undefined</p>
<p>} IA32_FEATURE_CONTROL_MSR;<br>
有事，下次接着来，抱歉了.</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/f2d5bbd399e812033af3cf95.html#comment">查看评论</a>]]></description>
        <pubDate>2007-11-13  11:12</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/f2d5bbd399e812033af3cf95.html</guid>
</item>

<item>
        <title><![CDATA[又一种隐藏驱动的检测]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/5f15f6ecd91fbfd22e2e217c.html]]></link>
        <description><![CDATA[
		
		近来搜索内存的方法比较吃香,好吧!我们移植过来用.其实也就是从内核地址空间0x80000000-0xffff0000之间暴力搜PE映像，然后综合某些条件来判断是否驱动的PE映象.代码就不放了,呵呵 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/5f15f6ecd91fbfd22e2e217c.html#comment">查看评论</a>]]></description>
        <pubDate>2007-11-02  10:30</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/5f15f6ecd91fbfd22e2e217c.html</guid>
</item>

<item>
        <title><![CDATA[检测隐藏端口]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/6b4f19ee5a74bb2a2df534ef.html]]></link>
        <description><![CDATA[
		
		<p>rootkit实现隐藏端口的原理其实很简单,就是hook tcpip.sys,伪造irp.知道原理了就看代码吧</p>
<p>void RestoreTcpipIRP()<br>
{<br>
UNICODE_STRING DeviceName; <br>
PDRIVER_OBJECT DriverObject; <br>
NTSTATUS status; <br>
DWORD ret;<br>
KIRQL OldIrql;<br>
ULONG TempDisp ;<br>
ULONG DirverEntry ;<br>
ULONG i ;<br>
ULONG TcpDispatch =0;<br>
ULONG TcpDeviceControlDispatch =0 ;<br>
ULONG TempAddr =0 ;<br>
UNICODE_STRING TcpipDriverFileName ;<br>
OBJECT_ATTRIBUTES oba ;<br>
HANDLE hTcpipFile ;<br>
IO_STATUS_BLOCK IoStatusBlock ;<br>
HANDLE hTcpipSection ;<br>
PVOID BaseAddress =NULL ;<br>
SIZE_T nSize = 0 ;<br>
ULONG Ppeheader ;<br>
ULONG pEntryPoint ;<br>
ULONG TcpipBase ;<br>
ULONG ImageBase ;<br>
RtlInitUnicodeString(&amp;TcpipDriverFileName , L&quot;\\SystemRoot\\System32\\Drivers\\Tcpip.sys&quot;) ;<br>
RtlInitUnicodeString(&amp;DeviceName,L<a href="file://  Driver  Tcpip">\\Driver\\Tcpip</a>);<br>
status = ObReferenceObjectByName( <br>
&amp;DeviceName, <br>
OBJ_CASE_INSENSITIVE, <br>
NULL, <br>
0, <br>
*IoDriverObjectType, <br>
KernelMode, <br>
NULL, <br>
(PVOID*)&amp;DriverObject); <br>
KDMSG((&quot;Geth the tcpip driver object = %08x&quot;, DriverObject));<br>
if (DriverObject) <br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  TcpipBase = MyGetModuleBaseAddress(&quot;tcpip.sys&quot;);&nbsp;&nbsp;  \\自己去得到吧,我没提供<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (!TcpipBase)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KDMSG((&quot;can't get the base address of the tcpip.sys \n&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  InitializeObjectAttributes(&amp;oba ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;TcpipDriverFileName,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OBJ_CASE_INSENSITIVE,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  );&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  status = ZwCreateFile (&amp;hTcpipFile ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_EXECUTE | SYNCHRONIZE ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;oba,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;IoStatusBlock,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_ATTRIBUTE_NORMAL ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_SHARE_READ ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_OPEN_IF,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  FILE_SYNCHRONOUS_IO_NONALERT,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  );<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (!NT_SUCCESS(status))<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KDMSG((&quot;Open the tcp ip file failed!\n&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  InitializeObjectAttributes(&amp;oba,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OBJ_CASE_INSENSITIVE,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  status = ZwCreateSection (&amp;hTcpipSection ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SECTION_ALL_ACCESS,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;oba,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PAGE_EXECUTE,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0x1000000, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  hTcpipFile );<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (!NT_SUCCESS(status ))<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KDMSG ((&quot;create the tcpip section failed!\n&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (hTcpipFile)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ZwClose(hTcpipFile);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  status = ZwMapViewOfSection(hTcpipSection,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NtCurrentProcess(),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;BaseAddress ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  1000,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;nSize,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ViewShare ,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MEM_TOP_DOWN,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  PAGE_READWRITE<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  );<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (!NT_SUCCESS(status))<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KDMSG((&quot;Map view the tcpip section failed!\n&quot;));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (hTcpipSection)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ZwClose(hTcpipSection);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (hTcpipFile)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ZwClose(hTcpipFile);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ppeheader = *(ULONG*)((ULONG)BaseAddress+0x3c);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  pEntryPoint = *(ULONG*)((ULONG)BaseAddress+Ppeheader+0x28);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  DirverEntry = (ULONG)BaseAddress+pEntryPoint ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  ImageBase = *(ULONG*)((ULONG)BaseAddress+Ppeheader+0x34);<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  //DirverEntry = DriverObject-&gt;DriverInit ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (DirverEntry)&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for (i = DirverEntry ; i &lt; DirverEntry + SearchDepth ; i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (MmIsAddressValid((PVOID)i))<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (*(BYTE*)i == 0x8d &amp;&amp; *(BYTE*)(i+1) == 0x7e &amp;&amp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  *(BYTE*)(i+2) == 0x38 &amp;&amp; *(BYTE*)(i+3) == 0xf3 &amp;&amp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  *(BYTE*)(i+4) == 0xab)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (MmIsAddressValid((PVOID)(i-4)))<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (MmIsAddressValid((PVOID)(*(ULONG*)(i-4) + TcpipBase - ImageBase)))<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;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TcpDispatch = *(ULONG*)(i-4) + TcpipBase - ImageBase;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TempAddr = i;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break ;<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;  }<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;<br>
/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }*/<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //find code =8d 7e 38 f3 ab<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //lea edi,[esi+38h]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //rep stosd<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (TempAddr &amp;&amp; TcpDispatch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for (i = TempAddr ; i &lt; TempAddr +0x30 ; i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (MmIsAddressValid((PVOID)i))<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (*(BYTE*)i == 0xc7 &amp;&amp; *(BYTE*)(i+1) == 0x46 &amp;&amp; *(BYTE*)(i+2) == 0x74)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (MmIsAddressValid((PVOID)(*(ULONG*)(i+3) + TcpipBase - ImageBase)))<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;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TcpDeviceControlDispatch = *(ULONG*)(i+3) + TcpipBase - ImageBase;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<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;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }*/<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (TcpDispatch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KeAcquireSpinLock(&amp;SDTSpinLock , &amp;OldIrql);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  WPOFF();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for (i = 0 ; i &lt;=IRP_MJ_MAXIMUM_FUNCTION ; i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DriverObject-&gt;MajorFunction<em> = TcpDispatch ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (TcpDeviceControlDispatch)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DriverObject-&gt;MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TcpDeviceControlDispatch ;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  WPON();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KeReleaseSpinLock(&amp;SDTSpinLock , OldIrql);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ObfDereferenceObject(DriverObject);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  ZwUnmapViewOfSection(NtCurrentProcess(),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  BaseAddress);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (hTcpipSection)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ZwClose(hTcpipSection);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if (hTcpipFile)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ZwClose(hTcpipFile);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
return ;<br>
<br>
}</em></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/6b4f19ee5a74bb2a2df534ef.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-29  11:35</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/6b4f19ee5a74bb2a2df534ef.html</guid>
</item>

<item>
        <title><![CDATA[检测inline hook]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/0cdf3a455ba1fe25cffca34c.html]]></link>
        <description><![CDATA[
		
		<p>今天,你hook了吗?这已经成为rootkiter们打招呼时的用语.</p>
<p>hook,当然要hook,我要ho完了再ok.</p>
<p>恩,给个例子吧.麻烦你下次专业点,连CPU也hook掉算了</p>
<p>DWORD CheckInlineHook(DWORD dw_addr)<br>
{<br>
BYTE opcode = *((PBYTE)(dw_addr));<br>
DWORD hook = 0;<br>
WORD desc = 0;<br>
if((opcode == 0xe8)||(opcode ==0xe9))<br>
{<br>
&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+1))&lt;&lt;0;<br>
&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+2))&lt;&lt;8;<br>
&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+3))&lt;&lt;16;<br>
&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+4))&lt;&lt;24;<br>
&nbsp;&nbsp;  hook += 5+dw_addr;<br>
}<br>
else<br>
&nbsp;&nbsp;  if(opcode == 0xea)<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+1))&lt;&lt;0;<br>
&nbsp;&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+2))&lt;&lt;8;<br>
&nbsp;&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+3))&lt;&lt;16;<br>
&nbsp;&nbsp;&nbsp;  hook |= *((PBYTE)(dw_addr+4))&lt;&lt;24;<br>
&nbsp;&nbsp;&nbsp;  desc = *((WORD*)(dw_addr+5);<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  if(hook != 0)<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  if((hook&lt;g_ntoskrnl.Base) || (hook&gt;g_ntoskrnl.End)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  hook = hook;<br>
&nbsp;&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;&nbsp;&nbsp;  hook =0;<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  return hook;<br>
}</p>
<p>最后,我不得不再次强调检测hook的重要性,否则你所做的一切都是徒劳.</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/0cdf3a455ba1fe25cffca34c.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-27  10:59</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/0cdf3a455ba1fe25cffca34c.html</guid>
</item>

<item>
        <title><![CDATA[rootkit的清除]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/7c4bc2c2762ffc36e5dd3b09.html]]></link>
        <description><![CDATA[
		
		<p>日常中,我们用一些anti-virus的时候可能发现这样一个问题,几乎有点意思的病毒+木马你都无法成功把他清除掉.不是因为杀毒软件产商没能力,而是这个方案对于一个产品来讲实在有些烂了,今天我的这篇blog要讲的就是这个话题.</p>
<p>先看一下ring3的方法吧</p>
<p>void Cxxx::FileDelete(CString FilePath)<br>
{<br>
BOOL bRet = SetFileAttributes(FilePath,FILE_ATTRIBUTE_ARCHIVE);// 设置目标程序为存档属性<br>
// 在临时目录产生产生两个随机的文件<br>
CString strReplaceFile[2];<br>
char szWinDir[256] = {0};<br>
::GetTempPath(256,szWinDir);<br>
szWinDir[strlen(szWinDir)] = '\\';<br>
<br>
for(int i = 0; i &lt; 2; i ++)<br>
{<br>
&nbsp;&nbsp;  char szTemp[256] = {0};<br>
&nbsp;&nbsp;  GetTempFileName(szWinDir,_T (&quot;♂&quot;),0,szTemp);<br>
&nbsp;&nbsp;  strReplaceFile[i] = szTemp;<br>
&nbsp;&nbsp;  HANDLE hFile = CreateFile(strReplaceFile[i],GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY,NULL);<br>
&nbsp;&nbsp;  if(hFile == (HANDLE)-1)<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  MessageBox(NULL,&quot;文件粉碎失败!&quot;,&quot;文件操作&quot;,MB_OK);<br>
&nbsp;&nbsp;&nbsp;  return ;<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  ::CloseHandle(hFile);<br>
}<br>
// 替换目标文件<br>
typedef BOOL&nbsp;&nbsp;  (__stdcall *PREPLACEFILE)(LPCTSTR lpReplacedFileName,LPCTSTR lpReplacementFileName,LPCTSTR lpBackupFileName,DWORD dwReplaceFlags,LPVOID lpExclude,LPVOID lpReserved);</p>
<p>HMODULE hKernel32 = GetModuleHandle(&quot;kernel32.dll&quot;);<br>
ASSERT(hKernel32);<br>
PREPLACEFILE pFnReplacefile = (PREPLACEFILE)GetProcAddress(hKernel32,&quot;ReplaceFileA&quot;);<br>
if(pFnReplacefile == NULL)<br>
{<br>
&nbsp;&nbsp;  MessageBox(NULL,&quot;您的系统不支持删除正在执行的文件!&quot;,&quot;文件操作&quot;,MB_OK);<br>
//&nbsp;&nbsp;  MessageBox(NULL,&quot;删除文件失败!&quot;,&quot;文件操作&quot;,MB_OK);<br>
&nbsp;&nbsp;  return;<br>
}<br>
bRet = pFnReplacefile(FilePath,strReplaceFile[0],strReplaceFile[1],3,0,0);<br>
if(!bRet)<br>
{<br>
//&nbsp;&nbsp;  CString strError;<br>
//&nbsp;&nbsp;  strError.Format(&quot;%d删除文件失败&quot;,GetLastError());<br>
//&nbsp;&nbsp;  PrintLog(strError);<br>
//&nbsp;&nbsp;  MessageBox(NULL,strError,&quot;文件操作&quot;,MB_OK);<br>
&nbsp;&nbsp;  return;<br>
}<br>
bRet = DeleteFile(FilePath);<br>
if(!bRet)<br>
{<br>
&nbsp;&nbsp;  MessageBox(NULL,&quot;删除正在执行的文件失败!&quot;,&quot;文件操作&quot;,MB_OK);<br>
&nbsp;&nbsp;  return;<br>
}</p>
<p>}<br>
下面是ring0的方法.</p>
<p>BOOLEAN SKillDeleteFile(IN HANDLE&nbsp;&nbsp;  FileHandle)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  NTSTATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ntStatus = STATUS_SUCCESS;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  PFILE_OBJECT&nbsp;&nbsp;&nbsp;&nbsp;  fileObject;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  PDEVICE_OBJECT&nbsp;&nbsp;  DeviceObject;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  PIRP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Irp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  KEVENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  event;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  FILE_DISPOSITION_INFORMATION&nbsp;&nbsp;  FileInformation;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  IO_STATUS_BLOCK ioStatus;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  PIO_STACK_LOCATION irpSp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  ntStatus = ObReferenceObjectByHandle(FileHandle,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DELETE,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  *IoFileObjectType,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  KernelMode,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;fileObject,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NULL);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  if (!NT_SUCCESS(ntStatus))<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return FALSE;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  DeviceObject = IoGetRelatedDeviceObject(fileObject);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Irp = IoAllocateIrp(DeviceObject-&gt;StackSize, TRUE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  if (Irp == NULL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ObDereferenceObject(fileObject);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return FALSE;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  KeInitializeEvent(&amp;event, SynchronizationEvent, FALSE);<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  FileInformation.DeleteFile = TRUE;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  Irp-&gt;AssociatedIrp.SystemBuffer = &amp;FileInformation;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Irp-&gt;UserEvent = &amp;event;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Irp-&gt;UserIosb = &amp;ioStatus;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Irp-&gt;Tail.Overlay.OriginalFileObject = fileObject;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Irp-&gt;Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Irp-&gt;RequestorMode = KernelMode;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp = IoGetNextIrpStackLocation(Irp);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp-&gt;MajorFunction = IRP_MJ_SET_INFORMATION;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp-&gt;DeviceObject = DeviceObject;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp-&gt;FileObject = fileObject;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp-&gt;Parameters.SetFile.Length = sizeof(FILE_DISPOSITION_INFORMATION);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp-&gt;Parameters.SetFile.FileInformationClass = FileDispositionInformation;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  irpSp-&gt;Parameters.SetFile.FileObject = fileObject;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  IoSetCompletionRoutine(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Irp,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SkillSetFileCompletion,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &amp;event,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TRUE,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TRUE,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  TRUE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  IoCallDriver(DeviceObject, Irp);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  KeWaitForSingleObject(&amp;event, Executive, KernelMode, TRUE, NULL);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  ObDereferenceObject(fileObject);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  return TRUE;<br>
}</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/7c4bc2c2762ffc36e5dd3b09.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-26  09:12</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/7c4bc2c2762ffc36e5dd3b09.html</guid>
</item>

<item>
        <title><![CDATA[抵抗来自rootkit的攻击]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/8c7b8133ee199cfb1a4cff19.html]]></link>
        <description><![CDATA[
		
		<p><a href="http://hi.baidu.com/antirootkit">http://hi.baidu.com/antirootkit</a></p>
<p>伟大的人民警察在出击逮捕抓获罪犯的同时,又不得不顾及自身的安全.更何况是我们小小anti事业,警察和罪犯的区别是什么?对,都是带有危险性器械的(刀,枪类).不废话了,抗打测试现在开始.</p>
<p>#include &quot;ntddk.h&quot;</p>
<p>WCHAR gDeviceName[]=L&quot;<a href="file://  Device  AntiantiClose">\\Device\\AntiantiClose</a>&quot;;<br>
WCHAR gDosDeviceName[]=L&quot;<a href="file://  ??  AntiantiClose">\\??\\AntiantiClose</a>&quot;;<br>
//定义一下<br>
NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus); <br>
NTSYSAPI NTSTATUS NTAPI ZwOpenProcess(IN PHANDLE ProcessHandle,ACCESS_MASK MASK,POBJECT_ATTRIBUTES attr,PCLIENT_ID cid1);</p>
<p>typedef NTSTATUS (*PZwTerminateProcess)(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);<br>
typedef NTSTATUS (*PZwOpenProcess)(IN PHANDLE ProcessHandle,ACCESS_MASK MASK,POBJECT_ATTRIBUTES attr,PCLIENT_ID cid1);</p>
<p>typedef struct ServiceDescriptorEntry {<br>
unsigned int *ServiceTableBase;<br>
unsigned int *ServiceCounterTableBase;<br>
unsigned int NumberOfServices;<br>
unsigned char *ParamTableBase;<br>
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;</p>
<p>NTSYSAPI&nbsp;&nbsp;  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;</p>
<p>//used for SSDT hook<br>
PMDL&nbsp;&nbsp;  g_pmdlSystemCall;<br>
PVOID *MappedSystemCallTable;<br>
PZwTerminateProcess&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Old_ZwTerminateProcess = NULL;<br>
PZwOpenProcess&nbsp;&nbsp;&nbsp;&nbsp;  Old_ZwOpenProcess = NULL;</p>
<p><br>
// used for state keeping<br>
PEPROCESS PEPROCESS2PROTECTED = 0;</p>
<p>//used for SSDT hook<br>
#define SYSTEMSERVICE(_function)&nbsp;&nbsp;  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]<br>
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)<br>
#define HOOK_SYSCALL(_Function, _Hook, _Orig )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  \<br>
_Orig = (PVOID) InterlockedExchange( (PLONG) \<br>
&amp;MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)</p>
<p>#define UNHOOK_SYSCALL(_Func, _Hook, _Orig )&nbsp;&nbsp;  \<br>
InterlockedExchange((PLONG)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  \<br>
&amp;MappedSystemCallTable[SYSCALL_INDEX(_Func)], (LONG) _Hook)<br>
//函数定义部分<br>
NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS * pEProcess);<br>
void HookSSDTTable();<br>
void UnHookSSDTTable();<br>
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);<br>
//hook掉关闭<br>
NTSTATUS NTAPI NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)<br>
{<br>
PEPROCESS process_to_kill;<br>
if (ObReferenceObjectByHandle(ProcessHandle,GENERIC_READ,NULL,KernelMode,<br>
&nbsp;&nbsp;  &amp;process_to_kill,0) == STATUS_SUCCESS){<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  if ( PEPROCESS2PROTECTED== process_to_kill &amp;&amp;<br>
&nbsp;&nbsp;&nbsp;  PsGetCurrentProcess() != process_to_kill) return STATUS_ACCESS_DENIED;<br>
}<br>
return&nbsp;&nbsp;  Old_ZwTerminateProcess(ProcessHandle,ExitStatus);<br>
}</p>
<p><br>
NTSTATUS NTAPI NewZwOpenProcess(IN PHANDLE ProcessHandle,ACCESS_MASK MASK,POBJECT_ATTRIBUTES attr,PCLIENT_ID cid1)<br>
{<br>
PEPROCESS process_to_kill,EProcess;<br>
NTSTATUS ans;<br>
// DbgPrint(&quot;%x&quot;,PsGetCurrentProcess());<br>
PsLookupProcessByProcessId( *(ULONG *)cid1, &amp;EProcess);<br>
if ((MASK != 0x401 ) &amp;&amp; (MASK != 0x400 ) &amp;&amp; PEPROCESS2PROTECTED== EProcess &amp;&amp;<br>
&nbsp;&nbsp;  PsGetCurrentProcess() != EProcess) return STATUS_ACCESS_DENIED;<br>
<br>
return Old_ZwOpenProcess(ProcessHandle,MASK,attr,cid1);<br>
}</p>
<p>void HookSSDTTable()<br>
{<br>
Old_ZwTerminateProcess =(PZwTerminateProcess)(SYSTEMSERVICE(ZwTerminateProcess));<br>
g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4); <br>
if(!g_pmdlSystemCall)<br>
&nbsp;&nbsp;  return; <br>
MmBuildMdlForNonPagedPool(g_pmdlSystemCall); <br>
g_pmdlSystemCall-&gt;MdlFlags = g_pmdlSystemCall-&gt;MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; <br>
MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);<br>
DbgPrint(&quot;Hooked!\n&quot;); <br>
HOOK_SYSCALL( ZwTerminateProcess, NewZwTerminateProcess, Old_ZwTerminateProcess );<br>
HOOK_SYSCALL( ZwOpenProcess, NewZwOpenProcess, Old_ZwOpenProcess );&nbsp;&nbsp;<br>
}</p>
<p>void UnHookSSDTTable()<br>
{ <br>
if (Old_ZwTerminateProcess)<br>
{<br>
&nbsp;&nbsp;  UNHOOK_SYSCALL( ZwTerminateProcess, Old_ZwTerminateProcess, NewZwTerminateProcess );<br>
&nbsp;&nbsp;  UNHOOK_SYSCALL( ZwOpenProcess, Old_ZwOpenProcess, NewZwOpenProcess );<br>
}<br>
if(g_pmdlSystemCall)<br>
{<br>
&nbsp;&nbsp;  MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall);<br>
&nbsp;&nbsp;  IoFreeMdl(g_pmdlSystemCall);<br>
}<br>
}</p>
<p>NTSTATUS&nbsp;&nbsp;  DriverEntry( IN PDRIVER_OBJECT DriverObject,&nbsp;&nbsp;  IN PUNICODE_STRING RegistryPath ) <br>
{<br>
UNICODE_STRING DeviceName;<br>
UNICODE_STRING DosDeviceName;<br>
PDEVICE_OBJECT pDeviceObject=NULL;<br>
NTSTATUS Status;<br>
RtlInitUnicodeString(&amp;DeviceName,gDeviceName);<br>
RtlInitUnicodeString(&amp;DosDeviceName,gDosDeviceName);<br>
IoCreateDevice(DriverObject,0,&amp;DeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&amp;pDeviceObject);<br>
pDeviceObject-&gt;Flags|=DO_BUFFERED_IO;<br>
Status = IoCreateSymbolicLink(&amp;DosDeviceName,&amp;DeviceName);<br>
if(Status)<br>
&nbsp;&nbsp;  DbgPrint(&quot;IoCreateSymbolicLink Return %0x\n&quot;,Status);<br>
else<br>
{<br>
&nbsp;&nbsp;  DbgPrint(&quot;ok\n&quot;);<br>
}<br>
HookSSDTTable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //开始HOOK<br>
return STATUS_SUCCESS; <br>
}</p>
<p>VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)<br>
{<br>
NTSTATUS status;<br>
UNICODE_STRING DosDeviceName;<br>
UnHookSSDTTable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //恢复HOOK<br>
RtlInitUnicodeString(&amp;DosDeviceName,gDosDeviceName);<br>
if(DriverObject-&gt;DeviceObject)<br>
&nbsp;&nbsp;  IoDeleteDevice(DriverObject-&gt;DeviceObject);<br>
status = IoDeleteSymbolicLink(&amp;DosDeviceName);<br>
if(status) <br>
&nbsp;&nbsp;  DbgPrint(&quot;IoDeleteSymbolicLink Return %0x\n&quot;,status); <br>
}</p>
<p>好了,上面的例子代码你看一定会说这种只有菜B才用的方法,作为终极对抗它是菜鸟,你或许可以写个虚拟机boot引导之类的.整天hook来hook去的没什么意思.</p>
<p>再发个强点点的吧</p>
<p>#include &lt;ntddk.h&gt;<br>
#include &quot;windef.h&quot;</p>
<p>NTKERNELAPI<br>
NTSTATUS<br>
PsLookupProcessByProcessId (<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  IN ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ProcessId,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OUT PEPROCESS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  *Process<br>
);</p>
<p>PEPROCESS eProcess;<br>
ULONG CR0VALUE = 0;<br>
void DisableProtection()<br>
{<br>
__asm<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  mov eax,cr0 <br>
&nbsp;&nbsp;&nbsp;&nbsp;  mov CR0VALUE,eax <br>
&nbsp;&nbsp;&nbsp;&nbsp;  and eax,0xfffeffff <br>
&nbsp;&nbsp;&nbsp;&nbsp;  mov cr0,eax <br>
}<br>
}</p>
<p>void EnableProtection()<br>
{<br>
__asm<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  mov eax,CR0VALUE <br>
&nbsp;&nbsp;&nbsp;&nbsp;  mov cr0,eax <br>
}<br>
}</p>
<p>__declspec(naked) NTSTATUS ProxyPspTerminateThreadByPointer(IN PETHREAD Thread, IN NTSTATUS ExitStatus, IN BOOLEAN DirectTerminate)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  __asm<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  _emit 0x90<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
}</p>
<p><br>
NTSTATUS&nbsp;&nbsp;&nbsp;&nbsp;  MyPspTerminateThreadByPointer(IN PETHREAD Thread, IN NTSTATUS ExitStatus, IN BOOLEAN DirectTerminate)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  NTSTATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ntStatus;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  tmpVal;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  tmpVal = (ULONG) ( (char *)Thread + 0x22c);&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  tmpVal = *(ULONG *)tmpVal;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if(tmpVal==(ULONG)eProcess)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //return STATUS_ACCESS_DENIED;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return STATUS_SUCCESS;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  ntStatus = ProxyPspTerminateThreadByPointer(Thread, ExitStatus, DirectTerminate);&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  return ntStatus;<br>
}</p>
<p><br>
void Unload( PDRIVER_OBJECT DriverObject )<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  UNICODE_STRING usDosDeviceName;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  KdPrint(( &quot;AntiClose_Unload called!\r\n&quot; ));<br>
&nbsp;&nbsp;&nbsp;&nbsp;  RtlInitUnicodeString( &amp;usDosDeviceName, L&quot;<a href="file://  DosDevices  AntiClose">\\DosDevices\\AntiClose</a>&quot; );<br>
&nbsp;&nbsp;&nbsp;&nbsp;  IoDeleteSymbolicLink( &amp;usDosDeviceName );<br>
&nbsp;&nbsp;&nbsp;&nbsp;  IoDeleteDevice( DriverObject-&gt;DeviceObject );<br>
}<br>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject , IN PUNICODE_STRING RegistryPath)<br>
{<br>
NTSTATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ntStatus;<br>
KIRQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  oldIrql;&nbsp;&nbsp;<br>
ULONG&nbsp;&nbsp;&nbsp;&nbsp;  *PspTerminateThreadByPointer = (ULONG *)0x804a9b86;<br>
BYTE g_cHookCode[5] = { 0xe9, 0, 0, 0, 0 };<br>
BYTE g_cOrigCode[12] = { 0 };<br>
BYTE jmp_orig_code[12] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };<br>
_asm int 3;<br>
DriverObject -&gt; DriverUnload = Unload;&nbsp;&nbsp;&nbsp;&nbsp;  //<br>
ntStatus = PsLookupProcessByProcessId(280, &amp;eProcess);<br>
if(NT_SUCCESS(ntStatus))<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  ObDereferenceObject(eProcess);<br>
}</p>
<p>RtlCopyMemory(g_cOrigCode, (BYTE*)PspTerminateThreadByPointer, 10);<br>
*( (ULONG*)(g_cHookCode+1) ) = (ULONG)MyPspTerminateThreadByPointer - (ULONG)PspTerminateThreadByPointer - 5;<br>
DisableProtection();<br>
oldIrql = KeRaiseIrqlToDpcLevel();<br>
RtlCopyMemory((BYTE*)PspTerminateThreadByPointer, g_cHookCode, 5);<br>
*( (ULONG*)(jmp_orig_code+1) ) = (ULONG)((BYTE*)PspTerminateThreadByPointer + 11);<br>
RtlCopyMemory((BYTE*)ProxyPspTerminateThreadByPointer, g_cOrigCode, 11);<br>
RtlCopyMemory((BYTE*)ProxyPspTerminateThreadByPointer+11, jmp_orig_code, 11);<br>
KeLowerIrql(oldIrql);<br>
EnableProtection();&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return STATUS_SUCCESS;<br>
}</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/8c7b8133ee199cfb1a4cff19.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-25  11:50</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/8c7b8133ee199cfb1a4cff19.html</guid>
</item>

<item>
        <title><![CDATA[枚举隐藏服务]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/7e3e3131e01541ab5edf0ef1.html]]></link>
        <description><![CDATA[
		
		<p>不写吧,总觉得anti事业还没进行到底.写吧,其实也没什么技术含量.还好我没收受人钱财,不然非被劈成2截</p>
<p>还是那句老话,在anti别人前先看别人有没有先anti你.如果你先被anti了则恢复hook,在这里也建议大家做个hook monitor.或者hook保护.关于hive操作的文章本来就少,我还就没怎么琢磨过服务的事丢个地址自己看啦<a href="http://www.xfocus.net/articles/200505/802.html">http://www.xfocus.net/articles/200505/802.html</a></p>
<p>hive的操作函数在ntreg.h里定义,自己找吧!我给个简单的例子.</p>
<p>void Cxxx::ShowHideService(struct hive *hdesc, char *path, int vofs, int type)<br>
{<br>
m_list.DeleteAllItems();<br>
struct nk_key *key;<br>
int nkofs;<br>
struct ex_data ex;<br>
int count = 0, countri = 0;<br>
//wHAT I ADD<br>
void *data;<br>
int nkofs_cat;<br>
int serviceno;<br>
serviceno = 1;<br>
CString HiddenName,StartHiddenType,HiddenServiceDr,HiddenTol;<br>
nkofs = ChkReg.trav_path(hdesc, vofs, path, 0);<br>
if(!nkofs) <br>
{<br>
&nbsp;&nbsp;  char szTrace[128];<br>
&nbsp;&nbsp;  sprintf(szTrace, &quot;nk_ls: Key &lt;%s&gt; not found\n&quot;,path);<br>
&nbsp;&nbsp;  TRACE0(szTrace);<br>
&nbsp;&nbsp;  abort();<br>
&nbsp;&nbsp;  return;<br>
}<br>
nkofs += 4;<br>
key = (struct nk_key *)(hdesc-&gt;buffer + nkofs);<br>
if (key-&gt;id != 0x6b6e) <br>
{<br>
&nbsp;&nbsp;  TRACE0(&quot;Error: Not a 'nk' node!\n&quot;);<br>
&nbsp;&nbsp;  ChkReg.debugit(hdesc-&gt;buffer,hdesc-&gt;size);<br>
}<br>
int nHideServiceTotal = 0;<br>
if (key-&gt;no_subkeys) <br>
{<br>
<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  while ((ChkReg.ex_next_n(hdesc, nkofs, &amp;count, &amp;countri, &amp;ex) &gt; 0)) {<br>
&nbsp;&nbsp;&nbsp;  if(!CompareHive(ex.name) )<br>
&nbsp;&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;&nbsp;  nohideservice = 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if(!(serviceno - 1))<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  nkofs_cat = ChkReg.trav_path(hdesc, vofs, ex.name, 0);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenName.Format(&quot;%s&quot;,ex.name);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.InsertItem(nHideServiceTotal, &quot;&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,0,HiddenName);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  char szServicePath[MAX_PATH];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  memset(szServicePath, 0, MAX_PATH);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ShowPathImage(hdesc, nkofs_cat + 4, &quot;ImagePath&quot;, szServicePath);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal, 4, szServicePath);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  data = (void *)ChkReg.get_val_data(hdesc, nkofs_cat + 4, &quot;Start&quot;, 0 );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if( data != NULL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  switch(*(unsigned short *)data)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  case 0:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartHiddenType = &quot;引导启动&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,3,StartHiddenType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  case 1:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartHiddenType = &quot;系统启动&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,3,StartHiddenType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  case 2:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartHiddenType = &quot;自动启动&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,3,StartHiddenType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  case 3:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartHiddenType = &quot;手动启动&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,3,StartHiddenType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  case 4:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartHiddenType =&quot;没有启动&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,3,StartHiddenType);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  default:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  StartHiddenType = &quot;未知类型&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,3,StartHiddenType);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if( *(unsigned short *)data != 4 )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ChkReg.put_dword(hdesc, nkofs_cat + 4, &quot;Start&quot;, 4);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ischange = 1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  data = (void *)ChkReg.get_val_data(hdesc, nkofs_cat + 4, &quot;Type&quot;, 0 );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if( data != NULL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*(unsigned short *)data &amp; 1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenServiceDr = &quot;木马! 内核驱动文件&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,5,HiddenServiceDr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*(unsigned short *)data &amp; 2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenServiceDr = &quot;木马! 文件系统驱动&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,5,HiddenServiceDr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*(unsigned short *)data &amp; 8)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenServiceDr = &quot;木马!注册表配置驱动文件&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,5,HiddenServiceDr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*(unsigned short *)data &amp; 16)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenServiceDr = &quot;木马! 进程文件&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,5,HiddenServiceDr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*(unsigned short *)data &amp; 32)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenServiceDr = &quot;木马! 共享类型的进程&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,5,HiddenServiceDr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*(unsigned short *)data &amp; 256)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  HiddenServiceDr = &quot;木马!动态类型的进程&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_list.SetItemText(nHideServiceTotal,5,HiddenServiceDr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  nHideServiceTotal ++;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  FREE(ex.name);<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;<br>
}<br>
if(0 == nHideServiceTotal)<br>
{<br>
&nbsp;&nbsp;  HiddenTol.Format(&quot;没有检测到隐藏服务:)&quot;);<br>
&nbsp;&nbsp;  this-&gt;OnView();<br>
}<br>
else<br>
{<br>
&nbsp;&nbsp;  HiddenTol.Format(&quot;共发现%d个隐藏服务&quot;, nHideServiceTotal);<br>
}<br>
MessageBox(HiddenTol, &quot;提示&quot;, MB_OK);<br>
}</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/7e3e3131e01541ab5edf0ef1.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-24  14:15</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/7e3e3131e01541ab5edf0ef1.html</guid>
</item>

<item>
        <title><![CDATA[dll卸载和强制卸载]]></title>
        <link><![CDATA[http://hi.baidu.com/antirootkit/blog/item/8742a82da0d55c37359bf77b.html]]></link>
        <description><![CDATA[
		
		<p>隐藏进程的路最终还是回到了injection上,那么我写的这个主题就派上用场了.亮剑</p>
<p>//少女式卸载,1参数为PID,2参数为dll名称</p>
<p>int UnInjectDll(ULONG dwProcessId,CString DllName)<br>
{<br>
<br>
const DWORD dwThreadSize = 4096;<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Quanxian-&gt;EnablePriv();&nbsp;&nbsp;  //提升权限的,这个函数你自己写吧,贴出来占地方<br>
//以下为创建远程线程做准备<br>
// 取得LoadLibraryA函数的地址，我们将以它作为远程线程函数启动<br>
HMODULE hModule=::GetModuleHandle(&quot;kernel32.dll&quot;);<br>
LPTHREAD_START_ROUTINE pfnStartRoutine = (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, &quot;GetModuleHandleA&quot;);<br>
LPTHREAD_START_ROUTINE pfnFreeRoutine = (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, &quot;FreeLibrary&quot;);<br>
char DllPath[MAX_PATH];<br>
memset(DllPath, 0, MAX_PATH);<br>
int nSel = m_modulelist.GetSelectionMark();<br>
m_modulelist.GetItemText(nSel, 0, DllPath, MAX_PATH);<br>
// 在目标进程中申请空间，存放字符串szDllName，作为远程线程的参数<br>
int cbSize = (strlen(DllPath) + 1);<br>
//以上为创建远程线程做准备<br>
<br>
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);<br>
if(NULL != hProcess)<br>
{&nbsp;&nbsp;<br>
&nbsp;&nbsp;  DWORD dwHandle;<br>
&nbsp;&nbsp;  LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, NULL, cbSize, MEM_COMMIT, PAGE_READWRITE);<br>
&nbsp;&nbsp;  ::WriteProcessMemory(hProcess, lpRemoteDllName, DllPath, cbSize, NULL);&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;  // 启动远程线程，并立刻运行<br>
&nbsp;&nbsp;  HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0, pfnStartRoutine, lpRemoteDllName, 0, NULL);<br>
&nbsp;&nbsp;  if(hRemoteThread == NULL)<br>
&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;  CloseHandle(hProcess);<br>
&nbsp;&nbsp;&nbsp;  return FALSE;<br>
&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  // 等待目标线程运行结束，即LoadLibraryA函数返回<br>
&nbsp;&nbsp;  ::WaitForSingleObject(hRemoteThread, INFINITE);&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;  GetExitCodeThread( hRemoteThread, &amp;dwHandle );<br>
&nbsp;&nbsp;  // 释放目标进程中申请的空间<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  VirtualFreeEx( hProcess, lpRemoteDllName, cbSize, MEM_RELEASE|MEM_DECOMMIT);<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  ::CloseHandle(hRemoteThread);<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;  hRemoteThread = CreateRemoteThread( hProcess, NULL, 0, <br>
&nbsp;&nbsp;&nbsp;  (LPTHREAD_START_ROUTINE)pfnFreeRoutine, (LPVOID)dwHandle, 0, &amp;dwProcessId );<br>
&nbsp;&nbsp;  // 等待FreeLibrary卸载完毕<br>
&nbsp;&nbsp;  WaitForSingleObject( hRemoteThread, INFINITE );<br>
&nbsp;&nbsp;  CloseHandle( hRemoteThread );<br>
&nbsp;&nbsp;  CloseHandle(hProcess);<br>
&nbsp;&nbsp;  m_modulelist.DeleteItem(nSel);<br>
}<br>
&nbsp;&nbsp;&nbsp;&nbsp;  return 0;<br>
<br>
}</p>
<p>//少妇式卸载</p>
<p>typedef DWORD (_stdcall *XXXNtUnmapViewOfSection)( HANDLE hProcess, PVOID Address);</p>
<p>void UnloadNtdll()<br>
{<br>
PVOID&nbsp;&nbsp;  NtdllAddress;<br>
HANDLE&nbsp;&nbsp;  hProcess;<br>
XXXNtUnmapViewOfSection NtUnmapViewOfSection;<br>
HWND&nbsp;&nbsp;  hWindow;<br>
BOOL&nbsp;&nbsp;  bRet = TRUE;<br>
<br>
hWindow = FindWindow( NULL, &quot;你要找的名称&quot;);<br>
<br>
hProcess = OpenProcess( PROCESS_VM_OPERATION, FALSE, PID号);</p>
<p>NtUnmapViewOfSection = (XXXNtUnmapViewOfSection)GetProcAddress( GetModuleHandle(&quot;你要卸载的dll文件&quot;), &quot;NtUnmapViewOfSection&quot; );</p>
<p>NtdllAddress = (PVOID)NtUnmapViewOfSection;</p>
<p>NtUnmapViewOfSection( hProcess, NtdllAddress);</p>
<p>CloseHandle( hProcess );</p>
<p>PostMessage( hWindow, WM_MOUSEMOVE, 0 , 0);</p>
<p>}</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/antirootkit/blog/category/%BC%BC%CA%F5%C0%E0">技术类</a>&nbsp;<a href="http://hi.baidu.com/antirootkit/blog/item/8742a82da0d55c37359bf77b.html#comment">查看评论</a>]]></description>
        <pubDate>2007-10-24  10:33</pubDate>
        <category><![CDATA[技术类]]></category>
        <author><![CDATA[antirootkit]]></author>
		<guid>http://hi.baidu.com/antirootkit/blog/item/8742a82da0d55c37359bf77b.html</guid>
</item>


</channel>
</rss>
