📄 unit1.pas
字号:
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 + -