Virus计算机病毒与防治重庆电子工程职业学院计算机病毒与防治课程小组教学单元3-5木马病毒防治木马自启动原理木马的植入技术木马自启动实现第二讲木马的植入、自启动和隐藏计算机病毒与防治课程小组木马隐藏手段木马隐藏实现木马入侵木马的传播途径有很多种,其中最简单的是直接将木马的服务器端程序拷贝到U盘上。通过电子邮件传播是一种最简单有效的方法,黑客通常给用户发电子邮件,而这个加在附件中的软件就是木马的服务器端程序。缓冲区溢出攻击是植入木马最常用的手段。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。计算机病毒与防治课程小组木马植入技术计算机病毒与防治课程小组木马入侵缓冲区溢出((BufferOverflow)指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:voidfunction(char*str){charbuffer[16];strcpy(buffer,str);}通过缓冲区溢出植入木马木马入侵计算机病毒与防治课程小组上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintt(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。当然,随便往缓冲区中填东西造成它溢出一般只会出现Segmentationfault错误,而不能达到攻击的目的。如果在溢出的缓冲区中写入我们想执行的代码,再覆盖函数返回地址的内容,使它指向缓冲区的开头,就可以达到运行其它指令的目的。通过缓冲区溢出植入木马木马自启动途径计算机病毒与防治课程小组1.利用INI文件实现相关程序的自动启动win.ini是系统保存在[Windir]目录下的一个系统初始化文件。系统在起动时会检索该文件中的相关项,以便对系统环境的初始设置。在该文件中的“[windows]”数据段中,有两个数据项“load=”和“run=”。它们的作用就是在系统起动之后自动地装入和运行相关的程序。Win.ini:System.ini:[windows][boot]Shell=Explorer.exeload=file.exeShell=Explorer.exerun=file.exe程序自动启动的原理计算机病毒与防治课程小组木马自启动途径2.利用注册表实现相关程序的自动启动系统注册表保存着系统的软件、硬件及其他与系统配置有关的重要信息,注册表中的[HKEY_LOCAL_MACHINE\Software\MicrosoftWindows\CurrentVersion]项会影响系统起动过程执行程序,可以向该项添加一个子项,自动启动程序的设置具体可以通过更改以下键值来实现:[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices][HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce][HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run][HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce][HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run][HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce][HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices]木马自启动途径计算机病毒与防治课程小组3加入系统启动组在启动文件夹[Windir]\startmenu\programs\startup\中添加程序或快捷方式,也可修改册表的位置:[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ShellFoldersStartup]=windows\startmenu\programs\startup木马自启动途径计算机病毒与防治课程小组4利用系统启动配置文件[Windir]\winstartbat;看似平常,但每次重新启动都会自动运行。[Windir]\wininit.ini:一旦运行就被windows删除,安装的setup程序常用,例如:[Rename]NUL=c:\windows\picture.exe将c:\windows\picture.exe设置为NUL表示删除它,删除动作会被完全隐蔽的执行。Autoexec.bat和Config.sys在DOS下每次启动都会自动执行。木马的自启动途径计算机病毒与防治课程小组5和其他程序捆绑执行可以使用可执行程序捆绑工具将木马程序与系统中的合法程序合并,也可以利用合法程序的特殊配置功能实现自动执行。例如:[HKEY_CURRENT_USER\Software\Mirabilisll\CQ\Agent\Apps\test]Path=test.exeStartup=c:\\testEnable=Yes还有一些系统配置修改后并不能直接实现自启动,却能给木马的自启动带来便利,对此也应加以防范。例如:[HKEY_LOCAL_MACHINE\Software\CLASSES\ShellScrap]@=ScrapobjectNeverShowExt=NeverShowExt键可以隐藏SHS文件的扩展名.shs。比如将一个文件改名为“abc.jpg.shs“它只会显示”abc.jpg”。如果你的注册表里有很多NeverShowExt键值,应予以删除。程序自启动的实现计算机病毒与防治课程小组下面我们利用VisualC++6.0编程来实现第二种方法的程序自动启动。相应的程序代码如下:voidCAutobootDIg::OnOKQ{CStringtemp;TCHARTempPath[MAX_PATH];//确定Windows的系统目录进行相应的转换,使之能与函数参数搭配计算机病毒与防治课程小组程序自动启动的实现::GetSystemDirectory(TempPath,MAX_PATH)Temp=TempPath;temp=temp+_(\\Intranet.exe);intlen=temp.GetLength();LPBYTElpb=newBYTE[len];for(intj=0;jlen;j++){lpb[j]=temp[j];)lpb[j]=0;//把本程序拷贝到系统目录下,并改名为Intranet.exe,这样做的目的//是为了迷惑被控制端用户,使之不易觉察到究竟哪个程序是控制程序程序自启动的实现CopyFile(autoboot.exe,temp,FALSE);HKEYhKey;LPCTSTRdata_Set=Software\\Microsoft\\Windows\\CurrentVerslon\\Run;longret()=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_WRITE,&hKey);longret1=::RegSetValueEx(hKey,_Tremotecontrol,NULL,REGes_SZ,lpb,len);::RegCIoseKey(hKey);//设置注册表中相关的路径//打开注册表中的相应项//将相关的信息写入注册表//关闭注册表中的相应的项木马进程的隐藏计算机病毒与防治课程小组如果在文件管理器中不能正确地列出木马的可执行文件,无疑会增加木马程序的隐蔽性。可以将木马与其它常用的软件捆绑,在运行该软件的时候先启动木马功能再调用程序的正常功能。下面介绍使用进程动态注入技术来实现进程的隐藏。我们把在操作系统中正在运行的程序的实例叫做进程。进程包括两个主要的组成部分:(1)内核对象:操作系统用内核对象来管理进程,同时内核对象也是系统存放关于进程的统计信息的地方;(2)地址空间:其中包含所有可执行模块或DLL模块的代码和数据,还包括诸如线程堆栈和堆分配空间等用作动态内存分配的空间。木马进程的隐藏访问令牌进程对象对象句柄表项1对象句柄表项2……对象对象线程1线程2……线程nVADVADVADWindows2000的进程结构示意图计算机病毒与防治课程小组计算机病毒与防治课程小组WIN2K中“进程隐藏”的实现按照上述思路实现“进程隐藏”要将程序分为两部分,第一部分是程序的主体部分放到DLL中,第二部分启动代码负责将第一部分的程序插入到目标进程中并调用之。(1)程序的主体DLL:在我们的示例中仅在DLL中弹出一对话框,显示进程的IDBOOLAPIENTRYDIIMa1n(HANDLEModule,DWORDul_reasones_for_call,LPVOIDiPReserved){swltch(ul_reaaon_for_call){caseDLL_PROCESS_ATTACH:swprinft(szProcessld,TEXT(%1u),GetCurrentProcessld());MessageBox(NULL,szProcessld,TEXT(RemoteDLL),MB_OK);}returnTRUE;}WIN2K中“进程隐藏”的实现计算机病毒与防治课程小组HANDLEhRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemotProcsssid);IntICb=(t+lstr1enW((unsignedshort*)pszLlbFileName))*slzoof(WCHAR);LPVOIDpszLlbFileRemote=(PWSTR)VlrtualAllocEx(hRemoteProcesa,NULL,iCb,MEM_COMMIT,PAGE_READWRTE);//打开目标进程,dwRemoteProessid为目标进程的ID//计其DLL路径名需要的内存空间//使用VirtualAllocEx函数在目标进程的内存地址空间分配DLL文件名级冲区WIN2K中“进程隐藏”的实现HANDLEhRemotsThread=CreateRemotoThroad(hRomoteProcess,NULL,0,pfnStartAddr,pazlbFlieRemote,0,NULL);计算机病毒与防治课程小组BOOLlRetunCode=WriteProcessMemory(hRemoteProcess,pszt_lbFlleRemote,(PVOID)pazlbFileName,ICb,NULL);PTHREAD_START_ROUTINEptnStartAddr=GetProcAddress(GetModulaHandle(TEXT(Kerne132)),LoadLibraryW);//使用WriteProcessMemory函数将DLL路径名复制到远程进程的内存空间//计算LoedLibraryW的入口地址//启动目标线程LoadLibraryW,通过远程线程调用用户的DLL文件WIN2K中“进程隐藏”的实现使用以上代码可以方便地将程序注入到远程进程的空间中作为目标进程的一个线程来运行。如果我们把程序注入到Windows的文件管理器Explorer.exe的空间中运行,在