??xml version="1.0" encoding="utf-8" standalone="yes"?>少妇熟女久久综合网色欲,亚洲国产综合久久天堂 ,伊人久久大香线蕉亚洲五月天http://www.shnenglu.com/elva/archive/2008/05/14/49815.html叶子叶子Wed, 14 May 2008 05:45:00 GMThttp://www.shnenglu.com/elva/archive/2008/05/14/49815.htmlhttp://www.shnenglu.com/elva/comments/49815.htmlhttp://www.shnenglu.com/elva/archive/2008/05/14/49815.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/49815.htmlhttp://www.shnenglu.com/elva/services/trackbacks/49815.html阅读全文

叶子 2008-05-14 13:45 发表评论
]]>
利用钩子技术控制进E创?/title><link>http://www.shnenglu.com/elva/archive/2008/04/08/46491.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Tue, 08 Apr 2008 03:17:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2008/04/08/46491.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/46491.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2008/04/08/46491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/46491.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/46491.html</trackback:ping><description><![CDATA[05q的老文章了,今天才看?一直想做而没有做出来的东?差距?..<br>修正原文一些翻译不恰当的地?br><br>原英文地址:<br><a >http://www.codeproject.com/KB/system/soviet_protector.aspx</a><br><br><br><a href="http://www.shnenglu.com/Files/elva/drivers/soviet_protector_src.zip"><a >Download source files - 10.8 Kb</a> </a><br><a href="http://www.shnenglu.com/Files/elva/drivers/soviet_protector_demo.zip"><a >Download demo project - 12.1 Kb</a> </a><br><br>一?? <p>  最q,我了解到一个叫做Sanctuary的相当有的安全产品。它能够LME序的运?q些E序没有昄在Y件列表中-该表中的E序被允许在一个特定的机器上运行。结果,PC用户得到保护而免于各U插仉谍Y件、蠕虫和Ҏ伊木马的侵袭-q能够q入?她的计算机,它们也没有机会执行,q因此没有机会对该机器造成M损害。当Ӟ我觉得这个特征相当有;q且Q在E作思考以后,我就有了一个自q实现。因此,本文描q如何通过钩住本机API的方式来实现监控一个进E的创徏q在pȝU上对之q行控制?/p> <p>  本文大胆假设Q目标进E是以一U用h?外壳函数QCreateProcess()Q用一pd的本机API调用的手工的q程创徏Q等{?创徏的。尽从理论上,一个进E能够以内核方式启动Q不q从实际来看Q如此的可能性是可以忽略不计的,因此我们不必为此担心。ؓ什么?请逻辑地思考一?Z以内核方式启动一个进E,用户必须装蝲一个驱动程序,该驱动程序反q来首先要暗C某U用h式代码的执行。因此,Z防止未被授权E序的执行,我们可以安全地在pȝU上以用h式限制我们自己控制的q程的创建?/p> <p>  二?定义{略</p> <p>  首先让我们明,之所以这样做的目的是Z在系l上监视和控制q程创徏?/p> <p>  q程创徏是一件相当复杂的事情-它包含相当多的工?如果你不怿我,可以反汇~CreateProcess()Q这样你׃亲眼看到q点)。ؓ了启动一个进E,可以使用下列步骤Q?/p> <p>  1.可执行文件必被以FILE_EXECUTE存取方式打开?/p> <p>  2.可执行映像必被装蝲qRAM?/p> <p>  3.必须建立q程执行对象(EPROCESSQKPROCESS和PEBl构)?/p> <p>  4.必须为新E分配地址I间?/p> <p>  5.必须建立q程的主U程的线E执行对?ETHREADQKTHREAD和TEBstructures)?/p> <p>  6.必须ZU程分配堆栈?/p> <p>  7.必须建立q程的主U程的执行上下文?/p> <p>  8.必须通知Win32子系l有兌新进E的创徏情况?/p> <p>  为确保这些步骤中的Q何一步的成功Q所有其前面的步骤必L成功执行?你不能够在没有一个可执行区句柄的情况下徏立一个可执行q程对象Q没有文件句柄的情况下你无法映射一个可执行区,{等)。因此,如果我们军_退ZQ何这些步骤,所有后面的步骤也会p|Q以至于整个q程创徏会失败。上面所有的步骤都可以通过调用某些本机API函数的方式来实现Q这是可以理解的。因此,Z监视和控制进E创建,我们所有要做的是钩住q些API函数-它们无法旁\掉要创徏一新进E所要执行的代码?/p> <p>  我们应该钩住哪些本机API函数?管NtCreateProcess()g是问题的最昄的答案,但是Q这个答案是错误?有可能不需要调用这个函C可以创徏一个新的进E。例如,CreateProcess()可以在不调用NtCreateProcess()的情况下创徏与进E相关的内核模式l构.因此Q这样以来钩住NtCreateProcess()Ҏ们毫无帮助?/p> <p>  Z监视q程的创建,我们必须钩住NtCreateFile()和NtOpenFile()Q或者NtCreateSection()之中的一?-不经调用q些API是绝Ҏ法运行Q何可执行文g的。如果我们决定监视对NtCreateFile()和NtOpenFile()的调用,那么我们必须区别开q程创徏和常规的文gIO操作。这Q务ƈ不L那么Ҏ。例如,如果一些可执行文g正在被以FILE_ALL_ACCESS存取方式打开Q我们该怎么办?q仅是一个IO操作q是一个进E创建的一部分Q在q点上,是很隑ֈ断的-我们需要了解调用线E下一步要q什么。因此,钩住NtCreateFile()和NtOpenFile()可能不是最好的选择?/p> <p>  钩住NtCreateSection()是更为合理的-如果我们在发生把可执行文件映ؓ映像(SEC_IMAGE 属?的请求发生时拦截对NtCreateSection()的调?l合允许执行面保护的请求;那么Q我们可以确信该q程要被启动。在q一点上Q我们是能够作出军_Q如果我们不惌q程被创建,可以让NtCreateSection()q回STATUS_ACCESS_DENIED。因此,Z完全控制目标机器上的q程创徏Q所有我们要做的是在pȝU上钩住NtCreateSection()?/p> <p>  象来自于ntdll.dll中的M其它代理一PNtCreateSection()用服务烦引加载EAXQEDX指向函数参数Qƈ且把执行权传递到KiDispatchService()内核模式例程(q是通过Windows NT/2000中的INT 0x2E指o或者Windows XP下的SYSENTER指o实现?。在校验完函数参C后,KiDispatchService()把执行权传递到服务的实际实现部?它的地址可用于服务描q表(指向q个表的指针由ntoskrnl.exe作ؓKeServiceDescriptorTable变量所输出Q所以它对于内核模式驱动E序是可用的)中。服务描q表通过下列l构所描述Q?br> </p> <p>  struct SYS_SERVICE_TABLE { </p> <p>  void **ServiceTable; </p> <p>  unsigned long CounterTable; </p> <p>  unsigned long ServiceLimit; </p> <p>  void **ArgumentsTable; </p> <p>  }; <br><br></p> <p>  q个l构中的ServiceTable字段指向一个数l?它拥有所有实现系l服务的函数的地址。因此,Z在系l上钩住Q何本机API函数Q所有我们必d的是把我们的代理函数的地址写入被KeServiceDescriptorTable的ServiceTable字段所指向的数l的Wi个入?i是服务烦??/p> <p>  xQ看h我们已了解了在系l上监视和控制q程创徏的一切。现在让我们开始实际的工作?/p> <strong>三?控制q程创徏<br><br></strong>  我们的解x案由一个内核模式驱动程序和一个用h式应用程序组成。ؓ了开始监视进E创建,我们的应用程序要把服务烦引(相应于NtCreateSection()Q以及交换缓冲区的地址传递到我们的驱动程序。这是由下列代码所完成的:<br><br> <table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1> <tbody> <tr> <td>//打开讑֤<br>device=CreateFile("\\.\PROTECTOR",GENERIC_READ|GENERIC_WRITE, <br>0,0,OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM,0);<br>//得到NtCreateSection的烦引ƈ把它q同输出~冲区的地址传递给讑֤<br>DWORD * addr=(DWORD *)<br>(1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtCreateSection"));<br>ZeroMemory(outputbuff,256);<br>controlbuff[0]=addr[0];<br>controlbuff[1]=(DWORD)&outputbuff[0];<br>DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,&dw,0);</td> </tr> </tbody> </table> <br>  此代码是昄?唯一需要注意的是我们得到服务烦引的方式。所有来自于ntdll.dll的代理都从一行代码MOV EAX,ServiceIndex开?它可以适用于Q何版本和风味的Windows NT。这是一?字节长的指oQ以MOV EAX操作码作W一字节Q服务烦引作为留下的4字节。因此,Z得到相应于一些特别的本机API函数的服务烦引,所有你要做的是从该地址d4个字节,-位于从这个代理开?字节距离的地斏V?br><br>  现在让我们看一下我们的驱动E序做什么,当它收到来自我们的应用程序的IOCTLӞ<br><br> <table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1> <tbody> <tr> <td>NTSTATUS DrvDispatch(IN PDEVICE_OBJECT device,IN PIRP Irp)<br>{<br> UCHAR*buff=0; ULONG a,base;<br> PIO_STACK_LOCATION loc=IoGetCurrentIrpStackLocation(Irp);<br> if(loc->Parameters.DeviceIoControl.IoControlCode==1000)<br> {<br>  buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer;<br>  //钩住服务调度?br>  memmove(&Index,buff,4);<br>  a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable;<br>  base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);<br>  a=(ULONG)&Proxy;<br>  _asm<br>  {<br>   mov eax,base<br>   mov ebx,dword ptr[eax]<br>   mov RealCallee,ebx<br>   mov ebx,a<br>   mov dword ptr[eax],ebx<br>  }<br>  MmUnmapIoSpace(base,4);<br>  memmove(&a,&buff[4],4);<br>  output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);<br> }<br> Irp->IoStatus.Status=0;<br> IoCompleteRequest(Irp,IO_NO_INCREMENT);<br> return 0;<br>}</td> </tr> </tbody> </table> <br>  正如你所见,q里没有什么特别的-我们只是通过MmMapIoSpace()来把交换~冲区映到内核中,另外把我们的代理函数的地址写到服务?当然Q我们这是在把实际的服务执行的地址保存到全局变量RealCallee以后q样做的)。ؓ了改写服务表的适当入口Q我们通过MmMapIoSpace()来映目标地址。ؓ什么我们要q样做?不管怎么_我们已经可以存取服务表了Q不是吗Q问题是Q服务表可能ȝ在一D只d存中。因此,我们必须查一下是否我们有对目标空间写的权限,而如果我们没有这个权限,那么在改写服务表之前Q我们必L变页面保护。你不认样以来工作太多了吗?因此Q我们仅用MmMapIoSpace()来映我们的目标地址Q这样以来,我们׃必担心Q何的面保护问题?从现在开始,我们假定已有到目标页面写的权限了。现在让我们看一下我们的代理函数:<br><br> <table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1> <tbody> <tr> <td>//q个函数用来定是否我们应该允许NtCreateSection()调用成功<br>ULONG __stdcall check(PULONG arg)<br>{<br> HANDLE hand=0;PFILE_OBJECT file=0;<br> POBJECT_HANDLE_INFORMATION info;ULONG a;char*buff;<br> ANSI_STRING str; LARGE_INTEGER li;li.QuadPart=-10000;<br> //查标志。如果所要求的存取方式不是PAGE_EXECUTE,<br> //qƈ不要?br> if((arg[4]&0xf0)==0)return 1;<br> if((arg[5]&0x01000000)==0)return 1;<br> //l由文g句柄得到文g?br> hand=(HANDLE)arg[6];<br> ObReferenceObjectByHandle(hand,0,0,KernelMode,&file,&info);<br> if(!file)return 1;<br>  RtlUnicodeStringToAnsiString(&str,&file->FileName,1);<br>  a=str.Length;buff=str.Buffer;<br>  while(1)<br>  {<br>   if(buff[a]=='.'){a++;break;}<br>   a--;<br>  }<br>  ObDereferenceObject(file);<br>  //如果它是不可执行?q也不要?br>  //q回1<br>  if(_stricmp(&buff[a],"exe")){RtlFreeAnsiString(&str);return 1;}<br>   //现在Q我们要询问用户的选择?br>   //把文件名写入~冲区,q等待直到用hC响?br>   //(W一个DWORD?意味着我们可以l箋)<br>   //同步存取该缓冲区<br>   KeWaitForSingleObject(&event,Executive,KernelMode,0,0);<br>   //把缓冲区的前两个DWORD|ؓ0Q?br>   //把字W串复制到该~冲ZQƈ循环下去Q直到用h每一?br>   //DWORD|ؓ1.<br>   //W二个DWORD的值指明用L响应<br>  strcpy(&output[8],buff);<br>  RtlFreeAnsiString(&str);<br>  a=1;<br>  memmove(&output[0],&a,4);<br>  while(1)<br>  {<br>   KeDelayExecutionThread(KernelMode,0,&li);<br>   memmove(&a,&output[0],4);<br>   if(!a)break;<br>  }<br>  memmove(&a,&output[4],4);<br>  KeSetEvent(&event,0,0);<br>  return a;<br> }<br> //仅保存执行上下文q调用check() <br> _declspec(naked) Proxy()<br> {<br>  _asm{<br>   //保存执行上下文ƈ调用check()<br>   //-后面的依赖于check()所q回的?br>   // 如果q回值是1Ql实际的调用?br>   //否则Q返回STATUS_ACCESS_DENIED<br>   pushfd<br>   pushad<br>   mov ebx,esp<br>   add ebx,40<br>   push ebx<br>   call check<br>   cmp eax,1<br>   jne block<br>   //l箋实际的调?br>   popad<br>   popfd<br>   jmp RealCallee<br>   //q回STATUS_ACCESS_DENIED<br>   block:popad<br>   mov ebx, dword ptr[esp+8]<br>   mov dword ptr[ebx],0<br>   mov eax,0xC0000022L<br>   popfd<br>   ret 32<br>  }<br> }</td> </tr> </tbody> </table> <br>  Proxy()保存寄存器和标志Q把一个指向服务参数的指针压入栈中q调用check()。其它的依赖于check()所q回的倹{如果check()q回TRUE(也就是,我们惌l箋h)Q那么,Proxy()恢复寄存器和标志,q且把控制权交给服务实现部分。否则,Proxy()把STATUS_ACCESS_DENIED写入EAXQ恢复ESPq返?从调用者的观点来看Q这p对NtCreateSection()的调用失败一?以错误状态STATUS_ACCESS_DENIEDq回?br> check()函数是怎样做出军_的?一旦它收到一个指向服务参数的指针参数Q它可以检查这些参数。首先,它检查标志和属?如果有一部分没有被要求作Z个可执行映像映射Q或如果要求的页面保护不允许执行Q那么我们可以确定NtCreateSection()调用与进E创建毫无关pR在q种情况下,check()直接q回TRUE。否则,它将查该潜在文g的扩?毕竟QSEC_IMAGE属性和允许执行的页面保护可能被要求来映某个DLL文g。如果该潜在文g不是一?exe文gQ那么,check()返回TRUE。否则,它给用户模式代码一个作出决定的Z。因此,它仅把文件名和\径写C换缓冲区Qƈ且对它@环查询,直到它得到响应ؓ止?br><br>  在打开我们的驱动程序前Q我们的应用E序创徏一个运行下面函数的U程Q?br><br> <table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1> <tbody> <tr> <td>void thread()<br>{<br> DWORD a,x; char msgbuff[512];<br> while(1)<br> {<br>  memmove(&a,&outputbuff[0],4);<br>  //如果什么也没有QSleep() 10毫秒q再?br>  if(!a){Sleep(10);continue;}<br>  //看v来象我们的权限被询问?<br>  //如果被怀疑的文g已经存在于空白列表中Q?br>  // 则给Z个积极的响应?br>  char*name=(char*)&outputbuff[8];<br>  for(x=0;x<stringcount;x++)<br>  {<br>   if(!stricmp(name,strings[x])){a=1;goto skip;}<br>  }<br>  //要求用户允许q行该程?br>  strcpy(msgbuff, "Do you want to run ");<br>  strcat(msgbuff,&outputbuff[8]);<br>  //如果用户的答复是U极的,那么把这个程序添加到I白列表?<br>  if(IDYES==MessageBox(0, msgbuff,"WARNING",MB_YESNO|MB_ICONQUESTION|0x00200000L))<br>   {a=1; strings[stringcount]=_strdup(name);stringcount++;}<br>  else a=0;<br>  // 把响应写入缓冲区中,而由驱动E序之后取回?br>  skip:memmove(&outputbuff[4],&a,4);<br>  //告诉驱动E序l箋<br>  a=0;<br>  memmove(&outputbuff[0],&a,4);<br> }<br>}</td> </tr> </tbody> </table> <br>  q段代码是显然的-我们的线E每10毫秒查询交换~冲区。如果它发现我们的驱动程序已l把它的h寄到了该~冲ZQ它检查被允许在本Zq行的程序列表中的文件的文g名和路径。如果发现匹配,它直接给Z个OK响应。否则,它显CZ个消息窗口,询问用户是否允许有问题的E序执行。如果响应是U极的,我们把有问题的E序d到允许在本机上运行的软g列表中。最后,我们把用户响应写入缓冲区Q也是_把它传递到我们的驱动程序。因此,该用户就能完全控制它的PC上的q程的创?只要我们的程序运行,在没有用hl予权限的情况下Q绝Ҏ有办法来启动该PC上的Mq程?br><br>  正如你所见,我们让内核方式代码等待用户反应。这是否是一U聪明的举措呢?Z回答q个问题Q你必须问你自己你是否正在堵住Q何关键的pȝ资源-一切都依赖于具体的情况。在我们的情况下Q一切发生在IRQLPASSIVE_LEVELU上Qƈ没有包含对IRPs的处理,q且必须{待用户响应的线Eƈ不十分重要。因此,在我们的情况下,一切工作正常。然而,本例仅ؓ演示之目的而编写。ؓ了实际地使用它,以一个自动启动的服务的方式来重写我们的应用程序是很重要的。在q种情况下,我徏议我们解除LocalSystem帐户Qƈ且,在NtCreateSection()被用LocalSystem帐户Ҏ在一个线E的上下文中调用的情况下Q可以l实际的服务实现而不施行M?不管怎么_LocalSystem帐户仅运行那些在注册表中指定的可执行E序。因此,q样的一U解除不会是与我们的安全相妥协的?br><br>  <strong>四?l论</strong><br><br>  最后,我必L出,钩住本机API很明显是现已存在的最强有力的~程技术之一。本文通过一个例子向你展C通过钩住本机API可以实现的能?正如你所见,我们已设法防止未被授权的E序的执?q可以通过钩住单一的本机API函数来实现。你可以q一步扩展这个方法,q且获得对硬件设备、文件IO操作、网l流量等{的完全控制。然而,我们现在的解x案ƈ不是准备为内核模式API调用者所?一旦内核模式代码被允许直接调用ntoskrnl.exe的输出,则这些调用就不需要经ql服务发送者进行了?br><br>  本文源码在运行Windows XP SP2的若q机器上成功地测试过。尽我q没在Q何另外的环境下面试它,我相信它应该到处工作正常-不管怎么_它从未用Q何系l特定的l构。ؓ了运行这个示例,所有你要做的是攄protector.exe和protector.sys到相同的目录下,q且q行protector.exe。直到protector.exe的应用程序窗口被关闭为止Q否则,每次你都会被提示你试图运行Q何可执行E序? <img src ="http://www.shnenglu.com/elva/aggbug/46491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">叶子</a> 2008-04-08 11:17 <a href="http://www.shnenglu.com/elva/archive/2008/04/08/46491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>驱动E序安装-INFhttp://www.shnenglu.com/elva/archive/2008/03/17/44672.html叶子叶子Mon, 17 Mar 2008 02:00:00 GMThttp://www.shnenglu.com/elva/archive/2008/03/17/44672.htmlhttp://www.shnenglu.com/elva/comments/44672.htmlhttp://www.shnenglu.com/elva/archive/2008/03/17/44672.html#Feedback1http://www.shnenglu.com/elva/comments/commentRss/44672.htmlhttp://www.shnenglu.com/elva/services/trackbacks/44672.html当用户刚插上讑֤或启动引|BootQ时Q设备是刚刚物理存在于机器上Ӟȝ驱动应自动地Q动态的,识别g的变化。这Ӟp有一个识别设备,安装驱动?span>INF文g?/span>

