2007年7月8日星期日

一个汇编版的NDIS驱动程序模板

一个汇编版的NDIS驱动程序模板(by mgf @2007.02.23); 写驱动程序已经很久了,但我一直用汇编来写驱动程序,原因是我不喜欢DDK,因为DDK和汇编一样,不是象VC,C#那样的“可视化”的开发工具,;DDK和汇编一样看不见结构或对象的成员,也看不到各种函数的原型,这些东西和各种常量定义还必须去查看相关的包含文件,不仅如此,DDK还会;“自作聪明”地把很多垃圾代码加到我的驱动里,虽然没有影响驱动程序的功能,但是还是不爽,不如直接用汇编,生成的驱动程序是什么样的自己;心里有数。其实这也怪不得MS,它不想大家了解它的操作系统核心技术,但是又不得不开放一些技术细节给大家写驱动,所以只有提高门槛,搞出这;么一个BT的DDK来吓走很多人,它的目的也就达到了,就是让尽可能少的人了解它的核心技术。能够跨过DDK这道槛的,必定不是一般的高手。呵呵!; 很多书都建议写驱动最好不用汇编,因为写出来的程序不可移植,但是我不这么认为,因为现在90%的人写出的驱动都是在PC上运行的,没有必要;为了这10%而放弃这么好的汇编语言。而且计算机都是相通的,如果你会写PC下的驱动了,再写MAC下的驱动不就容易多了吗?; 这是一个标准的legacy驱动程序,虽然编译时用WDM的方法编译,它有Unload,Read,Write例程,而且还用NDIS HOOK来部分实现了防火墙的功能。;NDIS HOOK技术被广泛应用于瑞星、江民、天网等众多流行的防火墙里,它的原理是使用NdisRegisterProtocol()注册假协议来获取系统的协议链地址,;再搜索这个单向协议链,找到TCPIP协议的NDIS_OPEN_BLOCK(NDIS_BINDING_HANDLE)结构,里面就有TCPIP协议的各种派发函数地址,比如SEND在结构;偏移30H的地方,RECV在结构偏移40H的地方,还有其他很多重要的函数地址都在这个表里。把表里的地址替换成我们的函数地址,就可以拦截操作系统;收发的所有数据包了。本驱动只是实现了嗅探数据包的功能,还没有实现拦截恶意数据包的功能,如果想实现这个功能,在_Write函数、_mySend函数、;_myRecv函数里加些代码,使它们配合完成拦截数据包的功能。本驱动如果IoAttachDevice其他驱动,可以改成过滤器;做些修改,还可以实现更多功能,;可以用来过滤缓冲区溢出攻击包,也可以用来定制自己的SQL INJECTION防护网。; 本驱动嗅探数据包的流程是这样的:当系统收发数据包时,被_mySend或_myRecv拦截,这两个函数就用NdisSetEvent()置位一个RING3事件(这个事;件在DriverEntry里建立,在RING3里打开),这样在RING3应用层的WaitForSingleObject()因为事件被置位而返回,于是RING3代码用ReadFile()读取数;据包的内容,判断是放行还是拦截,再用WriteFile来通知驱动做相应的操作。当然为了提高效率,不是每个数据包都提示RING3应用程序该不该放行,;有些可以直接在RING0驱动里判断的就不必传到RING3去判断了。处于RING3的代码大概是这样的:;#include "stdafx.h";#include "windows.h";#include "stdlib.h";int _tmain(int argc, _TCHAR* argv[]);{; HANDLE hdrv=CreateFile("\\\\.\\NDISDRV",0xc0000000,0,0,3,0,0);; HANDLE hEvent=OpenEvent(0x100000,0,"Send3Event"); //注意Send3Event必须和驱动里的名字对应; //HANDLE hEvent=OpenEvent(0x100000,0,"Recv3Event"); //注意Recv3Event必须和驱动里的名字对应;; int dwTempVar=1;char szTempBuffer[0x800];; while(dwTempVar); {; WaitForSingleObject(hEvent,-1); ; ReadFile(hdrv,szTempBuffer,0x800,(LPDWORD)&dwTempVar,0);; };; return 0;;};把下面的代码保存到ndisdrv.asm里,在MASM32 6.14及以上的编译器里编译:;ml /c /coff /Cp ndisdrv.asm;link /subsystem:native /driver:wdm /release /align:16 /base:0x10000 /out:ndisdrv.sys ndisdrv.obj;由于驱动程序涉及的知识太广而深奥了,本文难免有错漏的地方,希望大家指出,以免一错再错,误导别人。;下面是驱动的代码:.586p.model flat,stdcalloption casemap:noneassume fs:nothing,gs:nothingincludelib ntoskrnl.libincludelib hal.libincludelib ndis.libincludelib tdi.libincludelib wdm.lib;以上LIB文件要从DDK里复制到MASM32的LIB目录里NdisQueryBufferSafe proto :dword,:dword,:dword,:dwordNdisInitializeEvent proto :dwordNdisSetEvent proto :dwordNdisResetEvent proto :dwordNdisWaitEvent proto :dword,:dwordNdisRegisterProtocol proto :dword,:dword,:dword,:dwordNdisDeregisterProtocol proto :dword,:dwordIoCreateDevice proto :dword,:dword,:dword,:dword,:dword,:dword,:dwordIoDeleteDevice proto :dwordIoCreateSymbolicLink proto :dword,:dwordIoDeleteSymbolicLink proto :dwordIoCompleteRequest proto :dword,:dwordIoCreateNotificationEvent proto :dword,:dwordPsGetVersion proto :dword,:dword,:dword,:dwordRtlCompareUnicodeString proto :dword,:dword,:dwordZwClose proto :dword;由于MASM32没有相关的INC文件,所以要使用的API要自己定义原型.datalpProtocolHandle dd 0 ;协议句柄的指针lpDeviceObject dd 0 ;设备对象的指针lpOldSend dd 0 ;保存TCPIP协议驱动的OPEN_BLOCK(BINDING HANDLE)里的SEND派发函数地址lpOldRecv dd 0 ;保存TCPIP协议驱动的OPEN_BLOCK(BINDING HANDLE)里的RECV派发函数地址lpSend3Event dd 0 ;RING3发送事件在本驱动的指针hSend3Event dd 0 ;RING3发送事件在本驱动的句柄lpRecv3Event dd 0 ;RING3接收事件在本驱动的指针hRecv3Event dd 0 ;RING3接收事件在本驱动的句柄dwStatus dd 0dwTempVar dd 0obSendEvent db 16 dup(0) ;RING0 SEND对象obRecvEvent db 16 dup(0) ;RING0 RECV对象stProtocolChar db 70h dup(0) ;NdisRegisterProtocol()要使用的NDIS_PROTOCOL_CHARACTERISTIC结构szSendBuffer db 800h dup(0) ;系统将要发送的数据包的副本szRecvBuffer db 800h dup(0) ;系统将要接收的数据包的副本dwSendSize dd 0 ;发送副本大小dwRecvSize dd 0 ;接收副本大小.conststTcpip dw 5*2,6*2dd offset szTcpipszTcpip dw 'T','c','p','i','p',0stProtName dw 7*2,8*2dd offset szProtNameszProtName dw 'N','d','i','s','D','r','v',0stDeviceName dw 15*2,16*2dd offset szDeviceNameszDeviceName dw '\','D','e','v','i','c','e','\','N','d','i','s','D','r','v',0stSymbolicLinkName dw 19*2,20*2dd offset szSymbolicLinkNameszSymbolicLinkName dw '\','D','o','s','D','e','v','i','c','e','s','\','N','D','I','S','D','R','V',0stSend3Event dw 28*2,29*2dd offset szSend3EventszSend3Event dw '\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\','S','e','n','d','3','E','v','e','n','t',0stRecv3Event dw 28*2,29*2dd offset szRecv3EventszRecv3Event dw '\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\','R','e','c','v','3','E','v','e','n','t',0.codestart proc DriverObject,RegisterPathpushadinvoke PsGetVersion,offset dwTempVar,0,0,0 ;获取操作系统版本,如果不是5.0(2000,XP,2003)就退出,因为不能使用NDIS5.0.if dwTempVar!=5jmp _exit.endifmov byte ptr stProtocolChar,5mov byte ptr stProtocolChar+1,0mov eax,dword ptr stProtNamemov dword ptr stProtocolChar+30h,eaxmov eax,dword ptr stProtName+4mov dword ptr stProtocolChar+34h,eaxmov dword ptr stProtocolChar+08h,offset PtOpenAdapterCompletemov dword ptr stProtocolChar+0ch,offset PtCloseAdapterCompletemov dword ptr stProtocolChar+10h,offset PtSendCompletemov dword ptr stProtocolChar+14h,offset PtTransferDataCompletemov dword ptr stProtocolChar+18h,offset PtResetCompletemov dword ptr stProtocolChar+1ch,offset PtRequestCompletemov dword ptr stProtocolChar+20h,offset PtReceivemov dword ptr stProtocolChar+24h,offset PtReceiveCompletemov dword ptr stProtocolChar+28h,offset PtStatusmov dword ptr stProtocolChar+2ch,offset PtStatusCompletemov dword ptr stProtocolChar+3ch,offset PtBindAdaptermov dword ptr stProtocolChar+40h,offset PtUnbindAdaptermov dword ptr stProtocolChar+38h,offset PtReceivePacketmov dword ptr stProtocolChar+44h,offset PtPNPHandler;以上是填充NDIS_PROTOCOL_CHARACTERISTIC结构invoke NdisRegisterProtocol,offset dwStatus,offset lpProtocolHandle,offset stProtocolChar,6ch ;获取系统协议链表的地址,前面做了这么多工作都是为了这个地址.if dwStatusjmp _exit.endifmov ebx,lpProtocolHandlemov ebx,[ebx+10h] ;跳过我的假协议,保存协议链里下一项的地址invoke NdisDeregisterProtocol,offset dwStatus,lpProtocolHandle ;我注册的假协议已经没有用了,注销mov lpProtocolHandle,ebx ;真正的系统协议链的地址mov esi,offset stTcpip.repeatlea edi,[ebx+44h]invoke RtlCompareUnicodeString,edi,esi,1.break .if eax==0mov ebx,[ebx+10h].until ebx==0 ;这个循环是搜索TCPIP协议的PROTOCOL_HANDLE.if eaxjmp _exit.endifmov ebx,[ebx] ;取出PROTOCOL_HANDLE里的OPEN_BLOCK指针,每个版本的NDIS的PROTOCOL_HANDLE结构都可能不同,要注意mov lpProtocolHandle,ebx ;保存TCPIP协议的OPEN_BLOCK(BINDING_HANDLE)mov eax,[ebx+30h]mov lpOldSend,eax ;保存TCPIP协议的OPEN_BLOCK(BINDING_HANDLE)里的SEND派发函数地址mov eax,[ebx+40h]mov lpOldRecv,eax ;保存TCPIP协议的OPEN_BLOCK(BINDING_HANDLE)里的RECV派发函数地址invoke IoCreateDevice,DriverObject,18h,offset stDeviceName,21h,0,0,offset lpDeviceObject ;建立设备,DeviceExtension size=18h, type= device_transferinvoke IoCreateSymbolicLink,offset stSymbolicLinkName,offset stDeviceNamemov eax,lpDeviceObjector dword ptr [eax+1ch],10h ;把device.flag设置为DO_DIRECT_IO,使驱动程序的READ、WRITE例程直接映射用户缓冲区到本驱动mov edi,DriverObjectadd edi,38hmov ecx,1chmov eax,offset _CommonIoControlrep stosd ;填充共用例程,必须,否则CreateFile()不能打开本驱动mov eax,DriverObjectmov dword ptr [eax+34h],offset _Unloadmov dword ptr [eax+44h],offset _Readmov dword ptr [eax+48h],offset _Write ;注册驱动例程mov byte ptr [eax+8],2 ;强行修改Driver.flag为legacy driver,否则DriverEntry返回时系统就会卸载本驱动(因为本驱动默认编译为WDM drvier)invoke NdisInitializeEvent,offset obSendEventinvoke NdisInitializeEvent,offset obRecvEventinvoke NdisResetEvent,offset obSendEventinvoke NdisResetEvent,offset obRecvEvent;建立RING0事件invoke IoCreateNotificationEvent,offset stSend3Event,offset hSend3Eventmov lpSend3Event,eaxinvoke NdisResetEvent,eaxinvoke IoCreateNotificationEvent,offset stRecv3Event,offset hRecv3Eventmov lpRecv3Event,eaxinvoke NdisResetEvent,eax;建立RING3事件,在RING3用OpenEvent()打开mov ebx,lpProtocolHandlemov dword ptr [ebx+30h],offset _mySend ;HOOK TCPIP协议的SENDmov dword ptr [ebx+40h],offset _myRecv ;HOOK TCPIP协议的RECV_exit:popadxor eax,eaxretstart endp_Unload proc DriverObjectmov edx,lpProtocolHandlemov eax,lpOldSendmov [edx+30h],eaxmov eax,lpOldRecvmov [edx+40h],eax;恢复TCPIP协议的OPEN_BLOCK里原来的SEND/RECV派发例程invoke ZwClose,hSend3Eventinvoke ZwClose,hRecv3Eventinvoke NdisSetEvent,offset obSendEventinvoke NdisSetEvent,offset obRecvEventinvoke IoDeleteSymbolicLink,offset stSymbolicLinkNameinvoke IoDeleteDevice,lpDeviceObjectxor eax,eaxret_Unload endp_CommonIoControl proc DeviceObject,pIrpmov eax,pIrpmov dword ptr [eax+18h],0mov dword ptr [eax+1ch],0invoke IoCompleteRequest,pIrp,0xor eax,eaxret_CommonIoControl endp_Read proc DeviceObject,pIrppushadmov ebx,pIrpmov edi,[ebx+4]mov ecx,[edi+18h]mov edi,[edi+10h]add edi,ecx ;EDI=用户缓冲区mov ecx,lpSend3Eventmov edx,lpRecv3Event.if dword ptr [ecx+4]invoke NdisResetEvent,lpSend3Event ;RING3事件复位,防止再次放行mov esi,offset szSendBuffermov ecx,dwSendSizemov eax,[ebx+60h].if ecx>[eax+4]mov ecx,[eax+4].endif.elseinvoke NdisResetEvent,lpRecv3Eventmov esi,offset szRecvBuffermov ecx,dwRecvSizemov eax,[ebx+60h].if ecx>[eax+4]mov ecx,[eax+4].endif.endifmov dword ptr [ebx+18h],0mov dword ptr [ebx+1ch],ecx ;设置ReadFile()的读取字节数rep movsb ;把数据包复制到ReadFile()提供的缓冲区invoke IoCompleteRequest,pIrp,0popadxor eax,eaxret_Read endp_Write proc DeviceObject,pIrpmov eax,pIrpmov dword ptr [eax+18h],0mov dword ptr [eax+1ch],0mov edx,[eax+4]mov ecx,[eax+60h]mov ecx,[ecx+4]mov eax,[edx+18h]mov edx,[edx+10h]add edx,eax;EDX=用户缓冲区invoke IoCompleteRequest,pIrp,0xor eax,eaxret_Write endp_mySend proc _lpAdapt,_lpPacketlocal @valocal @sizepushadmov ebx,_lpPacketmov ebx,[ebx+8]mov edi,offset szSendBuffer.repeatinvoke NdisQueryBufferSafe,ebx,addr @va,addr @size,20hmov esi,@vamov ecx,@sizerep movsbmov ebx,[ebx].until ebx==0sub edi,offset szSendBuffermov dwSendSize,edi;以上循环复制将要发送的数据包到本驱动invoke NdisSetEvent,lpSend3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile来读数据包内容(重要)popadleavejmp lpOldSend ;转到系统原来的Send例程执行ret_mySend endp_myRecv proc _lpAdapt,_lpPacketlocal @valocal @sizepushadmov ebx,_lpPacketmov ebx,[ebx+8]mov edi,offset szRecvBuffer.repeatinvoke NdisQueryBufferSafe,ebx,addr @va,addr @size,20hmov esi,@vamov ecx,@sizerep movsbmov ebx,[ebx].until ebx==0sub edi,offset szRecvBuffermov dwRecvSize,edi;以上循环复制将要接收的数据包到本驱动invoke NdisSetEvent,lpRecv3Event ;放行RING3的WaitForSingleObject(),通知RING3用ReadFile来读数据包内容(重要)popadleavejmp lpOldRecv ;转到系统原来的Recv例程执行ret_myRecv endp;以下空函数是为了填充NDIS_PROTOCOL_CHARACTERISTIC结构而设置的,实际下基本不会被系统调用,没有又不行。PtOpenAdapterComplete proc pAdapt,Status,OpenErrorStatusxor eax,eaxretPtOpenAdapterComplete endpPtCloseAdapterComplete proc pAdapt,Statusxor eax,eaxretPtCloseAdapterComplete endpPtSendComplete proc pAdapt,Packet,Statusxor eax,eaxretPtSendComplete endpPtTransferDataComplete proc pAdapt,Packet,Status,BytesTransferredxor eax,eaxretPtTransferDataComplete endpPtResetComplete proc pAdapt,Statusxor eax,eaxretPtResetComplete endpPtRequestComplete proc pAdapt,_NdisRequest,Statusxor eax,eaxretPtRequestComplete endpPtReceive proc pAdapt,MacReceiveContext,HeaderBuffer,HeaderBufferSize,LookAheadBuffer,LookAheadBufferSize,PacketSizexor eax,eaxretPtReceive endpPtReceiveComplete proc pAdaptxor eax,eaxretPtReceiveComplete endpPtStatus proc pAdapt,GeneralStatus,StatusBuffer,StatusBufferSizexor eax,eaxretPtStatus endpPtStatusComplete proc pAdaptxor eax,eaxretPtStatusComplete endpPtBindAdapter proc Status,BindContext,DeviceName,SystemSpecific1,SystemSpecific2xor eax,eaxretPtBindAdapter endpPtUnbindAdapter proc Status,pAdapt,UnbindContextxor eax,eaxretPtUnbindAdapter endpPtReceivePacket proc pAdapt,Packetxor eax,eaxretPtReceivePacket endpPtPNPHandler proc pAdapt,pNetPnPEventxor eax,eaxretPtPNPHandler endpend start

