<?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 &#187; LWF</title>
	<atom:link href="http://www.softrce.net/archives/tag/lwf/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softrce.net</link>
	<description>Software Reverse Code Engineering</description>
	<lastBuildDate>Tue, 13 Sep 2011 06:58:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<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则是在IopInitializeSystemDrivers的时候加载的，而各层的DriverEntry的顺序并一定按栈自底向上走(比如TCPIP调用NdisRegisterProtocolDriver，比Miniport的注册早)，但是各自初始化完了，NDIS会接管开始调整栈结构，依次调用Miniport的MiniportInitializeEx，LightWeight Filter的FilterAttach，到最后的Protocol的ProtocolBindAdapterEx。]]></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原型如下：<br />
     BOOLEAN ndisFindFilterPosition(<br />
         IN PNDIS_MINIPORT_BLOCK NdisMiniBlock,<br />
         IN PUNICODE_STRING LowerFilterName,<br />
         IN PUNICODE_STRING UniqueName,<br />
         IN UCHAR FilterFlag,<br />
         OUT PUNICODE_STRING *RetName,        <br />
         OUT PNDIS_FILTER_BLOCK *LowerFilter,<br />
         OUT PNDIS_FILTER_BLOCK *HigherFilter<br />
         );<br />
-<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>-<br />
    NDIS_STATUS<br />
    NetmonFilterAttach(<br />
        IN NDIS_HANDLE NdisFilterHandle,<br />
        IN NDIS_HANDLE FilterDriverContext,<br />
        IN PNDIS_FILTER_ATTACH_PARAMETERS AttachParameters<br />
        )<br />
    /*++</p>
<p>    Routine Description:</p>
<p>    Arguments:</p>
<p>    Return Value:</p>
<p>    &#8211;*/</p>
<p>    {<br />
        PMS_FILTER pFilter = NULL;<br />
        NDIS_STATUS Status = NDIS_STATUS_FAILURE;<br />
        NDIS_FILTER_ATTRIBUTES FilterAttributes;<br />
        WCHAR FilterLevel = L&#8217;0&#8242;;</p>
<p>        KdDebugIn(2);</p>
<p>        do<br />
        {<br />
            if (AttachParameters-&gt;FilterModuleGuidName-&gt;Length)<br />
            {<br />
                FilterLevel = AttachParameters-&gt;FilterModuleGuidName-&gt;Buffer[\<br />
                    ((AttachParameters-&gt;FilterModuleGuidName-&gt;Length - 1) &gt;&gt; 1)];<br />
            }</p>
<p>            if (FilterDriverContext != (NDIS_HANDLE)g_FilterDriverObject)<br />
            {<br />
                Status = NDIS_STATUS_INVALID_PARAMETER;<br />
                break;<br />
            }</p>
<p>            if (!g_AttachUpperLayers &amp;&amp; FilterLevel != L&#8217;0&#8242;)<br />
            {<br />
                if (g_NmDebug)<br />
                {<br />
                    DbgPrintEx(<br />
                        DPFLTR_IHVNETWORK_ID,<br />
                        0,<br />
                        “Discarding:%ws”,<br />
                        AttachParameters-&gt;FilterModuleGuidName-&gt;Buffer<br />
                        );<br />
                }</p>
<p>                Status = NDIS_STATUS_INVALID_PARAMETER;<br />
                break;<br />
            }</p>
<p>            if (AttachParameters-&gt;MiniportMediaType == NdisMediumWan)<br />
            {<br />
                if ((AttachParameters-&gt;BaseMiniportName-&gt;MaximumLength != 0&#215;24) ||<br />
                    (RtlCompareMemory(<br />
                    L”\\DEVICE\\NDISWANBH”,<br />
                    AttachParameters-&gt;BaseMiniportName-&gt;Buffer,<br />
                    0&#215;24) != 0&#215;24))<br />
                {<br />
                    break;<br />
                }<br />
            }<br />
            else<br />
            {<br />
                if (AttachParameters-&gt;MiniportMediaType == NdisMediumNative802_11 &amp;&amp;<br />
                    (FilterLevel != L&#8217;0&#8242;))<br />
                {<br />
                    Status = NDIS_STATUS_FAILURE;<br />
                    break;<br />
                }<br />
            }</p>
<p>            // Let&#8217;s Create Filter Modules..<br />
            //<br />
            {<br />
                if (NmCreateFilterModule(NdisFilterHandle, AttachParameters, &amp;pFilter)<br />
                    != NDIS_STATUS_SUCCESS)<br />
                {<br />
                    Status = NDIS_STATUS_RESOURCES;<br />
                    break;<br />
                }<br />
                else<br />
                {<br />
                    NdisZeroMemory(&amp;FilterAttributes, sizeof(NDIS_FILTER_ATTRIBUTES));</p>
<p>                    FilterAttributes.Header.Revision = NDIS_FILTER_ATTRIBUTES_REVISION_1;<br />
                    FilterAttributes.Header.Size = sizeof(NDIS_FILTER_ATTRIBUTES);<br />
                    FilterAttributes.Header.Type = NDIS_OBJECT_TYPE_FILTER_ATTRIBUTES;<br />
                    FilterAttributes.Flags = 0; </p>
<p>                    Status = NdisFSetAttributes(<br />
                        NdisFilterHandle,<br />
                        pFilter,<br />
                        &amp;FilterAttributes<br />
                        );<br />
                    if (Status != NDIS_STATUS_SUCCESS)<br />
                    {<br />
                        break;<br />
                    }</p>
<p>                    NmInitializeMinipInfo(AttachParameters-&gt;MiniportMediaType, pFilter);</p>
<p>                    pFilter-&gt;State = FilterPaused;<br />
                    NmInitializeTimerSystem(pFilter);</p>
<p>                    FILTER_ACQUIRE_LOCK(&amp;g_FilterListLock, FALSE);<br />
                    InsertHeadList(&amp;g_FilterModuleList, &amp;pFilter-&gt;FilterModuleLink);<br />
                    FILTER_RELEASE_LOCK(&amp;g_FilterListLock, FALSE);<br />
                }<br />
            }</p>
<p>        } while (FALSE);</p>
<p>        return Status;<br />
    }<br />
&#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的名字可以采用”前缀+[FilterModuleGuidName]“的形式，这样方便以后区分和处理；<br />
    2) 对AttachParameters-&gt;MiniportMediaType是NdisMediumNative802_11的情况，可以在这里处理，为无线设备创建专门的结构体记录；<br />
    3) Create Device的时候，你可以使用NdisRegisterDeviceEx，这样步骤会简单很多，但是以后访问内部成员会很费力；</p>
<p>       如果想自己IoCreateDevice，那就要注意仿造NdisRegisterDeviceEx的实现，注意DeviceExtensionSize的大小。</p>
<p>       在{DriverEntry}里，已经提到几个重点，DeviceExtension Header类似下面：</p>
<p>        /*0&#215;000*/NDIS_OBJECT_HEADER   Header;<br />
       /*0&#215;004*/LIST_ENTRY           FilterModuleLink;<br />
       /*0x00C*/NDIS_HANDLE          FilterHandle;<br />
       /*0&#215;010*/PDEVICE_OBJECT       FilterDeviceObject;<br />
       /*0&#215;014*/PVOID                UserDeviceExtention;</p>
<p>       /*0&#215;018*/PDRIVER_DISPATCH     DispatchTable[IRP_MJ_MAXIMUM_FUNCTION + 1];</p>
<p>       /*0&#215;088*/NDIS_STRING          DeviceName;<br />
       /*0&#215;090*/NDIS_STRING          SymbolicLinkName;<br />
       /*0&#215;098*/NDIS_STRING          GuidName;<br />
 </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">2010年02月24日</a>, Lewis writes: 膜拜</li><li><a href="http://www.softrce.net/archives/256">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"><li>2011年04月8日 -- <a href="http://www.softrce.net/archives/381" title="Microsoft Windows xp AFD.sys Local Kernel DoS Vulnerability">Microsoft Windows xp AFD.sys Local Kernel DoS Vulnerability</a></li><li>2009年01月10日 -- <a href="http://www.softrce.net/archives/21" title="容易被忽略的IDA快捷键">容易被忽略的IDA快捷键</a></li><li>2009年05月15日 -- <a href="http://www.softrce.net/archives/136" title="ActiveX 控件组件的Fuzz和利用">ActiveX 控件组件的Fuzz和利用</a></li><li>2009年05月16日 -- <a href="http://www.softrce.net/archives/140" title="静态分析驱动的一点技巧">静态分析驱动的一点技巧</a></li><li>2010年03月11日 -- <a href="http://www.softrce.net/archives/296" title="Think Different">Think Different</a></li><li>2009年12月27日 -- <a href="http://www.softrce.net/archives/210" title="Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial">Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debugger_Tutorial</a></li><li>2009年06月1日 -- <a href="http://www.softrce.net/archives/192" title="BEIH/F：总线枚举接口劫持/伪造">BEIH/F：总线枚举接口劫持/伪造</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/63" title="Native Application之键盘处理">Native Application之键盘处理</a></li><li>2008年10月19日 -- <a href="http://www.softrce.net/archives/13" title="[POC]基于IO Packet隐藏文件和注册表，过磁盘解析和总线解析">[POC]基于IO Packet隐藏文件和注册表，过磁盘解析和总线解析</a></li><li>2009年05月30日 -- <a href="http://www.softrce.net/archives/189" title="基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/256/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