所谓文件是指用一个共同的W号名称作ؓ代表Q若q个逻辑记录构成的信息集合或目的QŞ式和内容的表CZ彼此怼的一些信息项的集合。简单的_是h一定名U的一l相x据的集合?/span>

所?span>INF文gQ就是以INF为扩展名的文本文Ӟ他控制与驱动安装E序有关的大多数zd?/span>

因ؓq个INF文g抽象了设备的上层建筑Q含有安装驱动所有的必需的信息,所以它要由驱动开发h员随驱动一h供,来告诉操作系l那些文仉要复制到用户的硬盘上Q应d或修改哪个注册表{。简单的_INF文g是机器的参考文ӞInformation FileQ?/span>

INF文本文g?span>Windows 3?span>X?span>INI文g很类|INF文g分ؓ几节Q每节包括一Ҏ几项。每节与安装q程中的某一步相养I比如_某一节是关于文g拯的。某一节是关于如何d注册表项{等。作Z个开发者,你可以通过M文本~辑器创建生?span>INF文g?span>Microsoftq在DDK中提供了INFEDIT工具Q拥护可以很方便的~辑INF 文gQ如果实例用INFEDITQ请参阅DDKQ?/span>

INF文g可以支持很复杂的安装脚本Q但是大多数的开发者只愿意使用处理一些最基本的脚本。一个基本的安装脚本应该包括Q?/span>

1鉴定g讑֤

2把驱动程序从安装盘上拯到系l盘上去

3鉴定g讑֤资源的需?/span>

4当硬件设备被仿真是,在注册表中加上DevLoader一?/span>

INF文g通常与磁盘或光盘上的g驱动E序一h供?span>INF文g的结构和内容由驱动程序创作者决?/span>

1.          举例说明

下面举例说明有关INF的基本特征和内容Q以便更好的理解?/span>

[Version]

Singnature=$windowsNT$                 //选择版本

Class=Unknown                          //pȝ定义用户指定的类?/span>

Provider=%ABCD%                        //提供?/span>

DirverVer=11/15/2001                    //

CatelogFile[.Ntetc]          //包含WHQL数字{֐的目录说明文件?/span>

 

[Strings]

ABCD=”me, the writer”       //定义?/span>

[SourceDisksNames]     //源代码盘或发行盘的描qͼ目录和打包文?strong>

L=”Ggdriver directory”…obj\i386\

[SourceDisksFiles]      //和打包文?strong>

Ggdriver.sys=l,obj\i386\some\

[DestinationDirs] //复制~省文g?span>Filelist节中的文Ӟ

//指定目录和子目录?span>ID q指定文件的标准位置?/span>

 

Ggdiver.Files.Driver=10,System32\Drivers

Ggdiver.Files.Driver=10, System32\Drivers

[Manufacturer]            //指定生厂商?span>models节中相应的名U?strong>

%ABCD%=Ggdriver

[models]                  //最新的gID号先出现

%USBDevice_V2%=V2Install,USB\VID_ABCD%PID_EFOL&REV_DO02

%USBDevice_V1%=V2Install,USB\VID_ABCD%PID_EFOL

[install]                         //指向d的设备接口列?strong>

Copyfiles=Ggdriver.Files.Driver

AddReg=Ggdriver.AddReg

LogConfig=logconfig

DirverVer=19/10/2001

ProfileItems=AB\cd

[filelist]

[addreg]

[logconfig]

[install.AddService]

ServiceTypy=l

StartType=start-code

ErrorControl=error-control-level

ServiceBinary=path-tc-driver

INF文g是一个文本文Ӟ׃同的节组成,每一个节从括在方括号中的节名U开始,后面是节的内宏V这些节也是分层的,其先后顺序与本样例基本保持一致?/span>

在上面的样例中:

?strong>[Verson ]节中Q?strong>Signature只能在$WindowsNT$,$Winfows95$以及$WindowsNT$中选一Q?/span>

ProviderҎINF文g的创造者,通常是设备的生商;

ClassҎpȝ定义用户指定的类名;

CatalogFile[.NTetc]则是必须包含的驱动程序包?span>WHQL数字{֐的目录说明文件?/span>

?strong>[Strings ]节中定义代替字符串的宏: 

如例中:ABCD=me,the writer”x?span>%ABCD%的意思是me,the writer。而在使用Ӟ也用“meQ?span>the writer”代替ABCD。ؓ了适应不同的语a上下文,可以?span>String 的后面附加(?span>Winnt?span>H`中定义的Q?span>LangID?span>SubLangIDQŞ成新?span>Strings节?span>LangID?span>SubLangID都是两位敎ͼ它们合作指定某语a上下文?/span>

如定义一个英国英语(0902Q的flour:

[Strings]

ABC=”Flor”

[Strings.0902]

ABC=”Flour”

[SourceDisksName]?strong>[SourceDisksFiles]节分别是指源代码盘或发行盘的描述Q目录和打包文g。如果所有文仉在根目录中,[SourceDisksFiles]节可以是在空?/span>

?strong>[DestinationDirs]节中Q复制缺省文件和Filelist节中的文Ӟ指定目录和子目录?span>ID q指定文件的标准位置?/span>

[Manufacture]节指定生产厂商和models节中相应的名Uͼ

[install]节则指向d的设备接口列表,接口键的注册表,其中Q?/span>

Copyfiles=filename|filelist,指定要复制的文g或后面列出文件的列表节的名称?/span>

AddReg=addreg,指定后面遗留讑֤节的名称?/span>

LogConfig=logconfig,指定后面遗留讑֤节的名称?/span>

ProfileItems,指定d到计机界面“开?#8221;菜单中的文g名称V?/span>

[filelist]指定要安装的文g列表?/span>

[addreg]节,指定新的键和倹{?/span>

[logconfig]节,指定遗留讑֤?span>I/O地址Q?span>IRQ{配|的详细信息?/span>

[install?span>AddService]节,只针?span>Windows2000的驱动程序,指定驱动E序的详l信息?/span>

 

下面我们具体介绍一?span>INF文gl构?/span>

1.1INF文gl构

一?span>INF文g是一个被划分Q?span>SectionQ的单的文本文gQ每节由ҎP[]Q内的标C符表示。某些节名字是必ȝQ而另一些是驱动E序专用的。每节下面的各项控制某些安装操作Q或者连接或列D其它节?/span>

文g中各节出的序q不重要Q因为每节都被命名和链接了。一节内容在遇到另一节或者遇到文件结之前l执行。规定节的唯一的名字是区分大小写的Qƈ且在长度上必限制在28个字W以内,以保持与Windows 98 的兼Ҏ。节的名字可以包括空|但是只有在整个名字应用时。允怸划线和点字符?/span>

节中各项的基本格式如下:

entry=value[Q?span>value….]

q里?span>entry是一个指令,关键字或者文件名Q?span>value是应用于entry的属性?/span>

下图表示了节名字链接?/span>

Entry?span>value名字可以规定Z个字W串记号Q?span>string tokenQ,它是一个由癑ֈ?span>%包围的替换字节串Q一个独立的INF?span>——[Strings]Q给指定的语aID提供了字W串记号倹{?/span>

下面我们看一?span>INF文g的各个小节及节的基本内容:Q表1Q表2Q?/span>

下面我们详细每一节的内容Q?/span>

1.2 Version?/span>

一个有效的INF文g以一?span>[Version]节开始,它担当整?span>INF文g的头部和{֐?span>[Version]节中允许的和要求的项都列在了下表-3

 

1.3 Manufacturers?/span>

另一个必ȝ节是[Manufacturers]V该节中的每个项列出INF文g安装的设备和他们的驱动程序。每个项的格式如下:

 manufacturer=model

q里?span>manufacturer列出要被安装的一个或多个g型号的制造商?span>INF文g中的唯一名字?span>Model值指向另一?span>INF节名字,q一步列出硬件型号驱动程序安装的方向?/span>

1.4 Models?/span>

对于列在[Manfacturers]节中的每个型P必须有一个相应的节作为由model指定的节出现。每?span>model的形式为:

device-description=install-section-nameQ?span>hw-id[Q?span>compatible-id…]

q里?span>device-description表示人可以理解的讑֤型号列表和一个简单的描述。在一些安装过E中此字W串在一个对话框中提交给用户Q因此有必要提供多种语言作ؓ字符串记受?/span>

 install-section-name值引?strong>[DDInstall]节,表示D一步安装的另一?span>INF节,hw-id值是g讑֤?span>PNP兼容的ȝ上声明时q回?span>PnP标示W。例如?span>USB \ VID_045E&PID_OOB   标示USB上的Microsoft HIDQ?span>Human Input DeviceQ键盘设备。能够增加Q意数量的compatlible-id|表示相同的安装脚本可以用于列表中包含的Q何设备?/span>

1.5 DDInstall?/span>

?span>INF节名字链表的低部附近Q但q最低部Q是[DDInstall]节,它从[Models]节中为每个制造商的每个型可定一个唯一的名字?strong>[DDInstall]节中允许的和要求的项目见下面?.

       虽然在语法上只有AddRegҎ必需的,但是CopyFilesҎ[DDInstall]节的一个基本指令。它采取如下形式Q?/span>

CopyFiles = file – list – section [Q?span>file – list – section….]或?/span>

CopyFile = @filename

前一UŞ式更加常用,因ؓ它允怸个间接指针指向包含被安装的文件列表的其他节。然而,对于单的驱动开发程序安装,采取直接文g名方法就行了。在下面两个节中将?span>AddReg?span>CopyFiles指o做进一步解释?/span>

1.6  CopyFiles?/span>

INF文g?strong>[CopyFiles]节有一个唯一的名字,q从[DDInstall]节的CopyFiles指o引用它。该节中的每个项采用如下形式Q?/span>

destination – filename[Q?span>source- filenameQ?span>temp-filenameQ?span>flag]

q里?strong>destiantion-filename是最重要复制的目标文件名。如果源文g名不相同Q必规?strong>source – filename?span>Temp-filenameg再适用Q虽?span> Windows 98仍然要求Q,它在pȝ再次引导之前规定新文件的临时文g名。对?span>Windows 2000Q忽略此倹{?/span>

 Falg D定对新目标文件的处理Q其描述见表5。可以对falgg的各个ؓq行“?#8221;q算Q以使多个操作v作用。几U操作是互斥的(例如Q?span>WARN_IF_SKIP?span>NOSKIPQ?span>,有疑问时应当查阅有关文档?/span>

因ؓ[CopyFiles]节的的语法没有包含一个可选项来规定源文g的磁盘或路径Q必M用其?span>INF节—?strong>[SourceDisksNames]?strong>[SourceDisksFiles]。然?strong>[CopyFiles]节中各项复制的文件由另一?span>INF节—?strong>[DestiantionDirs]节指定?/span>

1.7 AddReg?/span>

一?span>INF文g?strong>[AddReg]节被唯一命名Qƈ?strong>[DDInstall]节中?strong>AddReg指o引用它。此节的目的是提供增加或者修改目标系l注册表中的目。本节中每个目采取如下形式Q?/span>

 reg-root[Q?span>subkeyQ?span>value- nameQ?span>flags Q?span>value]

q里?span>reg- root是注册表库(hiveQ之一的羃写,见表6所列。DC被修改的注册表库?strong>SubbkeyDC库底下的键名,在层ơ结构中子键用反斜线Q?span>\Q字W隔开。例如,software\W2KdriverBook\Driver\Seting ?span>HKCU或?span>HKLM库的一个有效子键?/span>

Value-name指定要增加或修改的注册表倹{每个注册表键包含一个或多个|保存不同cd的数据。注册表~辑器(Registy EditorQ在双面板中列出子键的倹{值名和值数据同时在该面板中出现Q左辚w板只列出子键。图3说明了注册表术语之间的关pR?/span>

Flags指定数据保存的类型,flages可能的位|见?span>7所?

1.8  SourceDisksNames?/span>

如果INF文g控制的驱动程序文件的分布跨越多个盘QY盘或光盘Q,?span>INF文g必须包含一?strong>[SourceDisksNames]节。本节在分布集中为每个磁盘包含一,目采取如下形式Q?/span>

Diskid=disk – descript[Q?span>tagfileQ?span>unusedQ?span>path]

q里?span>diskid`是分布集内的一个一个唯一的编码。通常Q磁盘从1开始编码?span>Disk – description 标签是一个供人阅ȝ文本Ԍ可以保证安装q程中拥护提供正的盘Q在安装q程l箋之前核对tagfile值是否在插入的煤体上。如?span>tagfile文g不存在,则提C用h入正的盘。如?span>tagfile值包?span>-CAB扩展Q则该文件被认ؓ是磁盘上驱动E序源文件的压羃文g集?/span>

Path值是盘上驱动程序源文g的相对于根目录的盘路径。与tagfilegPpath是可选的。如果忽略它Q则认ؓ根目录是文g的源?/span>

1.9 SourceDisksFiles?/span>

驱动E序INF文gq必d含一个称?strong>[SourceDisksFiles]的节。此节列出驱动程序安装期间用的文g名。每个文件对应于本节中的一个项Qƈ采取如下形式Q?/span>

Filename = diskid[Q?span>sbdirQ?span>size]

很自Ӟdiskid值在[SourceDisksNames]节中指定了找?span>filename的一个磁盘,subdir值可选,它指定文件在盘上的一个\径?span>Size值可选,指定文g以字节ؓ单位的未压羃大小。在开始文件复制前Q安装进E可以用此大小定源文件是否合适目标系l?/span>

1  DestinationDirs?/span>

q是INF文g中必需的节Q指定源文g的目标目录。没有这部分内容Q安装程序或q程没有用来拷贝文件的目标目录?span>[DestinatonDirs]节中的项采取如下形式Q?/span>

File – list – section = dirid[Q?span>subdir]或?/span>

DefaultDestDir = dirid[Q?span>subdir]

q里file – list – section规定了在[CopyFiles]指o中调出来的部分。它规定一个指令拷贝的所有文件安装到指定的目录。对于项?span>DefaultDestDirQ上q规范适用于所?span>[CopyFiles]指oQ否则不会与[DestionationDirs]节中?span>file- list – section关联?/span>

Dirid值根据表8规定了目标的一个列丑ր{如果提供了?span>subdirQ它指定diid调处的目录下面的一个相对\径?/span>

 

2. DDInstall.Services?/span>

Z真正的复制的文件成为目标系l上的驱动程序,必须通知服务器管理程序(SCMQ。安装在Windows 2000下的每个驱动E序?span>HKLM\System\Current-ControlSet\Services下的注册表中有一V?span>ServiceTypegؓ1表示一个内核模式设备驱动程序?span>StartType指定在引DE中的什么点上驱动程序装入(3表示按需或手动启动)。在驱动E序装入q程中遇到错误时Q?span>ErrorControl值确定发生了什么情c?span>ServiceBinary值指向驱动程序文Ӟ?span>SYS文gQ的位置Q但是,如果二进制g?span>%windir%\system32\drivers目录Qƈ且与HKLM\…\Services下的子键有相同的名字Q则可以忽略ServiceBinary倹{?/span>

DDInstall.Services节项目中包括一个Ş式如下的目Q?/span>

AddService = ServiceNameQ?span>[flags]Q?span>service – install – section[Q?span>eventlog – install – section]

q里?span>ServiceName表示讑֤的名字,通常是驱动程序的名字Q没有?span>SYS扩展名?span>Flags值的描述见表9

Service – install – section和可选的eventlog- install – sectionD出控制服务值项目(诸如ServiceType?span>StartTypeQ的新增?span>INF节名字?/span>

3. ServiceInstall ?/span>

[ServiceInstall]节名字实际上?span>DDInstall.Services节中每个AddService唯一规定Q它控制把驱动程序安装到服务控制理E序?span>[ServiceInstall]节允许的见?span>10所列?/span>

4 .验证INF语法

DDK包含一个基本的工具CHKINFQ在DDK?span>Tools目录中。它依赖?span>Perl脚本引擎Q该引擎可以?span>www.perl.com上下载。虽然工h有什么优点,但它在检查标?span>Microsoft INF文g时能报告许多错误。工具以HTML文g形式输出?/span>

DDK Tools目录q包括一个用语简?span>INF文g构造的实用E序CENINF?span>EXE ?必须把该工具区分为基本工P它对入门者是有用的?/span>

最后,DDK提供?span>STAMPINF?span>EXEq一单工P它提供了快速增加或修改INF中版本信息的机制?/span>



叶子 2008-03-17 10:00 发表评论
]]>
Hook API监视驱动的加?http://www.shnenglu.com/elva/archive/2007/12/13/38402.html叶子叶子Thu, 13 Dec 2007 03:37:00 GMThttp://www.shnenglu.com/elva/archive/2007/12/13/38402.htmlhttp://www.shnenglu.com/elva/comments/38402.htmlhttp://www.shnenglu.com/elva/archive/2007/12/13/38402.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/38402.htmlhttp://www.shnenglu.com/elva/services/trackbacks/38402.html
				;**************************************************************************************************
;Author:dge/D?br>;Date :2006.7.20
;**************************************************************************************************
;f:\masm32\bin\ml /nologo /c /coff HookAPI.asm
;C:\>f:\masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:HookAPI.sys /subsystem:native HookAPI.obj
.386 . model flat , stdcall
option casemap
: none ;************************************************************************************************** include f:\masm32\include\w2k\ntstatus.inc include f:\masm32\include\w2k\ntddk.inc include f:\masm32\include\w2k\ntoskrnl.inc includelib f:\masm32\lib\w2k\ntoskrnl.lib include f:\masm32\Macros\Strings.mac ;************************************************************************************************** .data ;保存地址 dwOldNtLoadDriver dd ? dwAddr dd ? dwDriverName ANSI_STRING <?>
.
const CCOUNTED_UNICODE_STRING "\\Device\\devHookApi", g_usDeviceName, 4 CCOUNTED_UNICODE_STRING "\\??\\slHookApi", g_usSymbolicLinkName, 4 CCOUNTED_UNICODE_STRING "ZwLoadDriver", g_usRoutineAddr, 4 ;************************************************************************************************** .code ;让这个函数在NtLoadDriver的调用时被执行以实现监视 NewNtLoadDriver proc lpDriverName:PUNICODE_STRING pushad ; int 3 ; invoke DbgPrint, $CTA0("\nEntry into NEW\n") invoke RtlUnicodeStringToAnsiString, addr dwDriverName, lpDriverName,TRUE invoke DbgPrint, $CTA0("\nDriverName: %s.sys\n"), dwDriverName.Buffer popad ;调用原函? push lpDriverName call dwOldNtLoadDriver ret NewNtLoadDriver endp ;************************************************************************************************** HookFunction proc

pushad
; int 3 ; invoke DbgPrint, $CTA0("\nEntry into hoookfunction\n") ;下面是用KeServiceDescriptorTabled导出W号获得数组的基地址Q这个数l中包含有NtXXXX函数的入口地址? mov eax, KeServiceDescriptorTable mov esi, [eax] mov esi, [esi] ;用MmGetSystemRoutineAddress来获得函数ZwLoadDriver的地址。ƈ从这个函数地址后面的第2个字节中取得服务受从? ;获得以服务号Z标的数组元素? invoke MmGetSystemRoutineAddress,addr g_usRoutineAddr inc eax movzx ecx,byte ptr[eax] sal ecx,2
add
esi,ecx mov dwAddr,esi
mov
edi,dword ptr[esi] ;保存旧的函数地址? mov dwOldNtLoadDriver,edi mov edi,offset NewNtLoadDriver ;修改入口地址 cli
mov
dword ptr[esi],edi sti popad mov eax, STATUS_SUCCESS ret HookFunction endp ;************************************************************************************************** DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP mov eax, pIrp assume eax:ptr _IRP mov [eax].IoStatus.Status, STATUS_SUCCESS and [eax].IoStatus.Information, 0 assume eax:nothing

invoke
IoCompleteRequest, pIrp, IO_NO_INCREMENT mov eax, STATUS_SUCCESS ret DispatchCreateClose endp ;************************************************************************************************** DriverUnload proc pDriverObject:PDRIVER_OBJECT ;必须保存环境Q否则后果很严重。在q个函数中恢复被修改的地址?
pushad
; int 3 ; invoke DbgPrint, $CTA0("\nEntry into DriverUnload \n") mov esi,dwAddr mov eax,dwOldNtLoadDriver cli mov dword ptr[esi],eax sti invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName mov eax,pDriverObject invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
popad

ret
DriverUnload endp ;************************************************************************************************** DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local status:NTSTATUS local pDeviceObject:PDEVICE_OBJECT ; int 3 ; invoke DbgPrint, $CTA0("\nEntry into DriverEntry\n") mov status, STATUS_DEVICE_CONFIGURATION_ERROR invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, addr pDeviceObject .if eax == STATUS_SUCCESS invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName .if eax == STATUS_SUCCESS mov eax, pDriverObject assume eax:ptr DRIVER_OBJECT mov [eax].DriverUnload, offset DriverUnload mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)], offset DispatchCreateClose mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)], offset DispatchCreateClose assume eax:nothing
invoke
HookFunction mov status, STATUS_SUCCESS .else invoke IoDeleteDevice, pDeviceObject .endif .endif
mov
eax, status ret DriverEntry endp

end
DriverEntry ;**************************************************************************************************


叶子 2007-12-13 11:37 发表评论
]]>
文gqo驱动开发辅助工具集http://www.shnenglu.com/elva/archive/2007/07/31/29080.html叶子叶子Tue, 31 Jul 2007 07:20:00 GMThttp://www.shnenglu.com/elva/archive/2007/07/31/29080.htmlhttp://www.shnenglu.com/elva/comments/29080.htmlhttp://www.shnenglu.com/elva/archive/2007/07/31/29080.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/29080.htmlhttp://www.shnenglu.com/elva/services/trackbacks/29080.html阅读全文