浅谈工具在手动杀毒中的运用(王斌原创!转载请注明!)

最近一段时间,各种木马,蠕虫,,流氓软件层出不穷啊……我等小菜每天被折磨的提心吊胆的,生怕一念之间电脑即刻分崩离析啊。不过还好,即使水平虽菜,对系统核心编程就算了解不够深入,无法效仿PJF等牛人写出ICEWORAD等防黑利器,不过网上高人们写好先现成的工具也是信手捻来。由于黑客知识的大众化,改特征码,加壳等免杀手法即使小菜也能融会贯通,故我对杀毒软件早已丧失信心了,只好手抄更专业的利器亲自杀毒…
在这里,我想向大家介绍一些小而精悍的软件,来弥补智能化杀毒软件在杀毒中的不足。
本文共分 剑:
分别是启动方式查杀——怎样查找病毒
进程查杀——怎样杀掉内存中的病毒
文件查杀——怎样杀掉硬盘中的病毒
独孤九剑第一式——总诀式
要想杀毒,先得查清毒的具体位置。根据病毒的厉害程度,大体可分为三种:第一种最肤浅,也最原始,仅仅利用.exe文件驻留内存;第二种比较高级点,用了DLL达到隐藏自己的目的;第三中算最牛了吧,采取驱动加载的方式,并且挂接系统服务,时刻监控木马本体,让人欲卸不能啊……
不过正所谓“独孤九剑”,即是要破尽天下各门各派病毒。剑法讲究的便是“料敌先机”四字,首先对敌方所用招式做出判断,分析,再进而破之。且本心法正如其名,越是精妙的招数(既病毒的诡计),越容易被破……说至此大概读者要起哄了,别急,下面我会解释的,呵呵。
……
独孤九剑第二式——破剑式
启动方式查杀
本式既破解天下病毒的启动方式。前面说了,病毒有三种类型,那么启动方式也有所高低精妙之别。最简单的莫过于直接放到启动文件夹里。不过这也太暴露了,故有点常识的人就会采取以下几种自启动手法:(以下为网上摘抄)
 一.自启动项目:开始---程序---启动,里面添加一些应用程序或者快捷方式.这是Windows 里面最常见,以及应用最简单的启动方式,如果想一些文件开机时候启动,那么也可以将他拖入里面或者建立快捷方式拖入里面.现在一般的病毒不会采取这样的启动手法.也有个别会.路径:C:\Documents and Settings\Owner\「开始」菜单\程序\启动二. 第二自启动项目:这个是很明显却被人们所忽略的一个,使用方法和第一自启动目录是完全一样的, 只要找到该目录,将所需要启动的文件拖放进去就可以达到启动的目的.路径:C:\Documents and Settings\User\「开始」菜单\程序\启动三. 系统配置文件启动:对于系统配置文件,许多人一定很陌生,许多病毒都是以这种方式启动.1)WIN.INI启动:启动位置(xxx.exe为要启动的文件名称):[windows] load=xxx.exe[这种方法文件会在后台运行]run=xxx.exe[这种方法文件会在默认状态下被运行]2)SYSTEM.INI启动:启动位置(xxx.exe为要启动的文件名称): 默认为:[boot] Shell=Explorer.exe [Explorer.exe是Windows程序管理器或者Windows资源管理器,属于正常]可启动文件后为:[boot] Shell= Explorer.exe xxx.exe [现在许多病毒会采用此启动方式,随着Explorer启动, 隐蔽性很好]注意: SYSTEM.INI和WIN.INI文件不同,SYSTEM.INI的启动只能启动一个指定文件,不要把Shell=Explorer.exe xxx.exe换为Shell=xxx.exe,这样会使Windows瘫痪!3) WININIT.INI启动:WinInit即为Windows Setup Initialization Utility, 中文:Windows安装初始化工具.它会在系统装载Windows之前让系统执行一些命令,包括复制,删除,重命名等,以完成更新文件的目的.文件格式: [rename] xxx1=xxx2 意思是把xxx2文件复制为文件名为xxx1的文件,相当于覆盖xxx1文件如果要把某文件删除,则可以用以下命令:[rename] nul=xxx2以上文件名都必须包含完整路径.4) WINSTART.BAT启动: 这是系统启动的批处理文件,主要用来复制和删除文件.如一些软件卸载后会剩余一些残留物在系统,这时它的作用就来了.如: “@if exist C:\WINDOWS\TEMPxxxx.BAT call C:\WINDOWS\TEMPxxxx.BAT”这里是执行xxxx.BAT文件的意思5) USERINIT.INI启动[2/2补充]:这种启动方式也会被一些病毒作为启动方式,与SYSTEM.INI相同.6) AUTOEXEC.BAT启动:这个是常用的启动方式.病毒会通过它来做一些动作. 在AUTOEXEC.BAT文件中会包含有恶意代码。如format c: /y 等等其它.四. 注册表启动:通过注册表来启动,是WINDOWS中使用最频繁的一种.----------------------------------------------------------------------------------------------------------------- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HKEY_LOCAL_MACHINE\System\ControlSet001\Session Manager\BootExecuteHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\BootExecuteHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\本地User\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RunHKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLsHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\NotifyHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceExHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup\HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Run\HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\RunOnce\HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\HKEY_CURRENT_USER\Control Panel\DesktopHKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session ManagerHKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\UserinitHKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\runHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\loadHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\run\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\run\HKLM\SOFTWARE\Classes\Protocols\FilterHKLM\SOFTWARE\Classes\Protocols\HandlerHKLM\SOFTWARE\Microsoft\Active Setup\Installed ComponentsHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SharedTaskSchedulerHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoadHKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooksHKLM\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\ApprovedHKLM\Software\Classes\Folder\Shellex\ColumnHandlersHKCU\Software\Microsoft\Internet Explorer\UrlSearchHooksHKLM\Software\Microsoft\Internet Explorer\ToolbarHKLM\Software\Microsoft\Internet Explorer\ExtensionsHKLM\System\CurrentControlSet\Control\Session Manager\BootExecuteHKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution OptionsHKLM\System\CurrentControlSet\Control\Session Manager\KnownDllsHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\UIHostHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\NotifyHKCU\Control Panel\Desktop\Scrnsave.exeHKLM\System\CurrentControlSet\Services\WinSock\Parameters\Protocol_Catalog9HKLM\SYSTEM\CurrentControlSet\Control\Print\MonitorsHKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication PackagesHKLM\SYSTEM\CurrentControlSet\Control\Lsa\Notification PackagesHKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages五.其他启动方式:(1).C:\Explorer.exe启动方式:这种启动方式很少人知道.在Win9X下,由于SYSTEM.INI只指定了Windows的外壳文件Explorer.exe的名称,而并没有指定绝对路径,所以Win9X会搜索Explorer.exe文件.搜索顺序如下: (1).搜索当前目录. (2).如果没有搜索到Explorer.exe则系统会获取 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Executive\Path]的信息获得相对路径.(3).如果还是没有文件系统则会获取[HKEY_CURRENT_USER\Environment\Path]的信息获得相对路径.[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Executive\Path]和[HKEY_CURRENT_USER\Environment\Path]所保存的相对路径的键值为:“%SystemRoot%System32;%SystemRoot%”和空.所以,由于当系统启动时,“当前目录”肯定是%SystemDrive%(系统驱动器),这样系统搜索Explorer.EXE的顺序应该是: (1).%SystemDrive%(例如C:\) (2).%SystemRoot%System32(例如C:\WINNT\SYSTEM32) (3).%SystemRoot%(例如C:\WINNT)此时,如果把一个名为Explorer.EXE的文件放到系统根目录下,这样在每次启动的时候系统就会自动先启动根目录下的Explorer.exe而不启动Windows目录下的Explorer.exe了. 在WinNT系列下,WindowsNT/Windows2000更加注意了Explorer.exe的文件名放置的位置,把系统启动时要使用的外壳文件(Explorer.exe)的名称放到了: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Shell] 而在Windows 2000 SP2中微软已经更改了这一方式.(2).屏幕保护启动方式:Windows 屏幕保护程序是一个*.scr文件,是一个可执行PE文件,如果把屏幕保护程序*.scr重命名为*.exe的文件,这个程序仍然可以正常启动,类似的*.exe文件更名为*.scr文件也仍然可以正常启动.文件路径保存在System.ini中的SCRNSAVE.EXE=的这条中.如: SCANSAVE.EXE=/%system32% xxxx.scr这种启动方式具有一定危险.(3).计划任务启动方式:Windows 的计划任务功能是指某个程序在某个特指时间启动.这种启动方式隐蔽性相当不错.[开始]---[程序]---[附件]---[系统工具]---[计划任务],按照一步步顺序操作即可.(4).AutoRun.inf的启动方式:Autorun.inf这个文件出现于光盘加载的时候,放入光盘时,光驱会根据这个文件内容来确定是否打开光盘里面的内容.Autorun.inf的内容通常是: [AUTORUN] OPEN=文件名.exe ICON=icon(图标文件).ico 1.如一个木马,为xxx.exe.那么Autorun.inf则可以如下:OPEN=Windows\xxx.exe ICON=xxx.exe 这时,每次双击C盘的时候就可以运行木马xxx.exe.2.如把Autorun.inf放入C盘根目录里,则里面内容为:OPEN=D:\xxx.exe ICON=xxx.exe 这时,双击C盘则可以运行D盘的xxx.exe(5).更改扩展名启动方式:更改扩展名:(*.exe)如:*.exe的文件可以改为:*.bat,*.scr等扩展名来启动.六.Vxd虚拟设备驱动启动方式:应用程序通过动态加载的VXD虚拟设备驱动,而去的Windows 9X系统的操控权(VXD虚拟设备驱动只适用于Windows 95/98/Me).可以用来管理例如硬件设备或者已安装软件等系统资源的32位可执行程序,使得几个应用程序可以同时使用这些资源.七.Service[服务]启动方式:[开始]---[运行]---输入"services.msc",不带引号---即可对服务项目的操作.在“服务启动方式”选项下,可以设置系统的启动方式:程序开始时自动运行,还是手动运行,或者永久停止启动,或者暂停(重新启动后依旧会启动).注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services通过服务来启动的程序,都是在后台运行,例如国产木马"灰鸽子"就是利用此启动方式来达到后台启动,窃取用户信息.八.驱动程序启动方式:有些病毒会伪装成硬件的驱动程序,从而达到启动的目的.1.系统自带的驱动程序.[指直接使用操作系统自带的标准程序来启动]2.硬件自带的驱动程序.[指使用硬件自带的标准程序来启动]3.病毒本身伪装的驱动程序.[指病毒本身伪装的标准程序来启动]06/3/11补充[来自peter_yu]:windir\Start Menu\Programs\Startup\User\Startup\All Users\Startup\windir\system\iosubsys\windir\system\vmm32\windir\Tasks\c:\explorer.exe c:\autoexec.batc:\config.syswindir\wininit.iniwindir\winstart.batwindir\win.ini - [windows] "load"windir\win.ini - [windows] "run"windir\system.ini - [boot] "shell"windir\system.ini - [boot] "scrnsave.exe"windir\dosstart.batwindir\system\autoexec.ntwindir\system\config.nt06/3/25补充[来自smzd2005]:Folder.httdesktop.iniC:\Documents and Settings\用户名\Application Data\Microsoft\Internet Explorer\Desktop.htt06/8/1补充[本人补充(注册表启动方式)]:HKLM\SYSTEM\CurrentControlSet\Control\MPRServicesHKCU\ftp\shell\open\commandHKCR\ftp\shell\open\commandHKCU\Software\Microsoft\oleHKCU\Software\Microsoft\Command ProcessorHKLM\SOFTWARE\Classes\mailto\shell\open\commandHKLM\SOFTWARE\Classes\PROTOCOLSHKCR\PROTOCOLSHKCU\Control Panel\DesktopHKLM\SOFTWARE\Policies\Microsoft\Windows\System\ScriptsHKLM\SOFTWARE\Microsoft\Code Store Database\Distribution UnitsHKLM\SYSTEM\CurrentControlSet\Services\WinSock2HKLM\SYSTEM\CurrentControlSet\Control\LsaHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\RunHKLM\SOFTWARE\Microsoft\Active Setup\Installed ComponentsHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCacheHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoadHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SharedTaskSchedulerHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooksHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell FoldersHKLM\Software\Microsoft\Windows\CurrentVersion\explorer\Shell folders\StartupHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\runServicesHKLM\Software\Microsoft\Active Setup\Installed ComponentsHKCU\Software\Microsoft\Windows NT\CurrentVersion\WindowsHKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows06/8/6补充[本人补充(注册表启动方式)]:HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution OptionsHKLM\System\CurrentControlSet\Control\Session Manager\KnownDllsHKLM\SOFTWARE\Classes\Protocols\HandlerHKLM\System\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\StartupProgramsHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell。
