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

<channel>
	<title>SoftRCE.net</title>
	<atom:link href="http://www.softrce.net/feed" rel="self" type="application/rss+xml" />
	<link>http://www.softrce.net</link>
	<description>Software Reverse Code Engineering</description>
	<lastBuildDate>Thu, 11 Mar 2010 05:05:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Think Different</title>
		<link>http://www.softrce.net/archives/296</link>
		<comments>http://www.softrce.net/archives/296#comments</comments>
		<pubDate>Thu, 11 Mar 2010 05:01:06 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[华山论剑（Watering）]]></category>
		<category><![CDATA[Think Different]]></category>
		<category><![CDATA[价值观]]></category>
		<category><![CDATA[创新]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=296</guid>
		<description><![CDATA[本来有大堆的话想说，在iPad推出之后，可是想说的太多以至于理不出头绪。
想起乔布斯在1997年重回苹果担任CEO之后，推出了著名的《Think Different》广告，于是想贴上下面这段话：

向那些疯狂... ]]></description>
			<content:encoded><![CDATA[<p>本来有大堆的话想说，在iPad推出之后，可是想说的太多以至于理不出头绪。<br />
想起乔布斯在1997年重回苹果担任CEO之后，推出了著名的《Think Different》广告，于是想贴上下面这段话：</p>
<p><span id="more-296"></span></p>
<blockquote><p>向那些疯狂的家伙们致敬。<br />
那些我行我素的家伙。<br />
那些桀骜不驯的家伙。<br />
那些惹事生非的家伙。<br />
那些方孔中的圆桩。<br />
他们总是异想天开，<br />
既不喜欢循规蹈矩，<br />
也不尊重既成事实。<br />
你尽可以赞美他们，否定他们，引用他们，<br />
质疑他们，颂扬抑或是诋毁他们。<br />
不过惟独不能漠视他们。<br />
因为他们进行着变革。<br />
他们推动着人类的进程。<br />
他们是别人眼里的疯子，<br />
却是我们眼中的天才。<br />
因为，只有疯狂到认为<br />
自己能够改变世界的人，<br />
才能真正做到这一点。 </p>
<p>Here’s to the crazy ones.<br />
The misfits.<br />
The rebels.<br />
The troublemakers.<br />
The round pegs in the square holes.<br />
The ones who see things differently.<br />
They’re not fond of rules.<br />
And they have no respect for the status quo.<br />
You can quote them, disagree with them, glorify or vilify them.<br />
About the only thing you can’t do is ignore them.<br />
Because they change things.<br />
They push the human race forward.<br />
And while some see them as the crazy ones,<br />
We see genius.<br />
Because the people who are crazy enough to think<br />
they can change the world,<br />
Are the ones who do. </p></blockquote>
<p>&#8212;&#8212;&#8212;&#8211;</p>
<p>而那些我能想到的字眼：核心价值观，创新理念，创新技能，用户体验&#8230;由于想说的太多，就变成了也许什么都不用说。<br />
技术是工具，想改变世界，首先改变理念。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/296#comment-139">2010年03月13日</a>, robinh00d writes: 只能学习</li><li><a href="http://www.softrce.net/archives/296#comment-141">2010年03月15日</a>, Lewis writes: 家伙们</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2008年10月19日 -- <a href="http://www.softrce.net/archives/14" title="Vista Bootmgr/Winload使用的大部分选项ID">Vista Bootmgr/Winload使用的大部分选项ID</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/19" title="[转载]在英特尔软件网络博客上看到的">[转载]在英特尔软件网络博客上看到的</a></li><li>2009年05月30日 -- <a href="http://www.softrce.net/archives/189" title="基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/100" title="暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞">暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞</a></li><li>2008年10月9日 -- <a href="http://www.softrce.net/archives/11" title="About the SMM rootkit">About the SMM rootkit</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月16日 -- <a href="http://www.softrce.net/archives/140" title="静态分析驱动的一点技巧">静态分析驱动的一点技巧</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/16" title="绕过主动防御的代码注入方法一点思考">绕过主动防御的代码注入方法一点思考</a></li><li>2009年05月5日 -- <a href="http://www.softrce.net/archives/126" title="[玩笑]某人不是会坐在被告席上吧？">[玩笑]某人不是会坐在被告席上吧？</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/296/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Steve Jobs在斯坦福大学毕业典礼上的演讲</title>
		<link>http://www.softrce.net/archives/288</link>
		<comments>http://www.softrce.net/archives/288#comments</comments>
		<pubDate>Mon, 01 Mar 2010 04:18:17 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[华山论剑（Watering）]]></category>
		<category><![CDATA[Stay foolish]]></category>
		<category><![CDATA[Stay hungry]]></category>
		<category><![CDATA[Steve Jobs]]></category>
		<category><![CDATA[演讲]]></category>

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

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

    Routine Description:

    Arguments:

    Return Value:

    --*/

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

        KdDebugIn(2);

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

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

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

                Status = NDIS_STATUS_INVALID_PARAMETER;
                break;
            }

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

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

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

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

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

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

        } while (FALSE);

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

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

       /*0x088*/NDIS_STRING          DeviceName;
       /*0x090*/NDIS_STRING          SymbolicLinkName;
       /*0x098*/NDIS_STRING          GuidName;</pre>
