⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 知道大家有没有用过PEDUMP
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  Edit_Section[4].Text:=AddValue(8,info5);
  Edit_Section[4].Hint:='以文件开始为基准的偏移值';
  Edit_Section[5].Text:=AddValue(8,info6);
  Edit_Section[5].Hint:='在OBJ中,用来指向Section的重定位信息'+#13
                       +'在EXE中,此位没有实际意义,总为0 ';
  Edit_Section[6].Text:=AddValue(8,info7);
  Edit_Section[6].Hint:='以文件开始为基准的行号表偏移值';
  Edit_Section[7].Text:=AddValue(4,info8);
  Edit_Section[7].Hint:='文件重定位表格中的重定位项目个数(只对 OBJ 有效)';
  Edit_Section[8].Text:=AddValue(4,info9);
  Edit_Section[8].Hint:='行号表格中的行号个数 ';
  Edit_Section[9].Text:=AddValue(8,info10);
  Edit_Section[9].Hint:='表示Section的属性,也就是常说的Flags';

  cb_Section[0].Caption:='CNT_CODE              ';
  cb_Section[0].Hint:='$00000020(含代码)';
  cb_Section[0].Checked:=BeTrue(IMAGE_SCN_CNT_CODE);
  cb_Section[1].Caption:='CNT_INITIALIZED_DATA  ';
  cb_Section[1].Hint:='$00000040(含初始数据)';
  cb_Section[1].Checked:=BeTrue(IMAGE_SCN_CNT_INITIALIZED_DATA);
  cb_Section[2].Caption:='CNT_UNINITIALIZED_DATA';
  cb_Section[2].Hint:='$00000080(含未初始数据)';
  cb_Section[2].Checked:=BeTrue(IMAGE_SCN_CNT_UNINITIALIZED_DATA);
  cb_Section[3].Caption:='LNK_INFO              ';
  cb_Section[3].Hint:='$00000200(含文字说明或其他信息)';
  cb_Section[3].Checked:=BeTrue(IMAGE_SCN_LNK_INFO);
  cb_Section[4].Caption:='LNK_REMOVE            ';
  cb_Section[4].Hint:='$00000800(此节不被放入最终EXE文件中)';
  cb_Section[4].Checked:=BeTrue(IMAGE_SCN_LNK_REMOVE);
  cb_Section[5].Caption:='LNK_COMDAT            ';
  cb_Section[5].Hint:='$00001000(含COMDAT)';
  cb_Section[5].Checked:=BeTrue(IMAGE_SCN_LNK_COMDAT);
  cb_Section[6].Caption:='LNK_NRELOC_OVFL       ';
  cb_Section[6].Hint:='$01000000(含扩展重定位信息)';
  cb_Section[6].Checked:=BeTrue(IMAGE_SCN_LNK_NRELOC_OVFL);
  cb_Section[7].Caption:='MEM_DISCARDABLE       ';
  cb_Section[7].Hint:='$02000000(可丢弃)';
  cb_Section[7].Checked:=BeTrue(IMAGE_SCN_MEM_DISCARDABLE);
  cb_Section[8].Caption:='MEM_NOT_CACHED        ';
  cb_Section[8].Hint:='$04000000(不可隐藏)';
  cb_Section[8].Checked:=BeTrue(IMAGE_SCN_MEM_NOT_CACHED);
  cb_Section[9].Caption:='MEM_NOT_PAGED         ';
  cb_Section[9].Hint:='$08000000(不可分页)';
  cb_Section[9].Checked:=BeTrue(IMAGE_SCN_MEM_NOT_PAGED);
  cb_Section[10].Caption:='MEM_SHARED           ';
  cb_Section[10].Hint:='$10000000(可共享)';
  cb_Section[10].Checked:=BeTrue(IMAGE_SCN_MEM_SHARED);
  cb_Section[11].Caption:='MEM_EXECUTE          ';
  cb_Section[11].Hint:='$20000000(可执行)';
  cb_Section[11].Checked:=BeTrue(IMAGE_SCN_MEM_EXECUTE);
  cb_Section[12].Caption:='MEM_READ             ';
  cb_Section[12].Hint:='$40000000(可读)';
  cb_Section[12].Checked:=BeTrue(IMAGE_SCN_MEM_READ);
  cb_Section[13].Caption:='MEM_WRITE            ';
  cb_Section[13].Hint:='$80000000(可写)';
  cb_Section[13].Checked:=BeTrue(IMAGE_SCN_MEM_WRITE);