……
说了这么多,大家肯定不赖烦了吧,嘿嘿,下面才是本剑式的要决:autoruns光荣出场!
对我等菜鸟来说,autoruns确实是一款不可多得神兵利刃。先看下界面:
由此可见,autoruns可谓是一应俱全啊,病毒能想的启动项autoruns基本都想到了.如果病毒权限不是太高,或不厉害的那种,没时刻监视注册表,直接在autoruns里关启动项就可防范未然了。
当然既然本文是面向菜鸟的,有可能很多人甚至还看不懂那些启动项有,哪些又是病毒伪装的。这点上,autoruns就算想的周全了:对陌生启动项单击右键[图],可看到GOOGLE一项,单击,即可立即在网上查到有关的详细信息,于广大菜鸟朋友造福不浅啊……
这里有个要注意的地方:凡是autoruns认为没有经过微软数字签名的启动项,都是有问题的,大家多注意这些地方,一般都能找到病根。
另外,也有些服务是隐藏的,此时在服务栏中看到红色显示的服务项,这表示是隐藏的服务,这时,找到对应的DLL,删除
用autoruns查启动项,绝大数病毒能被查出来,此时怎么杀,就要看下面的了。
独孤九剑第三式:
第三式,
进程查杀!
这里出场的便是”超级巡警”!这款软件出道不长,不过功能可谓强大!
先看界面:

建议大家用“标准版”的,功能更强,主要是有“保险箱”,好处多多哦,一旦中了毒,首先看看“启动管理”,这里和第二剑类似,不过一些小功能可能更方便些,比如右键菜单中的“定位到文件”,一旦确认可疑,直接定位,删除!
不过这里推荐超级巡警,是另外的原因:注意看“进程管理”的黄色或红色选项,黄色代表进程被插入了可疑的DLL(动态链接库),此时就有必要怀疑其安全性了,这对于菜鸟真是福音,可能很多人到现在还分不清哪些是系统进程,哪些是非系统进程吧,即使知道是系统进程,但进程里面的DLL实在太多,记不下来,就算看到了也不知道该不该谢载吧。呵呵,现在一目了然了,在下方的模块列表中,找到黄色选项,凭经验判断是否为正常DLL,这里有个小技巧,对于你不熟悉的DLL,可以直接用右键 google搜索一下,一般就能知道答案了。其次是红色进程,这时应该严重关注了,它代表有远程线程!一般很少有程序会用远程线程,现在看到红色,岂不是标榜自己是病毒?杀而快之吧!
“超级巡警”的进程管理也十分强大!
可以看到,功能很多,值得注意的是“从内核获取进程列表”,这是杀rootkit 的好方法!有些病毒,有多进程的守护,此时选中全部的可疑进程,一起杀掉,再“打开所在文件夹”,删掉,病毒就没了。
更进一步,刚才的方法只能对付中级的—有进程在列表的病毒,或隐藏的不够深入的病毒;而先今更强的rootkit,已经能躲过目前大部分进程工具(超级巡警能否躲过未测试,但有更好的选择了)不过这一切,在冰刃里,就全然失效了!
引用冰刃的话“绝大多数所谓的进程工具都是利用Windows的Toolhlp32或psapi再或ZwQuerySystemInformation系统调用(前二者最终也用到此调用)来编写,随便一个ApiHook就可轻轻松松干掉它们”。的确,想要查杀更高级的rootkit,冰刃在好不过了。这时注意,冰刃里的红色进程,直接就是隐藏进程,无须怀疑,直接右键杀掉!
再介绍一个技巧,