<p> </p>
<p>       (1) Header.Type 必须是 9，而且DispatchTable必须在DeviceExtension + 0&#215;18处，否则派发例程将得不到执行；<br />
       (2) pFilter必须包含以上除0&#215;14外的内容，UserExtention的就具体问题具体设计了；<br />
       (3) 什么时候DestroyFilterModule，这个可以使用引用数。</p>
<p>   当然，由于本驱动的特殊性，只是个Monitor而不是Modifier，所以比如NetBufferLists、NetBuffers pool的分配管理，读取Configuration等等，都没有涉及到，可以参考WDK的内容：Attaching a Filter Module。</p>
<p>下篇继续补完其他的FilterXXX入口函数，以及接受发送数据包时候的处理。</p>
<p>&#8212;&#8212;&#8212;</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/256#comment-120">2010年02月24日</a>, Lewis writes: 膜拜</li><li><a href="http://www.softrce.net/archives/256#comment-124">2010年02月27日</a>, Luke writes: 可以做一些Modifier这方面的讨论与研究，比如IpDir，或者虚拟网关。</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/189" rel="bookmark" title="Permanent Link: 基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2009年05月16日 -- <a href="http://www.softrce.net/archives/140" title="静态分析驱动的一点技巧">静态分析驱动的一点技巧</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2009年02月1日 -- <a href="http://www.softrce.net/archives/23" title="SoftRCE的Mail Server开通了！">SoftRCE的Mail Server开通了！</a></li><li>2009年05月30日 -- <a href="http://www.softrce.net/archives/189" title="基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/16" title="绕过主动防御的代码注入方法一点思考">绕过主动防御的代码注入方法一点思考</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/19" title="[转载]在英特尔软件网络博客上看到的">[转载]在英特尔软件网络博客上看到的</a></li><li>2008年10月9日 -- <a href="http://www.softrce.net/archives/11" title="About the SMM rootkit">About the SMM rootkit</a></li><li>2008年09月30日 -- <a href="http://www.softrce.net/archives/10" title="[国庆礼]Exploiting Windows Device Drivers译文版">[国庆礼]Exploiting Windows Device Drivers译文版</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li><li>2008年10月15日 -- <a href="http://www.softrce.net/archives/12" title="About Handling Nmi">About Handling Nmi</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/256/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to adjust the Ace of device object</title>
		<link>http://www.softrce.net/archives/217</link>
		<comments>http://www.softrce.net/archives/217#comments</comments>
		<pubDate>Wed, 10 Feb 2010 08:28:03 +0000</pubDate>
		<dc:creator>gz1x</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[ACE]]></category>
		<category><![CDATA[GroupSid]]></category>

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

Routine Description:

Arguments:

Return Value:

--*/

{
    USHORT i = 0;
    PACCESS_ALLOWED_ACE Ace = NULL;

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

            ++ i;   
        }

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

    return NULL;
}

BOOLEAN
NmCheckDaclForGroupSid(
    IN PACL Dacl
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

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

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

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

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

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

                        result = (cSidOffset == retLong);

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

                 ++ i;

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

    return result;
}

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

Routine Description:

Arguments:

Return Value:

--*/

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

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

                ++ i;
            }
         }

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

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

    return TRUE;
}

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

Routine Description:

Arguments:

Return Value:

--*/

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

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

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

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

                    AddAceToAcl(tmpDacl, (PACCESS_ALLOWED_ACE)pdACE);

                    ++ i;

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

             AddAceToAcl(tmpDacl, g_GroupAce);

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

                 AddAceToAcl(tmpDacl, (PACCESS_ALLOWED_ACE)paACE);

                 ++ i;
             }

             *NewDacl= tmpDacl;
        }
    }   

    return result;
}