end;

function WideCharToStr(WStr:PWChar;Len:Integer):String;
begin
  if Len=0 then Len:=-1;
  Len:=WideCharToMultiByte(CP_ACP,0,WStr,Len,nil,0,nil,nil);
  SetLength(Result,Len);
  WideCharToMultiByte(CP_ACP,0,WStr,Len,PChar(Result),Len,nil,nil);
end;

procedure TForm1.DoPEDump(FileName:String);
var
  iFile,iNum,jNum,i,j:Integer;
  TmpPos:LongInt;    { 文件临时位置 }
  TmpStr:String;     { 临时字符串 }
  TmpStep:Integer;   { 临时步长 }

  PEDosHead:TImageDosHeader;    
  PENTHead:TImageNtHeaders;
  PESectionHead:array of TImageSectionHeader;  { size of TIm..der is $28 }

  Have_PEResourceDirectory:Boolean;            { 是否有资源目录 }
  PEResourceDirectoryPointerToRawData:Cardinal;{ 资源目录物理地址 }
  PEResourceDirectoryVirtualAddress:Cardinal;  { 资源相对实际地址 }
  tn_ResDir1,tn_ResDir2,tn_ResDir3:TTreeNode;

  PEResourceDirectory:TImageResourceDirectory;

  PEResourceDirStringU:TImageResourceDirStringU;
  ResWName:array[0..MAX_PATH] of WChar;
  ResSName:WideString;             { PEResourceDirStringU.Name for String }
  iName:Integer;
  PEResDataEnt:TImageResourceDataEntry;

  ResDir_1:array of TImageResourceDirectory;
  ResDir_2:TImageResourceDirectory;
  ResdirEnt_1,ResdirEnt_2:array of TImageResourceDirectoryEntry;
  ResdirEnt_3:TImageResourceDirectoryEntry;
begin
  iFile:=FileOpen(FileName,fmOpenRead or fmShareDenyNone);
  try
    StatusBar1.Panels[1].Text:=Format('%u字节',[FileSeek(iFile,0,2)]);
    StatusBar1.Panels[2].Text:=DateTimeToStr(FileDateToDateTime(FileGetDate(iFile)));

    FileSeek(iFile,0,soFromBeginning);
    FileRead(iFile,PEDosHead,SizeOf(PEDosHead));
    FileSeek(iFile,PEDosHead._lfanew,soFromBeginning);
    { work like FileSeek(iFile,$003c,soFromBeginning); }
    FileRead(iFile,PENTHead,SizeOf(PENTHead));

    { begin to get PESectionHeads }