总结:当感觉系统中毒时,用“超级巡警”查看可疑进程,DLL,再用冰刃查杀隐藏进程,可疑线程。

我是狂人

本人无基础,准备15看完《VC技术内幕》《MFC WINDOWS程序设计》《深入浅出MFC》!想看笑话的人越多越好!都来吧!这是最近刚看了一篇帖子,标题够狂的! 真为此人大声叫好!嘿嘿,小子够胆,敢在CSDN上如此叫唤,真狂人也!我也预效仿之:想想自己基础并不牢固,把这三本书都下载下来后,外加JAVASCRIPT高级编程,WINDOWS核心编程,想在20天左右看完!!!

又是一年春归时

曾经我想为了追求完美而且放弃生命,曾经我会因为实现梦想而放弃成长...终于有一天,我沮丧的发现,我痛苦的跌倒在黄昏的黑暗.. 玉楼深锁多情种,     
清夜悠悠谁共。     
羞见枕衾鸳凤,     
闷则和衣拥。
无端画角严城动,     
惊破一番新梦。     
窗外月华霜重,     
听彻雨花弄。烦人啊.....再填一首:我因秋风起为求人独醉西风伴春愁叶落送人归!

烦恼 伤心 成长

还有两三天就要回学校了,心里满是烦恼,伤心,但终于惊奇的发现自己一点点成长起来.心中的两种自我都觉得应该反省一下了........感性的我:当回家的喜悦不再继续,当回校的悲伤迎面而来,我只能默默的回味这短短一个月的五味感慨...这个月有件很心酸的事,玩的最好的朋友都有件很大的事情瞒着我,感觉最大的打击还是自己看人的眼光太不成熟了...其次才是被隐瞒后的无奈.但是现在更多的了解到情况后,我还是选择了宽恕与理解:即使最好的朋友,也应该有自己的事情....就在今天晚上,我们还发了短信.现在又开始意识到自己的诸多不足了.从前我就在自责,但从未像现在这么强烈.究竟为何我会如此不安全的活着...!?在这个充满黑暗的世界,我只能选择默默的积累自己的实力,但到底我怎样才能摆脱自己的束缚啊........最大的收获应该就是对自己情绪的处理与对自己思维方式的深入剖析了....理性的我:本月由于思维的本身缺陷,加上外力的打击,造成短暂的迷茫与崩溃,现已修复,并吸取更多的成长经验值.对成长的必要问题进行了有力的解析.留心观察会发现,受教育程度越深,女生越容易幼稚,这种女生的一种主要症状就是把那些包装精美、内容空洞的电影、小说里的愚蠢的行为搬到现实生活中来并称之为浪漫;另一种表现就是虚荣心极度强,渴望自己的男友是众人心中的白马王子。如果自己的男友不是,就好象是做了一件很对不起她的事一样,那么就把自己想象成白雪公主,而男友也就沦为了第八个小矮人,会被折磨的体无完肤但还感到无比幸福。试想一下很多女寝会发生这样的一幕,一个寝室的人熄灯后开始聊天,有男友的一群人的话题无非就是“我老公今天给我买了……”、“我家xxx请我吃了……”“xxx男友对xxx多么多么好。”在这样无休止,无上限的攀比之下,总有一个女生会感到自己受到了委屈,心里就会想“妈的明天一定找那个挨千刀的来补偿”……。就这样一次次的把那些脆弱的男人推入万劫不复的深渊儿却仍然感到不满足。 虽然不知道这种风气从什么时候开始的,但这几年极度蔓延,特别是在《我的野蛮女友》等弱智电影播出后,此种风气达到顶风,把大学校园搞得乌烟瘴气,放眼四周,到处都是拿着父母血汗钱干遍了电视、电影和小说里的那些蠢事的人。层次再低一点的就会干一些类似女寝门口摆堆蜡烛,光着膀子在寝室门口唱歌这种“亲者痛、仇者快”劳民伤财的可笑行当,但更可悲的是很多幼稚的女生竟然把这种可笑愚蠢的行为称作浪漫,并会为之哭泣。也正是因为有了许多这样的无知幼稚小女生,才会成全这么多脆弱的男人。 待续....