NDIS_STATUS
NmAddGroupAccessAce(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

Arguments:

Return Value:

--*/

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

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

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

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

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

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

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

        if (Handle)
        {
            ZwClose(Handle);
        }

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

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

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

//...省略...

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

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

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

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

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

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

//...省略...</pre>
<p>===============</p>
<p>PS: 排版很麻烦，我改了半天。下篇把这个工程的真正精华部分放上来大家探讨。</p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/10" rel="bookmark" title="Permanent Link: [国庆礼]Exploiting Windows Device Drivers译文版">[国庆礼]Exploiting Windows Device Drivers译文版</a></li><li><a href="http://www.softrce.net/archives/9" rel="bookmark" title="Permanent Link: 文章预告：Exploiting Windows Device Drivers">文章预告：Exploiting Windows Device Drivers</a></li><li><a href="http://www.softrce.net/archives/14" rel="bookmark" title="Permanent Link: Vista Bootmgr/Winload使用的大部分选项ID">Vista Bootmgr/Winload使用的大部分选项ID</a></li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2008年09月30日 -- <a href="http://www.softrce.net/archives/10" title="[国庆礼]Exploiting Windows Device Drivers译文版">[国庆礼]Exploiting Windows Device Drivers译文版</a></li><li>2008年10月15日 -- <a href="http://www.softrce.net/archives/12" title="About Handling Nmi">About Handling Nmi</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/19" title="[转载]在英特尔软件网络博客上看到的">[转载]在英特尔软件网络博客上看到的</a></li><li>2009年05月5日 -- <a href="http://www.softrce.net/archives/126" title="[玩笑]某人不是会坐在被告席上吧？">[玩笑]某人不是会坐在被告席上吧？</a></li><li>2009年06月1日 -- <a href="http://www.softrce.net/archives/192" title="BEIH/F：总线枚举接口劫持/伪造">BEIH/F：总线枚举接口劫持/伪造</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/15" title="构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器">构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/18" title="今天又地震～～">今天又地震～～</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2010年03月1日 -- <a href="http://www.softrce.net/archives/288" title="Steve Jobs在斯坦福大学毕业典礼上的演讲">Steve Jobs在斯坦福大学毕业典礼上的演讲</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/217/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MS07-014调试手记</title>
		<link>http://www.softrce.net/archives/213</link>
		<comments>http://www.softrce.net/archives/213#comments</comments>
		<pubDate>Tue, 12 Jan 2010 11:56:42 +0000</pubDate>
		<dc:creator>Cyg07</dc:creator>
				<category><![CDATA[倚天屠龙（Vulnerability）]]></category>

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

		<guid isPermaLink="false">http://www.softrce.net/?p=210</guid>
		<description><![CDATA[高手请无视



IDA 5.5 放出来了，强大的远程调试功能使得手机软件的调试变得更加轻松

为启明星辰的向日姑娘做了个动画

动画中用了自己很烂的英文

希望那位塞浦路斯的朋友能看懂... ]]></description>
			<content:encoded><![CDATA[<p style="text-align: center">高手请无视</p>
<p> </p>
<p>IDA 5.5 放出来了，强大的远程调试功能使得手机软件的调试变得更加轻松</p>
<p>为启明星辰的向日姑娘做了个动画</p>
<p>动画中用了自己很烂的英文</p>
<p>希望那位塞浦路斯的朋友能看懂。</p>
<p>===============================================================================================================================</p>
<p style="text-align: center"><img class="aligncenter" src="http://www.caterqiu.cn/upload/2009/12/061221123234322.jpg" alt="" /></p>
<p>DownLoad：<br />
<a href="http://rapidshare.com/files/326535837/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar.html" target="_blank">http://rapidshare.com/files/326535837/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar.html</a><br />
<a href="http://www.caterqiu.cn/UPLOAD/2009/12/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar">http://www.caterqiu.cn/UPLOAD/2009/12/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.Rar</a></p>
<p><a href="http://www.caterqiu.cn/Article/Symbian_S60_3rd_Reverse_CrAcKiNg_Tutorial_By_CaterQiu.html">http://www.caterqiu.cn/Article/Symbian_S60_3rd_Reverse_CrAcKiNg_Tutorial_By_CaterQiu.html</a><br />
<a href="http://www.caterqiu.cn/Article/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.html">WwW.CaterQiu.Cn/Article/Symbian_S60_3rd_Application_Cracking_With_IDA_Remote_Debuger_Tutorial_By_CaterQiu.html</a></p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/210#comment-92">2009年12月27日</a>, 犇犇犇 writes: 第二个地址好快，700k+</li><li><a href="http://www.softrce.net/archives/210#comment-93">2009年12月28日</a>, ik writes: 你这个swf是用什么工具录的，谢谢</li><li><a href="http://www.softrce.net/archives/210#comment-94">2009年12月28日</a>, breach writes: 同上，请问您这个swf是用什么工具录的，谢谢</li><li><a href="http://www.softrce.net/archives/210#comment-95">2009年12月28日</a>, caterqiu writes: Instant Demo Pro
Download:http://www.hanzify.org/?Go=Show::List&amp;ID=9363</li><li><a href="http://www.softrce.net/archives/210#comment-100">2010年01月30日</a>, gz1x writes: WTF!这方面的文章好像真是蛮少，要赞。</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2010年03月11日 -- <a href="http://www.softrce.net/archives/296" title="Think Different">Think Different</a></li><li>2009年05月30日 -- <a href="http://www.softrce.net/archives/189" title="基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li><li>2009年01月10日 -- <a href="http://www.softrce.net/archives/21" title="容易被忽略的IDA快捷键">容易被忽略的IDA快捷键</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/15" title="构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器">构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/63" title="Native Application之键盘处理">Native Application之键盘处理</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li><li>2010年02月21日 -- <a href="http://www.softrce.net/archives/256" title="Step deeply into NDIS6 LightWeight Filter, part 1">Step deeply into NDIS6 LightWeight Filter, part 1</a></li><li>2009年04月26日 -- <a href="http://www.softrce.net/archives/1" title="SoftRCE再次回归上线">SoftRCE再次回归上线</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/18" title="今天又地震～～">今天又地震～～</a></li><li>2009年06月1日 -- <a href="http://www.softrce.net/archives/192" title="BEIH/F：总线枚举接口劫持/伪造">BEIH/F：总线枚举接口劫持/伪造</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/210/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BEIH/F：总线枚举接口劫持/伪造</title>
		<link>http://www.softrce.net/archives/192</link>
		<comments>http://www.softrce.net/archives/192#comments</comments>
		<pubDate>Mon, 01 Jun 2009 00:31:45 +0000</pubDate>
		<dc:creator>azy</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[BEIH/F]]></category>
		<category><![CDATA[劫持]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=192</guid>
		<description><![CDATA[BEIH/F，穿越，HIPS，主动防御，加载驱... ]]></description>
			<content:encoded><![CDATA[<p>BEIH/F：总线枚举接口劫持/伪造</p>
<p>作者：Azy<br />
日期：2009-5-31</p>
<p>    如果说Audio Mixer劫持（AMH, <a href="http://hi.baidu.com/azy0922/blog/item/fc4fc91e5c2d2617403417a8.html">http://hi.baidu.com/azy0922/blog/item/fc4fc91e5c2d2617403417a8.html</a>）是一种较为被动的穿越，那么BEIH/F则是主动的攻击。通过BEIH/F可以穿越地上HIPS/主动防御产品加载驱动。<span id="more-192"></span><br />
    该方法原理与amh是相同的，最后驱动的加载也是走ExpWorkerThread-&gt;PipDeviceActionWorker-&gt;IopLoadDriver这条路径，从而绕过了HIPS/主防产品的拦截。但触发攻击的方式完全不同。<br />
    OS中存在一些音频驱动，它们的Start=3，并且Enum键下的值均为0。这些驱动是在系统需要的时候动态枚举并安装总线接口，然后加载相应的驱动文件。<br />
    那么如何触发动态枚举安装接口并加载这些驱动呢？答案就是给swenum驱动发送一个特别的I/O Control Code来触发。在InputBuffer中填入欲加载驱动所在接口的GUID值，然后发I/O control Irp到swenum驱动，便可完成一次触发。内核在接到上述Irp后会扫描总线并动态进行接口安装，然后调用IoInvalidateDeviceRelations来触发最后的驱动安装。<br />
    由于这一过程完全是人为可控，并且总线枚举的GUID信息全部存储在注册表中，因此我们可以事先篡改仿造HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\SW键及HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses下面对应的GUID值及其它接口信息。这样一来，便可成功完成一次BEIH/F攻击。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/192#comment-78">2009年06月8日</a>, dge writes: 膜拜</li></ul><hr /><small>Copyright &copy; 2008<br /> This feed is for personal, non-commercial use only. <br /> The use of this feed on other websites breaches copyright. If this content is not in your news reader, it makes the page you are viewing an infringement of the copyright. (Digital Fingerprint:<br /> 8e761b2ea8edc3ca311452b020051837)</small><h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2008年10月15日 -- <a href="http://www.softrce.net/archives/12" title="About Handling Nmi">About Handling Nmi</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2008年10月19日 -- <a href="http://www.softrce.net/archives/14" title="Vista Bootmgr/Winload使用的大部分选项ID">Vista Bootmgr/Winload使用的大部分选项ID</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/19" title="[转载]在英特尔软件网络博客上看到的">[转载]在英特尔软件网络博客上看到的</a></li><li>2010年03月1日 -- <a href="http://www.softrce.net/archives/288" title="Steve Jobs在斯坦福大学毕业典礼上的演讲">Steve Jobs在斯坦福大学毕业典礼上的演讲</a></li><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/100" title="暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞">暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/96" title="暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞">暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年05月30日 -- <a href="http://www.softrce.net/archives/189" title="基于NDIS Filter 抓包">基于NDIS Filter 抓包</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/16" title="绕过主动防御的代码注入方法一点思考">绕过主动防御的代码注入方法一点思考</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/192/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>基于NDIS Filter 抓包</title>
		<link>http://www.softrce.net/archives/189</link>
		<comments>http://www.softrce.net/archives/189#comments</comments>
		<pubDate>Sat, 30 May 2009 15:07:59 +0000</pubDate>
		<dc:creator>Lewis</dc:creator>
				<category><![CDATA[独孤九剑（Kernel）]]></category>
		<category><![CDATA[ndis 6]]></category>
		<category><![CDATA[NDIS Filter]]></category>
		<category><![CDATA[抓包]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=189</guid>
		<description><![CDATA[NDIS Filte... ]]></description>
			<content:encoded><![CDATA[<p>	NDIS 6.0中有了一个新框架，号称比NDIS IMD更牛B。开始关注这个东西是因为卡巴的防火墙取个名字叫Kaspersky Anti-Virus NDIS Filter ，又听说WDK中才有新框架，但是卡巴老早就在用了，就觉得卡巴真牛。（后来看Filter 的时候，自己的Filter驱动既不能在编译到XP平台的，编译VISTA的安装上去也没用，怀疑卡巴就是一个IMD的驱动，取了个名字NDIS Filter 而已，有空F5下。）<span id="more-189"></span><br />
	说正题，微软建议使用NDIS Filter替代NDIS IMD。Filter Driver比IMD驱动更容易实现，Filter驱动被插入在Miniport驱动和Protocol Driver之间。Filter Driver会 attach到Miniport Driver上，对于Protocol Driver来说，Filter Driver是透明的。Filter Driver与任何设备对象无关。Filter Driver可以动态的安装和卸载。在IMD驱动的里面，你需要注册一个Miniport和Protocol两层驱动。（所以以前的IMD有两个相关联的INF文件。）Filter驱动就没那么麻烦，直接一步搞定。我也不会怎么写理论的文章直接看图吧！</p>
<p>如下图所示：<br />
<img src="http://www.softrce.net/wp-content/uploads/2009/05/2222.jpg" alt="2222" title="2222" width="270" height="473" class="alignnone size-full wp-image-203" /><br />
Filter Driver 框架介绍<br />
	WDK中\src\network\ndis\filter中Filter的主要框架，在MSDN文档里面有对这个框架的详细解释，这里我们只简单说几个函数。</p>
<p>	DriverEntry<br />
	// NDIS调用这个函数为一些数据结构分配内存和作初始化工作<br />
	// 主要的结构体有:<br />
	//NDIS_FILTER_DRIVER_CHARACTERISTICS	指定一些Filter驱动的特性，并把这些参数传给NDIS。<br />
	// 主要的函数：<br />
	//	NdisFRegisterFilterDriver 把Filter驱动注册给NDIS</p>
<p>	FilterAttach<br />
	// NDIS调用这个函数为一些数据结构分配内存和作初始化工作<br />
	// 主要的结构体有:<br />
	//	NDIS_FILTER_ATTACH_PARAMETERS	初始化参数<br />
	//	NDIS_FILTER_ATTRIBUTES			Filter模块的属性</p>
<p>	FilterRegisterDevice<br />
	// 填充分派函数，初始化设备属性。并注册。<br />
	// 主要的结构体有:<br />
	//	NDIS_FILTER_ATTACH_PARAMETERS	初始化参数<br />
	//	NDIS_FILTER_ATTRIBUTES			Filter模块的属性</p>
<p>	FilterSendNetBufferLists<br />
	// 用这个函数去过滤一个NET_BUFFER_LIST的发送<br />
	// 主要的结构体有:<br />
	//	NET_BUFFER_LIST		NET_BUFFER的链表</p>
<p>	FilterReceiveNetBufferLists<br />
	// 用这个函数去过滤一个NET_BUFFER_LIST的接收<br />
	// 主要的结构体有:<br />
	//	NET_BUFFER_LIST		NET_BUFFER的链表</p>
<p>	如果要读取数据包，那么有两个结构体就相当重要了。它们是NET_BUFFER_LIST和 NET_BUFFER。定义如下：<br />
<code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p189code1'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1891"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p189code1"><pre class="c" style="font-family:monospace;">	<span style="color: #993333;">typedef</span>	<span style="color: #993333;">struct</span>	_NET_BUFFER_LIST<span style="color: #009900;">&#123;</span>
		NET_BUFFER_LIST_HEADER			NetBufferListHeader<span style="color: #339933;">;</span>
		PNET_BUFFER_LIST_CONTEXT		Context<span style="color: #339933;">;</span>
		PNET_BUFFER_LIST				ParentNetBufferList<span style="color: #339933;">;</span>
		NDIS_HANDLE						NdisPoolHandle<span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID		NdisReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID		ProtocolReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID		MiniportReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		PVOID							Scratch<span style="color: #339933;">;</span>
		NDIS_HANDLE						SourceHandle<span style="color: #339933;">;</span>
		ULONG							NblFlags<span style="color: #339933;">;</span>
		LONG							ChildRefCount<span style="color: #339933;">;</span>
		ULONG							Flags<span style="color: #339933;">;</span>
		NDIS_STATUS						Status<span style="color: #339933;">;</span>
		PVOID							NetBufferListInfo<span style="color: #009900;">&#91;</span>MaxNetBufferListInfo<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>NET_BUFFER_LIST<span style="color: #339933;">,*</span>PNET_BUFFER_LIST<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #993333;">typedef</span>	<span style="color: #993333;">struct</span>	_NET_BUFFER	<span style="color: #009900;">&#123;</span>
		NET_BUFFER_HEADER	NetBufferHeader<span style="color: #339933;">;</span>
		USHORT		ChecksumBias<span style="color: #339933;">;</span>
		USHORT		Reserved<span style="color: #339933;">;</span>
		NDIS_HANDLE	NdisPoolHandle<span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID	NdisReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID	ProtocolReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		DECLSPEC_ALIGN<span style="color: #009900;">&#40;</span>MEMORY_ALLOCATION_ALIGNMENT<span style="color: #009900;">&#41;</span>PVOID MiniportReserved<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		NDIS_PHYSICAL_ADDRESS	DataPhysicalAddress<span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">// was NdisReserved1;</span>
	<span style="color: #009900;">&#125;</span> NET_BUFFER<span style="color: #339933;">,</span>	<span style="color: #339933;">*</span>PNET_BUFFER<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p></code><br />
另外，还有一些宏定义。<br />
NET_BUFFER_LIST_FIRST_NB			从NET_BUFFER_LIST结构中获得第一个NDIS_BUFFER<br />
NET_BUFFER_DATA_OFFSET			从NDIS_BUFFER中获得DATA的偏移<br />
NET_BUFFER_FIRST_MDL				从NDIS_BUFFER中获得第一个MDL<br />
NET_BUFFER_DATA_LENGTH			取得DATA的长度<br />
更具体的自己去看MSDN了。</p>
<p>我根据MSDN和GOOGLE的指点大概写了一段代码了读取数据包。读出数据包的地址和长度。<br />
<code></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p189code2'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1892"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="code" id="p189code2"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span>  ReadNetBuffer<span style="color: #009900;">&#40;</span> PNET_BUFFER_LIST NetBufferLists <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	PUCHAR				data<span style="color: #339933;">,</span>info<span style="color: #339933;">;</span>
	ULONG				len<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>offset<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
	PNET_BUFFER_LIST	CurrNbl<span style="color: #339933;">;</span>
	PNET_BUFFER			Currbuff<span style="color: #339933;">;</span>
	PMDL				mdl<span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span>					DataLen<span style="color: #339933;">;</span>
&nbsp;
	CurrNbl <span style="color: #339933;">=</span> NetBufferLists<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>CurrNbl<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		Currbuff <span style="color: #339933;">=</span> NET_BUFFER_LIST_FIRST_NB<span style="color: #009900;">&#40;</span>CurrNbl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			offset <span style="color: #339933;">=</span>	NET_BUFFER_DATA_OFFSET<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			mdl <span style="color: #339933;">=</span>		NET_BUFFER_FIRST_MDL<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			DataLen	<span style="color: #339933;">=</span>	NET_BUFFER_DATA_LENGTH<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> mdl <span style="color: #339933;">&amp;&amp;</span> DataLen <span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				data <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>UCHAR<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>MmGetSystemAddressForMdlSafe<span style="color: #009900;">&#40;</span> mdl<span style="color: #339933;">,</span>NormalPagePriority <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#123;</span>
					info <span style="color: #339933;">=</span> data <span style="color: #339933;">+</span> offset<span style="color: #339933;">;</span>
					KdPrint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot; PacketData : %p , PacketSize : %d &quot;</span><span style="color: #339933;">,</span>info<span style="color: #339933;">,</span>DataLen<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #009900;">&#125;</span>
			Currbuff <span style="color: #339933;">=</span> NET_BUFFER_NEXT_NB<span style="color: #009900;">&#40;</span>Currbuff<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		CurrNbl <span style="color: #339933;">=</span> NET_BUFFER_LIST_NEXT_NBL<span style="color: #009900;">&#40;</span>CurrNbl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p></code><br />
	小弟水平很菜，写出来的文章也很戳，欢迎拍砖！热爱丢脸！学习&#8230; &#8230;  再贴个图，凑篇幅<br />
<img src="http://www.softrce.net/wp-content/uploads/2009/05/2-300x131.jpg" alt="2" title="2" width="600" height="262" class="alignnone size-medium wp-image-200" /></p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/189#comment-77">2009年06月8日</a>, dge writes: 学习</li><li><a href="http://www.softrce.net/archives/189#comment-86">2009年10月28日</a>, daisy writes: 谢谢博主，通俗易懂，很适合像我一样的初学者，谢谢啦~</li><li><a href="http://www.softrce.net/archives/189#comment-89">2009年11月17日</a>, archangel writes: 容易是容易，怎么编译安装得，说一下啊。wdk</li><li><a href="http://www.softrce.net/archives/189#comment-97">2010年01月16日</a>, daisy writes: 博主，谢谢你给的小例子，在filter sample里边加入你的代码运行成功后让我长了不少自信。之前一直研究如何通过filter drive修改NET_BUFFER_LIST，对NetBufferList的架构一直难以理解，看你例子的简单读取NetBuffer的数据，比看那一大堆文档明了很多。现在想请教博主一个问题，博士是否了解一些filter driver如何修改NetBuffer的相关技术，msdn里边说只有其创建者才可修改其内容，我试着用NdisAllocateCloneNetBufferList()等函数去复制原NetBufferList，然后修改都不成功。如果博主有了解相关方便的知识，麻烦你可以从百忙中抽出一点时间，给我一些指点或者提示，我的email：hellodaisy@139.com,先谢了~</li><li><a href="http://www.softrce.net/archives/189#comment-101">2010年01月30日</a>, gz1x writes: 我以前有个项目是LWF的，等有时间写篇文章抛抛砖。</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/archives/256" rel="bookmark" title="Permanent Link: Step deeply into NDIS6 LightWeight Filter, part 1">Step deeply into NDIS6 LightWeight Filter, part 1</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>2009年05月1日 -- <a href="http://www.softrce.net/archives/96" title="暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞">暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞</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月15日 -- <a href="http://www.softrce.net/archives/136" title="ActiveX 控件组件的Fuzz和利用">ActiveX 控件组件的Fuzz和利用</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/18" title="今天又地震～～">今天又地震～～</a></li><li>2009年04月26日 -- <a href="http://www.softrce.net/archives/1" title="SoftRCE再次回归上线">SoftRCE再次回归上线</a></li><li>2008年10月22日 -- <a href="http://www.softrce.net/archives/15" title="构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器">构造无人之境: Exploiting Realtek RTL8139单芯片以太网控制器</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/63" title="Native Application之键盘处理">Native Application之键盘处理</a></li><li>2009年02月1日 -- <a href="http://www.softrce.net/archives/23" title="SoftRCE的Mail Server开通了！">SoftRCE的Mail Server开通了！</a></li><li>2009年01月10日 -- <a href="http://www.softrce.net/archives/21" title="容易被忽略的IDA快捷键">容易被忽略的IDA快捷键</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/189/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>静态分析驱动的一点技巧</title>
		<link>http://www.softrce.net/archives/140</link>
		<comments>http://www.softrce.net/archives/140#comments</comments>
		<pubDate>Sat, 16 May 2009 09:12:36 +0000</pubDate>
		<dc:creator>dge</dc:creator>
				<category><![CDATA[乾坤挪移（RCE）]]></category>
		<category><![CDATA[逆向技巧]]></category>

		<guid isPermaLink="false">http://www.softrce.net/?p=140</guid>
		<description><![CDATA[习惯了OD和IDA的组合，也懒的装内核调试器了，好在需要分析驱动的时候特别少，而且只用IDA就可以玩的转。
最近在整驱动的过程中积累了点技巧，把他们记录下来，以慰同菜... ]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">author:dge</p>
<p style="text-align: left;">习惯了OD和IDA的组合，也懒的装内核调试器了，好在需要分析驱动的时候特别少，而且只用IDA就可以玩的转。</p>
<p style="text-align: left;">最近在整驱动的过程中积累了点技巧，把他们记录下来，以慰同菜。</p>
<p><span id="more-140"></span></p>
<p style="text-align: left;">Q:许多软件隐藏了驱动,如何找到它们?<br />
A:其实很简单，隐藏文件肯定是驱动干的，不让驱动的加载，再牛B的隐藏也废了，用SSM拦截驱动的加载是个不错的选择。</p>
<p style="text-align: left;">Q:如何提高驱动代码可读性?<br />
A:驱动中对IRP，DEVICE_OBJECT，DRIVER_OBJECT和IO_STACK_LOCATION的操作很多，所以把这些结构添加进来，然后把对这些结构的操作进行标识。</p>
<p style="text-align: left;">Q:如何完成驱动代码的准确定位?<br />
A:一般的驱动都是用DeviceIoControl给驱动发送IRP_MJ_DEVICE_CONTROL类型的IRP来调用驱动中的代码，在驱动中一般先对<br />
IRP_MJ_DEVICE_CONTROL进行处理，然后再细化到处理相应IOCTL的代码，这个IOCTL又是DeviceIoControl的一个参数，所以通过监视DeviceIoControl就可以完成代码的精确定位。</p>
<p style="text-align: left;">Q:如何来获取这个IOCTL?<br />
A:(1):可以通过调试器对DeviceIoControl下断，不过一般得应付很多反调试，感觉很笨拙。<br />
(2):可以写个监视DeviceIoControl的程序，然后把IOCTL作为日志实时的输出。如果我们想分析软件的某个功能，只要运行软件的某个功能,然后
</p>
<p style="text-align: left;">在日志中找到IOCTL，再在驱动代码中搜索它，就可以完成准确定位了，这个方式感觉比较好，它饶过了反调试。</p>
<p style="text-align: left;">Q:如何实现监视?<br />
A:其实就是改变DeviceIoControl的流程，inline hook就可以。</p>
<p style="text-align: left;">Q:还需要什么?<br />
A:一点兴趣，一些体力。</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/140#comment-74">2009年05月26日</a>, mj0011 writes: 真技巧啊真技巧</li><li><a href="http://www.softrce.net/archives/140#comment-75">2009年06月1日</a>, lammer writes: Q:还需要什么?
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>2010年03月11日 -- <a href="http://www.softrce.net/archives/296" title="Think Different">Think Different</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/100" title="暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞">暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年05月5日 -- <a href="http://www.softrce.net/archives/126" title="[玩笑]某人不是会坐在被告席上吧？">[玩笑]某人不是会坐在被告席上吧？</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>2008年11月16日 -- <a href="http://www.softrce.net/archives/19" title="[转载]在英特尔软件网络博客上看到的">[转载]在英特尔软件网络博客上看到的</a></li><li>2010年01月12日 -- <a href="http://www.softrce.net/archives/213" title="MS07-014调试手记">MS07-014调试手记</a></li><li>2010年02月21日 -- <a href="http://www.softrce.net/archives/256" title="Step deeply into NDIS6 LightWeight Filter, part 1">Step deeply into NDIS6 LightWeight Filter, part 1</a></li><li>2010年02月10日 -- <a href="http://www.softrce.net/archives/217" title="How to adjust the Ace of device object">How to adjust the Ace of device object</a></li><li>2008年11月16日 -- <a href="http://www.softrce.net/archives/18" title="今天又地震～～">今天又地震～～</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/140/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ActiveX 控件组件的Fuzz和利用</title>
		<link>http://www.softrce.net/archives/136</link>
		<comments>http://www.softrce.net/archives/136#comments</comments>
		<pubDate>Thu, 14 May 2009 19:36:28 +0000</pubDate>
		<dc:creator>caterqiu</dc:creator>
				<category><![CDATA[倚天屠龙（Vulnerability）]]></category>
		<category><![CDATA[ActiveX]]></category>
		<category><![CDATA[Fuzz]]></category>
		<category><![CDATA[控件]]></category>
		<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">http://www.softrce.net/archives/136</guid>
		<description><![CDATA[前几天暴风影音的那个0day也跟了下
当然以我技术，那肯定是没有跟出来了
这也注定，俺不适合搞技术
漏洞挖掘时一门严谨的科学，需要的知识经验太多了
最近也有一个朋友加我和我交流溢出... ]]></description>
			<content:encoded><![CDATA[<p>前几天暴风影音的那个0day也跟了下<br />
当然以我技术，那肯定是没有跟出来了<br />
这也注定，俺不适合搞技术</p>
<p>漏洞挖掘时一门严谨的科学，需要的知识经验太多了<br />
最近也有一个朋友加我和我交流溢出程序的编写和利用</p>
<p>再说下Cater 不只是一个传说，请大哥们放过我吧。<br />
<span id="more-136"></span><br />
郑重申明下<br />
1、我已经该行做了水果渠道，工作已经不是搞IT的了<br />
2、我也不是什么黑客，我没法和YingCracker这等牛比人<br />
3、我不否认我在某人心中是个坏人，尽管我还没有伤害到她<br />
4、我只用过Cater，caterqiu，老黄牛这些ID，我只是小打小闹搞了搞技术，我只是一个迷途小子。</p>
<p>丢出最后一篇技术的文章 纪念下，当年学习 ActiveX控件的漏洞Fuzz和漏洞利用学习的往事<br />
希望错恋上 Cater 的朋友不联系搞坏事。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>2009年，我的目标是好好整理思绪和经历好好做事。</p>
<p>送上我的最后一篇有关技术的文档，来告别江湖上的三位大哥 K头、K少、老k</p>
<p>www.caterqiu.cn/UPLOAD/2009/5/ActiveX_And_Fuzz_Tutorial.By.Cater.Qiu.rar<br />
PassWord:WwW.CaterQiu.Cn</p>
<p>From:CaterQiu&#8217;s Blog<br />
Link:http://www.caterqiu.cn/Article/ActiveX_Fuzz_And_Tutorial_By_CaterQiu.html</p>
<p>Blog:WwW.CaterQiu.Cn<br />
E-Mail:Cater.Qiu@Gmail.CoM<br />
Date:May 15 ,2009</p>
<hr /><h2>Comments</h2><ul><li><a href="http://www.softrce.net/archives/136#comment-69">2009年05月15日</a>, robinh00d writes: 支持cater</li><li><a href="http://www.softrce.net/archives/136#comment-70">2009年05月15日</a>, root writes: 人怕出名猪怕壮。
游戏该玩还得玩，换个方法玩就是了。</li><li><a href="http://www.softrce.net/archives/136#comment-71">2009年05月15日</a>, <a href='http://www.caterqiu.cn' rel='external nofollow' class='url'>cater</a> writes: …我出毛毛名哦。
其实写点东西到处发发主要还是想让自己的心得被人分享呗
写的大多是简单的入门教程

哎，我想要月收入一万五，只可惜我不是什么美女YingCracker。</li><li><a href="http://www.softrce.net/archives/136#comment-72">2009年05月15日</a>, robinh00d writes: 以前用过comraider~</li><li><a href="http://www.softrce.net/archives/136#comment-73">2009年05月15日</a>, ayarei writes: @cater, 技术性美男吧，恩</li></ul><hr /><h2>Related posts:</h2><ul><li><a href="http://www.softrce.net/english-version" rel="bookmark" title="Permanent Link: English Version">English Version</a></li><li><a href="http://www.softrce.net/english-version/baofeng-storm-activex-control-onbeforevideodownload-buffer-overflow-vulnerability" rel="bookmark" title="Permanent Link: BaoFeng Storm ActiveX Control &#8216;OnBeforeVideoDownload()&#8217; Buffer Overflow Vulnerability">BaoFeng Storm ActiveX Control &#8216;OnBeforeVideoDownload()&#8217; Buffer Overflow Vulnerability</a></li><li><a href="http://www.softrce.net/archives/100" rel="bookmark" title="Permanent Link: 暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞">暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞</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>2009年05月1日 -- <a href="http://www.softrce.net/archives/100" title="暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞">暴风影音2009(Config.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年05月1日 -- <a href="http://www.softrce.net/archives/96" title="暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞">暴风影音2009(mps.dll)ActiveX远程栈溢出漏洞</a></li><li>2009年04月30日 -- <a href="http://www.softrce.net/archives/83" title="中国游戏中心游戏大厅ActiveX远程栈溢出漏洞">中国游戏中心游戏大厅ActiveX远程栈溢出漏洞</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.softrce.net/archives/136/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
