为了顺应当前形势和更好的发展,黑基网已于9月19日正式更名为【安基网】,域名更换为www.safebase.cn,请卸载旧的APP并安装新的APP,给您带来不便,敬请理解!谢谢

黑基Web安全攻防班
安基网 首页 IT技术 安全攻防 查看内容

特征码定位器编写实战

2009-11-3 16:12| 投稿: security

摘要: 特征码定位的主要思想就是把文件先分成几个大段,每段生成一个文件,将段内所有字节替换成00h,然后查杀,留下的文件使我们知道特征码的范围,接下来用更小的单位替换,逐渐缩小范围,直到得到特征码。具体的方法...
特征码定位的主要思想就是把文件先分成几个大段,每段生成一个文件,将段内所有字节替换成00h,然后查杀,留下的文件使我们知道特征码的范围,接下来用更小的单位替换,逐渐缩小范围,直到得到特征码。具体的方法每期黑防都会有文章介绍,我就不多说了,免得蝴蝶MM生气,要砍偶。先来分析一下功能需求:1. 把样本文件复制并已逐渐缩小的快改写;2. 等待杀毒软件查杀;3. 查找剩下的文件(没被杀意味着特征码在这个分段中);4. 输出结果。蝴蝶:编程之前应先分析所写程序的功能需求,列出来,这样编程的时候有一个明确的目标,是一个良好的习惯。接下来,画一个流程图以助于我们后面的工作:   下面要开始编程了,为了让新手也能看懂,我在代码后加了详细注释。打开C++新建一个空的工程(不支持MFC)。首先定义一些全局变量:long * resize=(long *)malloc(sizeof(long)*5); //分段单位数组char * path="F:\\out\\"; //输出目录int mytime=7000; //等待时间unsigned int renum=5; //分段单位数组长度 char * myfile="D:\\muma.exe"; //样本文件long low=0; //替换范围下限long high; //替换范围上限char * find; 然后来看看主程序。基本是按照上面的流程写的,没有什么难点。int main(int argc,char *argv[]){cmdhelp(argc,argv);OFSTRUCT openbuf;HANDLE hfile=(HANDLE)OpenFile(myfile,&openbuf,OF_READ); if(hfile==(HANDLE)HFILE_ERROR){printf("open file error\n"); exit(0);}high=GetFileSize(hfile,NULL); //打开文件并得到文件大小CloseHandle(hfile);printf("The sizeof muma.exe is %d\n",high);for(int i=0;i<renum;i++) //主替换循环,循环替换逐渐缩小范围{refile(resize[i]); //以当前分段单位调用分段替换函数char go[10];while(strcmp(go,"go")!=0) //替换后等待输入"go"继续{scanf("%s",&go);}go[0]='\o'; //清空,以便下次操作 WIN32_FIND_DATA FindFileData; //查找留下的文件HANDLE hFind;hFind = FindFirstFile(find, &FindFileData);if (hFind == INVALID_HANDLE_VALUE) {printf ("没有文件 %d\n", GetLastError ()); //找不到文件的处理return -1;} else {BYTE byte=0;char*del=(char )malloc(sizeof(char)*(strlen(path)+strlen(FindFileData.cFileName)+3)); //补全路径并删除文件strcpy(del,path);strcat(del,FindFileData.cFileName);long a=DeleteFile(del);char * p= strstr(FindFileData.cFileName,"-"); //从文件读取分段范围*p=(char)byte;p++;low=atoi(FindFileData.cFileName);high=atoi(p);delfiles(hFind);//调用清理函数FindClose(hFind);}}printf("特征码范围是:%d-%d\n",low,high);//输出结果printf("bye-bye\n");return 0;}有了骨架,接下来我们写核心分段替换函数:void refile(long resize){int i=0;char * fname;char * buf;long move;long end;int begin;OFSTRUCT openbuf;DWORD writed;long bufnum; while(low+i*resize<high) //low+i*resize:以修改的文件分段大小{i++; //以修改的分段数if(low+i*resize-1<high){end=(long)low+i*resize-1;}else{end=high; }fname=(char *)malloc(sizeof(char)*(strlen(path)+10*2+10));begin=i;wsprintf(fname,"%s%d-%d.exe",path,low+(i-1)*resize,end); //目标文件名i=begin; //这里i会被清零,纳闷中...bool copy=CopyFile(myfile,fname,false);//copy到输出目录if(copy==0){printf("不能copy文件\n");//错误处理exit(0);}move=low+resize*(i-1);//当前分段开始地址HANDLE hfile=(HANDLE)OpenFile(fname,&openbuf,OF_WRITE);SetFilePointer(hfile,move,NULL,FILE_BEGIN); buf=(char *)malloc(sizeof(char)*resize);//分配缓冲 for(int j=0;j<resize;j++);{buf[j]='\o';//填充缓冲区}WriteFile(hfile,buf,resize,&writed,NULL);//修改文件CloseHandle(hfile);*fname='\x00';}return;}接下来是清理函数:void delfiles(HANDLE hFind){long i=0;WIN32_FIND_DATA * myfind=new WIN32_FIND_DATA;BYTE byte=0;char * p; while(true){FindNextFile(hFind,myfind);if(atoi(myfind->cFileName)==high+1)//如果是连续分段则将其合并{p=strstr(myfind->cFileName,"-");p++;high=atoi(p);}if(GetLastError()==ERROR_NO_MORE_FILES) break;//枚举结束,跳出char * del=(char *)malloc(sizeof(char)*(strlen(path)+strlen(myfind->cFileName)+3));strcpy(del,path);strcat(del,myfind->cFileName);DeleteFile(del);//补全路径并删除文件}return;}还有一个命令行参数处理函数大家可以在光盘中找到,我就不用它来骗取n元/千字的稿费了。是不是很简单呢?二百多行代码就拥有了自己的特征码定位器。“刀”磨快了,现在我们来测试一下,GO!测试的对象就选Zxshell吧,这可是匹好马。首先得脱壳,这个很简单:Upx.exe –d zxshell.dll一次搞定。OK,脱壳完毕,先建一个空目录用于输出(一定要空的,不然要出错),执行:ccl.exe –d D:\out\ –f C:\zxshell.dll其它参数保持默认就行,这时会在d:\out\里出现几个文件,其中第一个文件(0-***.exe)要删掉,因为卡巴司机对文件头被改的文件是不检察的,然后查杀。查杀后还剩一个,回到dos输入“go”继续,这样最后确定特征码在15713-15718里(注意程序输出的是十进制),这里的代码是:Jmp 71003d89Cmp esi ,00000001Je 71003d6d也许你会以为语句调换是没戏了,只好用跳转,但如果你往下看两行:Cmp esi,00000002Jne 71003d8f经过偶跟踪代码,发现与前两行没有冲突,这样把“83fe01740583fe027522”改成“83fe02752283fe017405”就可以了。在改特征码的时候,不要只看特征码区域内,看看前后几行,也许你会有新的收获。 这篇文章完全是一个菜鸟普及型的程序,所以一些智能的判断和高级功能我没有写出来,大家可以自己添加功能,如果写出了好的代码不要忘了Mail给我一份哦。这个程序没有什么高深的技术,如果你有什么不懂的,在MSDN上都可以查到(还可以顺便练练E文,免得被老妈呵斥玩电脑没用,呵呵),我的QQ:317397117,有什么不懂得可以问我,有批评指教的当然也欢迎。

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部