失落的心情

苦等了一个学期到了期末,终于放假了,可是却看到身边的同学一个个的 回家去了,想想自己却还要过几天才能走……寝室只剩我一个人了……真的感觉很无助,习惯的打开网站,习惯的看着资料……却没了以前的跃跃欲试的心情,难道黑客终究只能与寂寞为伍?忽然想起毛滂的惜分飞·本意:   断雨残云无意絮,      寂寞朝朝暮暮。      今夜山深处,      断魂分付潮回去似说亦有本人当前之落寂萧瑟之意啊~!(一个月前,写到此时,学校突然把我的网给断了……学校给我的惊喜真是让我“欣喜若狂”啊…………)

谁都不会疯

最近题做多了,闲着没事,看了一则小故事,挺感触的…… 有个男孩子把自己的爱情记下来,文章的名字就叫《缘分天注定》。他与一个女孩子一见钟情,却天各一方,其中实在不少各种经典的浪漫:千里送鲜花,一天十几个电话,雨中漫 步。。。。。距离给了他们最大的浪漫,终于成了他们无法逾越的障碍。男孩子不止一次说起他的不快与痛苦。终于,他发出内心的呼唤:我想有一天我真的会发疯! 这种口气让我想起一个女生,她在23岁那年爱上一个比自己大24岁的男人,那人的儿子只比她小1岁。两个人爱得不可谓不深,不可谓不真,只是,这样的感情终究是不得善终的。她黯然离开繁华的都市,捧着一盏清茶对我说:我真的怕以后会在说梦话、说胡话的时候,喊出他的名字。那样的一种语调与神情,令旁观者感慨。而5年后,她还是一脸快乐地嫁做了人妇,生活得幸福美满。无论睡梦还是高烧,她从未脱口而出过那个人的名字。用她的话说:那个曾烂熟于心的电话号码都模糊了。 大概半年后,那个说要发一次疯的男孩儿已快乐得像只熊猫:“是她帮助我从痛苦中走出来。”这个她,是他公司的一个同事。“那么缘分天注定呢?”我想。然而却后悔--人家现在兴高采烈,再想这些无用的做什么?果然,男孩子最后在文章回答:“不说这些。”呵,我笑。 这让我觉得有很多事情是应该一笑而过的。谁都不会发疯,抛下眼前的一切去寻找一个天各一方且不知道结果的人。谁都不会说胡话,揽着身边的幸福口中却喊出另一个人的名字。谁都不会天长地久地站在被伤害的地方,将自己的一生站成一座祭奠爱情的丰碑。对于爱情,男人女人都是有脚的动物--男人奔跑,女人逃离。 我们在很多时候都在高估自己的疼痛,也在高估自己对爱的忠贞。事实往往是:如果说你仍旧没有忘掉前一个,原因并不是前一个特别美好,而只是因为,后一个还没有出现! 我衷心的祝福那些有情人的同时,却在思索,你找到真正的另一半了吗?或者,还只是后一个还没有出现?