//      FileSeek(iFile,PEDosHead._lfanew+SizeOf(PENTHead),soFromBeginning);
    SetLength(PESectionhead,PENTHead.FileHeader.NumberOfSections);
    for i:=0 to PENTHead.FileHeader.NumberOfSections-1 do
      FileRead(iFile,PESectionHead[i],SizeOf(PESectionHead[i]));
  finally
    FileClose(iFile);
  end;
  { end read first head }

  { check file real-type }
  if (PENTHead.Signature<>IMAGE_NT_SIGNATURE)
    and (PENTHead.Signature<>IMAGE_OS2_SIGNATURE)
    and (PENTHead.Signature<>IMAGE_VXD_SIGNATURE) then
  begin
    MessageBox(Handle,PChar(Format('所选文件[%s]不是标准PE文件格式',[FileName])),'错误',MB_OK);
    Exit;
  end;

  { begin filehead }
  Caption:=Format('$s [正在分析文件头...]',[Application.Title]);
  { _lfanew }
  Edit_1.Text:=AddValue(4,PEDosHead._lfanew);
  Edit_1.Hint:='DOS文件头新指向NT文件头';

  { SizeOfOptionalHeader }
  Edit_2.Text:=AddValue(4,PENTHead.FileHeader.SizeOfOptionalHeader);
  Edit_2.Hint:='在OBJs中,该字段通常为0'+#13+'在执行文件中,是指IMAGE_OPTIONAL_HEADER结构的长度';

  { Signature }
  if PENTHead.Signature=IMAGE_NT_SIGNATURE then TmpStr:='PE\0\0' else
    if PENTHead.Signature=IMAGE_OS2_SIGNATURE then TmpStr:='NE' else
      if PENTHead.Signature=IMAGE_VXD_SIGNATURE then TmpStr:='LE' else
         TmpStr:='';
  Edit_3.Text:=AddValue(8,PENTHead.Signature);
  Edit_3.Hint:='文件格式:'+TmpStr+#13
                      +'说明:NT格式对应PE\0\0、OS2对应NE、VxD对应LE';
  { Machine }
  Edit_4.Text:=AddValue(4,PENTHead.FileHeader.Machine);
  Edit_4.Hint:=CheckFileMachine(PENTHead.FileHeader.Machine);

  { NumberOfSections }
  Edit_5.Text:=AddValue(4,PENTHead.FileHeader.NumberOfSections);
  Edit_5.Hint:=Format('EXE的OBJ中包含%u个Sections',
                              [PENTHead.FileHeader.NumberOfSections]);

  { TimeDateStamp }
  Edit_6.Text:=AddValue(8,PENTHead.FileHeader.TimeDateStamp);
  Edit_6.Hint:='文件产生时间'+#13
                          +'格式为1969年12月31日4:00P.M.后的总秒数';

  { PointerToSymbolTable }
  Edit_7.Text:=AddValue(8,PENTHead.FileHeader.PointerToSymbolTable);
  Edit_7.Hint:='COFF符号表格偏移位置'+#13
                                 +'此栏位只对COFF除错资讯有用';
  { NumberOfSymbols }
  Edit_8.Text:=AddValue(8,PENTHead.FileHeader.NumberOfSymbols);
  Edit_8.Hint:=Format('COFF符号表格中含%u个符号',
                             [PENTHead.FileHeader.NumberOfSymbols]);

  { Characteristics }
  Edit_9.Text:=AddValue(8,PENTHead.FileHeader.Characteristics);
  Edit_9.Hint:='描述此文件的性质(包含下面特性描述)';
  { DisPlay Characteristics }
  CheckFileCharacteristics(PENTHead.FileHeader.Characteristics);

  { end filehead }

  { begin optionalhead }
  Caption:=Format('%s [正在分析可选文件头...]',[Application.Title]);
  { Magic }
  Edit_10.Text:=AddValue(4,PENTHead.OptionalHeader.Magic);
  Edit_10.Hint:='$010B 表示 EXE Image '+#13
                    +'$0107 表示 ROM Image '+#13
                    +'通常总为 $010B';

  { LinkerVersion }
  Edit_11.Text:=Format('    %.*x%.*x  [%u%u]',
    [2,PENTHead.OptionalHeader.MajorLinkerVersion,
     2,PENTHead.OptionalHeader.MinorLinkerVersion,
       PENTHead.OptionalHeader.MajorLinkerVersion,
       PENTHead.OptionalHeader.MinorLinkerVersion]);
  Edit_11.Hint:=Format('产生此文件的编译器版本为%u.%u版',
                             [PENTHead.OptionalHeader.MajorLinkerVersion,
                              PENTHead.OptionalHeader.MinorLinkerVersion]);

  { OperatingSystemVersion }
  Edit_28.Text:=Format('%.*x%.*x  [%u%u]',
    [4,PENTHead.OptionalHeader.MajorOperatingSystemVersion,
     4,PENTHead.OptionalHeader.MinorOperatingSystemVersion,
       PENTHead.OptionalHeader.MajorOperatingSystemVersion,
       PENTHead.OptionalHeader.MinorOperatingSystemVersion]);
  Edit_28.Hint:=Format('运行此文件所需%u.%u版以上的系统',
                                      [PENTHead.OptionalHeader.MajorOperatingSystemVersion,
                                       PENTHead.OptionalHeader.MinorOperatingSystemVersion]);

  { ImageVersion }
  Edit_29.Text:=Format('%.*x%.*x  [%u%u]',
    [4,PENTHead.OptionalHeader.MajorImageVersion,
     4,PENTHead.OptionalHeader.MinorImageVersion,
     PENTHead.OptionalHeader.MajorImageVersion,
     PENTHead.OptionalHeader.MinorImageVersion]);
  Edit_29.Hint:=Format('自定义版本为%u.%u版',
                            [PENTHead.OptionalHeader.MajorImageVersion,
                             PENTHead.OptionalHeader.MinorImageVersion]);

  { SubsystemVersion }
  Edit_30.Text:=Format('%.*x%.*x  [%u%u]',
    [4,PENTHead.OptionalHeader.MajorSubsystemVersion,
     4,PENTHead.OptionalHeader.MinorSubsystemVersion,
       PENTHead.OptionalHeader.MajorSubsystemVersion,
       PENTHead.OptionalHeader.MinorSubsystemVersion]);
  Edit_30.Hint:=Format('运行此文件所需子系统最小版本为%u.%u版',
                                [PENTHead.OptionalHeader.MajorSubsystemVersion,
                                 PENTHead.OptionalHeader.MinorSubsystemVersion]);

  { Win32VersionValue }
  Edit_31.Text:=AddValue(8,PENTHead.OptionalHeader.Win32VersionValue);
  Edit_31.Hint:='保留未用';

  { BaseOfCode }
  Edit_23.Text:=AddValue(8,PENTHead.OptionalHeader.BaseOfCode);
  Edit_23.Hint:=Format('表示Code Section由$%.*x开始',
                          [8,PENTHead.OptionalHeader.BaseOfCode]);

  { SizeOfCode }
  Edit_24.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfCode);
  Edit_24.Hint:=Format('所有Code Sections的总和大小为%u字节',
                          [PENTHead.OptionalHeader.SizeOfCode]);

  { BaseOfData }
  Edit_25.Text:=AddValue(8,PENTHead.OptionalHeader.BaseOfData);
  Edit_25.Hint:=Format('表示Data Section由$%.*x开始',
                          [8,PENTHead.OptionalHeader.BaseOfData]);

  { SizeOfInitializedData }
  Edit_26.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfInitializedData);
  Edit_26.Hint:=Format('所有内含初始数据块大小总和为%u字节',
                                     [PENTHead.OptionalHeader.SizeOfInitializedData]);

  { SizeOfUninitializedData }
  Edit_27.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfUninitializedData);
  Edit_27.Hint:=Format('所有需要载入虚拟地址空间的数据块总和为%u字节',
                                       [PENTHead.OptionalHeader.SizeOfUninitializedData]);

  { AddressOfEntryPoint }
  Edit_12.Text:=AddValue(8,PENTHead.OptionalHeader.AddressOfEntryPoint);
  Edit_12.Hint:=Format('程序将从$%.*x开始执行',
                                   [8,PENTHead.OptionalHeader.AddressOfEntryPoint,PENTHead.OptionalHeader.AddressOfEntryPoint]);

  { ImageBase }
  Edit_13.Text:=AddValue(8,PENTHead.OptionalHeader.ImageBase);
  Edit_13.Hint:=Format('程序载入基址为$%.*x',
                         [8,PENTHead.OptionalHeader.ImageBase]);

  { SectionAlignment }
  Edit_14.Text:=AddValue(8,PENTHead.OptionalHeader.SectionAlignment);
  Edit_14.Hint:='一旦Section 被映射到内存中'+#13
                               +Format('保证每一个Section从$%.*x的倍数的虚拟地址开始',
                                       [8,PENTHead.OptionalHeader.SectionAlignment]);

  { FileAlignment }
  Edit_15.Text:=AddValue(8,PENTHead.OptionalHeader.FileAlignment);
  Edit_15.Hint:='保证组成每一个Section的原始资料(raw data)'+#13
                            +Format('是从一个以$%.*x的倍数的虚拟地址开始',
                             [8,PENTHead.OptionalHeader.FileAlignment])+#13
                            +'此值默认为$200';

  { SizeOfImage }
  Edit_16.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfImage);
  Edit_16.Hint:='从Image Base开始到最后一个Section的大小';

  { SizeOfHeaders }
  Edit_17.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfHeaders);
  Edit_17.Hint:=Format('PE表头及Section Table的大小为%u字节',
                             [PENTHead.OptionalHeader.SizeOfHeaders]);

  { CheckSum }
  Edit_18.Text:=AddValue(8,PENTHead.OptionalHeader.CheckSum);
  Edit_18.Hint:='可执行文件通常为0,其他的有自己的和校验算法';

  { Subsystem }
  case PENTHead.OptionalHeader.Subsystem of
  1: TmpStr:='不需要子系统,(例如驱动程序)';
  2: TmpStr:='在Windows GUI子系统中运行';
  3: TmpStr:='在Windows字元模式子系统中运行(也就是console应用程序)';
  5: TmpStr:='在OS/2字元模式子系统中运行(也就是OS/2 1.x应用程序)';
  7: TmpStr:='在Posix字元模式子系统中运行';
  else
    TmpStr:='';
  end;
  Edit_34.Text:=AddValue(4,PENTHead.OptionalHeader.Subsystem);
  Edit_34.Hint:=TmpStr;

  { DllCharacteristics }
  case PENTHead.OptionalHeader.DllCharacteristics of
  1: TmpStr:='当DLL被载入一个行程的地址空间时呼叫';
  2: TmpStr:='当一个行程结束时呼叫';
  3: TmpStr:='当一个行程开始时呼叫';
  4: TmpStr:='当DLL退出时呼叫';
  else
     TmpStr:='通常为0';
  end;
  Edit_35.Text:=AddValue(4,PENTHead.OptionalHeader.DllCharacteristics);
  Edit_35.Hint:=TmpStr;

  { SizeOfStackReserve }
  Edit_19.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfStackReserve);
  Edit_19.Hint:='此值预设为$00100000(1MB)';

  { SizeOfStackCommit }
  Edit_20.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfStackCommit);
  Edit_20.Hint:='此值预设为$00001000(1 page)';

  { SizeOfHeapReserve }
  Edit_21.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfHeapReserve);
  Edit_21.Hint:=Format('保留给最初的process heap的虚拟内存数量为%u字节',
                                 [PENTHead.OptionalHeader.SizeOfHeapReserve]);

  { SizeOfHeapCommit }
  Edit_22.Text:=AddValue(8,PENTHead.OptionalHeader.SizeOfHeapCommit);
  Edit_22.Hint:='此值预设为$00001000';

  { LoaderFlags }
  Edit_32.Text:=AddValue(8,PENTHead.OptionalHeader.LoaderFlags);
  Edit_32.Hint:='通常都没有设置';

  { NumberOfRvaAndSizes }
  Edit_33.Text:=AddValue(8,PENTHead.OptionalHeader.NumberOfRvaAndSizes);
  Edit_33.Hint:='通常预设为16';

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -