欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

PE病毒学习(三)

PE病毒学习(三)

对PE文件结构的各个值定义和作用,这里不提了,网上资源很多,百度一下就好了。所以,本章只说一下,作为代码编写者对PE文件结构操作的方法和技巧。
还是通过改进代码,来体会一下吧。
  你应该记得前面的BOOL IsPEFile(HANDLE hFIle) 这个函数吧,它的作用是判断文件是否为PE格式文件。它把文件句柄作为参数,虽然许多函数需要文件句柄这个参数,但是作为对PE文件结构操作的函数,这样做是不恰当的,因为如果这样做就要频繁的使用SetFilePointer()、ReadFile()、WriteFile()。假若以文件指针作为参数,那么这一类关于PE结构文件操作的代码,将大大简化。
举例:
BOOL IsPEFile(LPVOID ImageBase)
{
  PIMAGE_DOS_HEADER pDosHeader=NULL;
  PIMAGE_NT_HEADERS32 pNtHeaders=NULL;
//指针安全检查
  if(!ImageBase)
    return FALSE;
//dos头检查
  pDosHeader=(PIMAGE_DOS_HEADER)ImageBase;
  if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
    return FALSE;
//NT文件头检查
  pNtHeaders=(PIMAGE_NT_HEADERS32)pDosHeader->e_lfanew;
  if(pNtHeaders->Signauture!=IMAGE_NT_SIGNATURE)
    return FALSE;
  return TRUE;
}
当然为了使文件以指针传入,需要将其映射到内存中,并且由于许多函数需要文件句柄,所以原来的HANDLE OpenHostFile()需要改造。
typedef struct PEFileInformation//用这个名字是因为将来还要添加其他成员
{
  HANDLE hFile;
  HANLDE hMap;
  LPVOID ImageBase;
}INFORMATION_PE_FILE,*PINFORMATION_PE_FILE;
PINFORMATION_PE_FILE OpenHostFile(PINFORMATION_PE_FILE pFile,\
                                                              const WIN32_FIND_DATA *pHost,\
                                                              DWORD *nCount)
{
  pFile.hFile=CreateFile(pHost->cFileName,
       GENERIC_READ|GENERIC_WRITE,
       FILE_SHARE_READ|FILE_SHARE_WRITE,
       0,
       OPEN_EXISTING,
       NULL,
       NULL);
 if(pFile.hFile!=INVALID_HANDLE_VALUE)
 {
   pFile.hMap=CreateFileMapping(pFile.hFile,NULL,PAGE_READONLY,0,0,NULL);
   pFile.ImageBase=MapViewOfFile(pFile.hMap,FILE_MAP_WRITE |FILE_MAP_READ,\
                                                       0,0,0,0);
   if(pFile.ImageBase!=NULL)
     (*nCount)++;
   else
     return NULL;
 }
else
   return NULL;
 return pFile;
}
OK,估计真正你已经了解PE文件结构操作的方法,即以DOS头为起点,逐步通过指针偏移,扫描PE结构,以下是一些获取常用PE结构参考代码
//获取NT文件头
PIMAGE_NT_HEADERS32 GetNtHeaders(LPVOID ImageBase)
{
  PIMAGE_DOS_HEADER pDosHeader=NULL;
  PIMAGE_NT_HEADERS32 pNtHeaders=NULL;
  if(!ImageBase)
    return NULL;
  
  pDosHeader=(PIMAGE_DOS_HEADER)ImageBase;
  pNtHeaders=(PIMAGE_NT_HEADERS32)pDosHeader->e_lfanew;
  return  pNtHeaders;
}
//获取PE可选文件头
PIMAGE_OPTIONAL_HEADER GetOptionalHeader(LPVOID ImageBase)
{
  PIMAGE_NT_HEADERS32 pNtHeaders=NULL;
  pNtHeaders=GetNtHeaders(ImageBase);
  if(!pNtHeader)
     return NULL;
  else
     return &pNtHeaders->Header;
}
//获得区块表指针
PIMAGE_SECTION_HEADER GetSectionHeader(LPVOID ImageBase)
{
  return (PIMAGE_SECTION_HEADER)(GetOptionalHeader(ImageBase)+sizeof(IMAGE_OPTIONAL_HEADER));
}
PE结构上还要许多重要的位置,用的时候以上面的函数为基点,编写自己的函数吧

本文来自CSDN博客,转载请标明http://blog.csdn.net/yangbostar/archive/2010/10/06/5924323.aspx

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功