欢迎来到天天文库
浏览记录
ID:6041767
大小:42.67 KB
页数:10页
时间:2017-12-31
《恶意代码文件感染和内存驻留》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、内部公开InternalUseOnly▲恶意代码文件感染和内存驻留这次,作者将和大家一起讨论病毒的感染技术。另外,从本文开始,我们将陆续接触到一些病毒的高级编码技术。例如,内存驻留、EPO(入口点模糊)技术、加密技术、多态和变形等。通过这些高级技巧,你将进一步感受到病毒技术的精华,从而更好的享受其中精妙的思想与编程技艺。 在解决了起始目录的问题之后,就可以从这些起始目录开始使用FindFirstFile和FindNextFile开始遍历其下以及其子目录下的所有文件和目录了,遍历方法可采用深度优先或广度优先
2、搜索算法,较常用的还是深度优先算法。具体实现方式可采用递归搜索或非递归搜索两种实现方式。递归搜索需要占用栈空间,有可能造成栈空间耗竭而产生异常,不过在现实应用中这种情况很少出现,而非递归搜索则不存在此问题,但代码实现略复杂。在现实应用中,应用最多的还是递归遍历搜索。搜索时,可指定FindFirstFile的第一形参为*.*以搜索所有文件,根据搜索结果WIN32_FIND_DATA结构的dwFileAttributes成员判断是否为目录,若为目录则需要继续遍历该子目录,根据WIN32_FIND_DATA的cF
3、ileName中的文件名成员判断是否具有要感染的文件后缀以采取修改感染动作,以下代码实现了递归搜索某个目录及其下所有子目录的功能:voidenum_path(char*cpath){ WIN32_FIND_DATAwfd; HANDLEhfd; charcdir[MAX_PATH]; charsubdir[MAX_PATH]; intr; GetCurrentDirectory(MAX_PATH,cdir); SetCurrentDirectory(cpath); hfd=FindFirstFile("*.
4、*",&wfd); if(hfd!=INVALID_HANDLE_VALUE){ do{ if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) { if(wfd.cFileName[0]!='.'){ //合成完整路径名 sprintf(subdir,"%s\%s",cpath,wfd.cFileName); //递归枚举子目录 enum_path(subdir); } }else{ prin
5、tf("%s\%s",cpath,wfd.cFileName);第10页<以上所有信息均为中兴通讯股份有限公司所有,不得外传>AllRightsreserved,NoSpreadingabroadwithoutPermissionofZTE内部公开InternalUseOnly▲ //病毒可根据后缀名判断是 //否要感染相应的文件 } }while(r=FindNextFile(hfd,&wfd),r!=0); } SetCurrentDirectory(cdir); }
6、短短20多行C代码就实现了文件遍历的功能,Win32API的强大功能不仅为开发者提供了便利,同时也为病毒敞开了方便之门。用汇编实现则稍微复杂一些,感兴趣的读者可参阅Elkern中的enum_path部分,原理是一样的,限于篇幅这里不再给出相应的汇编代码。 非递归搜索不使用堆栈存储相关的信息,而使用显式分配的链表或栈等结构存储相关的信息,应用一个迭代循环完成递归遍历同样的功能,下面是使用链表以栈方式处理子目录列表的一个简单实现:voidnr_enum_path(char*cpath){ listdir_li
7、st; stringcdir,subdir; WIN32_FIND_DATAwfd; HANDLEhfd; intr; dir_list.push_back(string(cpath)); while(dir_list.size()){ cdir=dir_list.back(); dir_list.pop_back(); SetCurrentDirectory(cdir.c_str()); hfd=FindFirstFile("*.*",&wfd); if(hfd!=INVALID_HANDLE_
8、VALUE){ do{ if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY){ if(wfd.cFileName[0]!='.'){ //合成完整路径名 subdir=cdir+"\"+wfd.cFileName; cout<<"pushsubdir:"<
此文档下载收益归作者所有