叶子 2007-07-31 15:20 发表评论
]]>
本地目录的只LӞ止写、删除、新建)Q?/title><link>http://www.shnenglu.com/elva/archive/2007/05/07/23590.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Mon, 07 May 2007 15:54:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2007/05/07/23590.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/23590.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2007/05/07/23590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/23590.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/23590.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/elva/archive/2007/05/07/23590.html'>阅读全文</a><img src ="http://www.shnenglu.com/elva/aggbug/23590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">叶子</a> 2007-05-07 23:54 <a href="http://www.shnenglu.com/elva/archive/2007/05/07/23590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文g加密标识 Q隐藏文件头的黑客代?/title><link>http://www.shnenglu.com/elva/archive/2007/05/07/23589.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Mon, 07 May 2007 15:51:00 GMT</pubDate><guid>http://www.shnenglu.com/elva/archive/2007/05/07/23589.html</guid><wfw:comment>http://www.shnenglu.com/elva/comments/23589.html</wfw:comment><comments>http://www.shnenglu.com/elva/archive/2007/05/07/23589.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/elva/comments/commentRss/23589.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/elva/services/trackbacks/23589.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/elva/archive/2007/05/07/23589.html'>阅读全文</a><img src ="http://www.shnenglu.com/elva/aggbug/23589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/elva/" target="_blank">叶子</a> 2007-05-07 23:51 <a href="http://www.shnenglu.com/elva/archive/2007/05/07/23589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 文gqo驱动l验ȝhttp://www.shnenglu.com/elva/archive/2007/05/07/23588.html叶子叶子Mon, 07 May 2007 15:48:00 GMThttp://www.shnenglu.com/elva/archive/2007/05/07/23588.htmlhttp://www.shnenglu.com/elva/comments/23588.htmlhttp://www.shnenglu.com/elva/archive/2007/05/07/23588.html#Feedback0http://www.shnenglu.com/elva/comments/commentRss/23588.htmlhttp://www.shnenglu.com/elva/services/trackbacks/23588.html阅读全文

叶子 2007-05-07 23:48 发表评论
]]>
ŷҹAŴƬþ| Ʒþþþ| þþþþ| һֻƴƬ99þ| ձþþþĻ| 91鶹Ʒ91þþ| þĻ| ޾Ʒþþþþ| ھƷþþþþþþ| Ʒþþþþ| ݺ޾þþþþۺ| þݹֻƬ| þþþҹҹҹƷ| þþþþúݺݶ| þøݾƷԴվ| ҹƷþþþþžŵӰ| þþþùƵӰ| þۺ77777鶹| þAV뾫Ʒɫҹ鶹| þþƷ| þþþþþ| ӰԺ˾þ| þ99þóѲ| ɫݺݾþۺ| þҹɫƷ鶹| þԭۺ| ˾þۺӰԺ| þ˽˹Ʒ| þeֻйľƷ99| þݺҹҹav˳| պŷۺϾþ| þþƷ99þ㽶| ƷþĻ| 777ҹƷþav| ŷۺҹҹþ| 97Ʒ˾þô߽| ɫɫݺɫۺϾþ| ޹ƷþþþþԻ| þֻоƷ18| þþþ޾Ʒһ | þþƷavպ|