亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? peheader.dpr

?? delphi開發語言下的源代碼分析
?? DPR
字號:
// dcc PEHeader -uc:\ext\jedi\api
// COPY/Y C:\ext\ls\Apps\PEHeader\PEHeader.exe c:\dos\peh.exe
// PEHeader e:\delphi7\bin\delphi32.exe
// DLLTools

{$APPTYPE CONSOLE}
{$RANGECHECKS OFF}

uses
  JwaWinNT, windows, classes, SysUtils;

type
  TSectionHeaderArr = array [Word] of TImageSectionHeader;
  PSectionHeaderArr = ^TSectionHeaderArr;
  TSectionName = packed array[0..IMAGE_SIZEOF_SHORT_NAME-1] of char;

  TResourceDirectoryEntryArr = array [WORD] of TImageResourceDirectoryEntry;
  PResourceDirectoryEntryArr = ^TResourceDirectoryEntryArr;

  TFunctionRVA = array [0..0] of DWORD;

  _IMAGE_BASE_RELOCATION = record
    VirtualAddress: DWORD;
    SizeOfBlock: DWORD;
    //  WORD    TypeOffset[1];
  end;
  PImageBaseRelocation = ^_IMAGE_BASE_RELOCATION;


var
  p : PByte;
  i, tempSize : Integer;
  Str : pChar;

  pBASE, VABase, RawAddr, sRVA : DWORD;

  ThunkData : DWORD;
  isFileMap : Boolean = true;

  pNameRVA : PDWord;
  pOrdinal: PWord;
  pFunctionRVA : ^TFunctionRVA;

  pRelocItem : PWord;

const
  ResourceTypeArr : array [1..24] of String
                  = ('CURSOR',
                     'BITMAP',
                     'ICON',
                     'MENU',
                     'DIALOG',
                     'STRING',
                     'FONTDIR',
                     'FONT',
                     'ACCELERATOR',
                     'RCDATA',
                     'MESSAGETABLE',
                     'GROUP_CURSOR',
                     'Unknow',
                     'GROUP_ICON',
                     'Unknow',
                     'VERSION',
                     'DLGINCLUDE',
                     'Unknow',
                     'PLUGPLAY',
                     'VXD',
                     'ANICURSOR',
                     'ANIICON',
                     'HTML',
                     'MANIFEST');

//取資源類別, 僅對根級目錄有效                     
function GetResourceClass(NameOffset:DWORD) : String;
begin
  case NameOffset of
    low(ResourceTypeArr)..high(ResourceTypeArr) :
      Result := ResourceTypeArr[NameOffset];
  else
    Result := 'Unknow';
  end;
end;

//名字是基于節起點的偏移
function GetNameFromOffset(sRVA, BaseAddr : Integer) : String; overload;
var
  pStr : PImageResourceDirStringU;
  S : WideString;
begin
  Integer(pStr) := BaseAddr + sRVA;
  SetLength(S, pStr^.Length);
  move(pStr^.NameString, S[1], pStr^.Length*2);
  Result := S;
end;

//數據是基于節起點的RVA
function GetStringFromRVA(sRVA, BaseVA, BaseAddr : Integer) : String;
begin
  Result := GetNameFromOffset(sRVA - BaseVA, BaseAddr);
end;

//取資源名
function GetResourceName(NameOffset:DWORD; BaseVA, BaseAddr: Integer) : String;
begin
  if (NameOffset and IMAGE_RESOURCE_NAME_IS_STRING)=0 then
    Result := IntToStr(NameOffset)
  else
    Result := GetNameFromOffset(NameOffset and $7FFFFFFF, BaseAddr);
end;

// BASE = 文件映像在內存中的起始地址
// Section = [0..IMAGE_DIRECTORY_ENTRY_IAT]
// sRVA = 節的VirtualAddress(RVA)
// RawAddr = 節的物理地址(Phys Off), 相對于BASE的偏移
// 如果指定的節(Section)中的信息無效, 則返回False;
function PosToSectionEntry(BASE: Pointer; Section: SmallInt; var sRVA, RawAddr: DWORD): Boolean;
var
  p : pByte;
  i : Integer;
  Size : DWORD;
begin
  Result := False;
  RawAddr := 0;

  // 定位到PE頭, 取導入表的VirtualAddress
  p := BASE;
  inc(p, PImageDosHeader(p)^._lfanew);
  with PImageNtHeaders(p)^ do
  begin
    Size := FileHeader.NumberOfSections;
    sRVA := OptionalHeader.DataDirectory[Section].VirtualAddress;
    if sRVA = 0 then
      Exit;
  end;

  // 定位到節表數組, 取導入表的物理地址
  inc(p, PImageNtHeaders(p)^.FileHeader.SizeOfOptionalHeader-SizeOf(TImageOptionalHeader));
  inc(p, SizeOF(TImageNtHeaders));
  for i := 0 to Size - 1 do
    with PSectionHeaderArr(p)^[i] do
      // 如果虛地址相等或者sRVA落在節的內部
      if (sRVA = VirtualAddress) or
         ((sRVA > VirtualAddress) and (sRVA <= VirtualAddress + Misc.VirtualSize)) then
      begin
        RawAddr := PointerToRawData + (sRVA - VirtualAddress);
        Result := True;
        Exit;
      end;
end;

// Offset   : 結構起點的偏移
// BaseVA   : 資源節起點的相對虛地址
// BaseAddr : 資源節在內存中的起點
function EnumResources(Offset, BaseVA, BaseAddr : DWORD; ResName : String = '') : Integer;
var
  pResStart : PImageResourceDirectory;
  pEntryArr : PResourceDirectoryEntryArr;
  pData     : PImageResourceDataEntry;
  tempSize  : Integer;
  NameOrID  : String;
  isRoot    : Boolean;
  isDir     : Boolean;
  i : integer;
begin
  Integer(pResStart) := Offset + BaseAddr;
  isRoot := Offset = 0;

  // 使用id的元素 + 使用名稱的元素
  Result := pResStart^.NumberOfIdEntries + pResStart^.NumberOfNamedEntries;
  tempSize := Result;

  // 跳過目錄結構
  inc(pResStart);
  pEntryArr := Pointer(pResStart);

  for i := 0 to tempSize - 1 do
    with pEntryArr^[i] do
      if isRoot then
      begin
        writeln('-----------------------------------------');
        writeln(GetResourceClass(Name.NameOffSet));
        writeln('-----------------------------------------');
        dec(Result);
        Result := Result + EnumResources(Directory.OffsetToDirectory and $7FFFFFFF, BaseVA, BaseAddr);
      end
      else
      begin
        isDir := Directory.OffsetToData and IMAGE_RESOURCE_DATA_IS_DIRECTORY <> 0;
        NameOrID := GetResourceName(Name.NameOffSet, BaseVA, BaseAddr);

        //數據目錄
        if isDir then
        begin
          dec(Result);
          Result := Result + EnumResources(Directory.OffsetToDirectory and $7FFFFFFF, BaseVA, BaseAddr, NameOrID);
        end
        else
        begin
          if NameOrId = '0' then NameOrId := ResName;
          Integer(pData) := Directory.OffsetToData + BaseAddr;
          with pData^ do
          begin
            writeln(format('%-15s%-8u%-10.8x%-8u',[NameOrID, Size, OffsetToData, CodePage]));
            //writeln(GetStringFromRVA(OffsetToData, BaseVA, BaseAddr));
          end;
        end;
      end;
end;

begin
  with TMemoryStream.Create do
  begin
    if ParamCount > 0 then
      LoadFromFile(ParamStr(1))
    else
      LoadFromFile(ParamStr(0));

    // DOS 頭部
    p := memory;
    writeln('DOS頭部標志: $', IntToHex(PImageDosHeader(p)^.e_magic, 4), '  --> MZ');

    // PE 頭部標志
    inc(p, PImageDosHeader(p)^._lfanew);
    writeln(' PE頭部標志: $', IntToHex(PImageNtHeaders(p)^.Signature, 8), '  --> PE');

    // PE 頭部
    with PImageNtHeaders(p)^.FileHeader do
    begin
      writeln(' PE頭部的域 ==> ');
      writeln('      NumberOfSections : ', NumberOfSections);
      writeln('         TimeDateStamp : $', IntToHex(TimeDateStamp, 8));
    end;
  
    // PE 可選頭部
    writeln(' 數據目錄信息 ==> ');
    writeln('Size':16, 'VirtualAddress':16);
    with PImageNtHeaders(p)^.OptionalHeader do
      for i := 0 to NumberOfRvaAndSizes - 1 do
      begin
        if DataDirectory[i].VirtualAddress = 0 then continue;
        system.write('--> ':8);
        system.write(IntToHex(DataDirectory[i].Size, 8));
        writeln(IntToHex(DataDirectory[i].VirtualAddress, 8):10);
      end;

    tempSize := PImageNtHeaders(p)^.FileHeader.NumberOfSections;

    // 修正數據目錄
    inc(p, PImageNtHeaders(p)^.FileHeader.SizeOfOptionalHeader-SizeOf(TImageOptionalHeader));

    // 節表
    inc(p, SizeOF(TImageNtHeaders));
    writeln('節表起始地址: $', IntToHex(Integer(p)-Integer(memory), 8));

    writeln('VirtualAddress':32);
    for i := 0 to tempSize - 1 do
      with PSectionHeaderArr(p)^[i] do
        Writeln(TSectionName(Name):13, ' --> ', IntToHex(VirtualAddress, 8));

    // 定位到資源節, 輸出
    p := memory;
    PosToSectionEntry(p, IMAGE_DIRECTORY_ENTRY_RESOURCE, VABase, RawAddr);
    inc(p, RawAddr);
    writeln('資源表起始地址: ', IntToHex(RawAddr, 8));
    writeln(format('%-15s%-8s%-10s%-8s',['資源','長度','RVA','CodePage']));
    Writeln('共檢索到資源數: ', EnumResources(0, VABase, Integer(p)));

    // 定位到導入表, 輸出
    p := memory;
    PosToSectionEntry(p, IMAGE_DIRECTORY_ENTRY_IMPORT, VABase, RawAddr);
    writeln('導入表起始地址: ', IntToHex(RawAddr, 8));
    inc(p, RawAddr);
    pBASE := DWORD(p);
    while PImageImportDecriptor(p)^.Name <> 0 do
      with PImageImportDecriptor(p)^ do
      begin
        sRVA := Name;
        if Union.OriginalFirstThunk <> 0 then
          writeln(pChar(pBASE + (Name - VABase)):16, IntToHex(Union.OriginalFirstThunk, 8):10)
        else
          writeln(pChar(pBASE + (Name - VABase)):16, IntToHex(FirstThunk, 8):10);
        inc(p, SizeOf(TImageImportDecriptor));
      end;

    // 第一個導入文件的導入例程列表
    if PImageImportDecriptor(pBASE)^.Union.OriginalFirstThunk <> 0 then
      DWORD(p) := pBASE + (PImageImportDecriptor(pBASE)^.Union.OriginalFirstThunk - VABase)
    else
      DWORD(p) := pBASE + (PImageImportDecriptor(pBASE)^.FirstThunk - VABase);
    while PImageThunkData(p)^.Function_ <> 0 do
    begin
      if PImageThunkData(p)^.Ordinal and IMAGE_ORDINAL_FLAG32 <> 0 then //高位為1
        writeln(format('ord: %17.8x', [PImageThunkData(p)^.Ordinal and $7FFFFFFF]))
      else
      begin
        sRVA := PImageThunkData(p)^.AddressOfData;
        with PImageImportByName(pBASE + (sRVA - VABase))^ do
          writeln(format('name: %-16s Hint: %.4x', [String(pChar(@Name)), Hint]));
      end;

      inc(p, SizeOf(PImageThunkData));
    end;

    //導出表(僅使用名字訪問)
    p := memory;
    if PosToSectionEntry(p, IMAGE_DIRECTORY_ENTRY_EXPORT, VABase, RawAddr) then
    begin
      writeln('導出表起始地址: ', IntToHex(RawAddr, 8));
      inc(p, RawAddr);
      pBASE := DWORD(p);
      with PImageExportDirectory(p)^ do
      begin
        DWORD(pFunctionRVA) := pBASE + (DWORD(AddressOfFunctions) - VABase);

        DWORD(pNameRVA) := pBASE + (DWORD(AddressOfNames) - VABase);
        DWORD(pOrdinal) := pBASE + (DWORD(AddressOfNameOrdinals) - VABase);
        for i := 0 to NumberOfNames - 1 do
        begin
        writeln(format('Func: %.8x  Ord: %.4x  %S',
                       [pFunctionRVA^[pOrdinal^],
                        pOrdinal^ + Base,
                        String(pChar(pBASE + (pNameRVA^ - VABase)))]));
          inc(pNameRVA);
          inc(pOrdinal);
        end;
      end;
    end;

    //重定位表
    p := memory;
    if PosToSectionEntry(p, IMAGE_DIRECTORY_ENTRY_BASERELOC, VABase, RawAddr) then
    begin
      writeln('重定位表起始地址: ', IntToHex(RawAddr, 8));
      inc(p, RawAddr);
      pBASE := DWORD(p);
      while PImageBaseRelocation(p)^.VirtualAddress <> 0 do
        with PImageBaseRelocation(p)^ do
        begin
          if pBASE <> DWORD(p) then
            writeln('Next Relocation Table Section...');
          tempSize := (SizeOfBlock - SizeOf(TImageBaseRelocation)) div SizeOf(WORD);
          DWORD(pRelocItem) := DWORD(p) + SizeOf(TImageBaseRelocation);
          for i := 0 to tempSize - 1 do
          begin
            Writeln(format('RVA: %.8x, Type: %.4x', [VirtualAddress + pRelocItem^ AND $0FFF, pRelocItem^ SHR 12]));
            inc(pRelocItem);
          end;

          p := Pointer(pRelocItem);
          //DWORD(p) := DWORD(p) + SizeOfBlock;
        end;
    end;

    free;
  end;

//readln;
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一区电影| 91丨九色丨蝌蚪富婆spa| 一区二区三区色| 国产精品视频一二三| 久久欧美一区二区| 久久久久久久久久久久久女国产乱| 日韩一级视频免费观看在线| 69堂亚洲精品首页| 欧美一二三在线| 日韩精品中文字幕一区 | 亚洲成人中文在线| 亚洲国产aⅴ天堂久久| 日韩国产欧美在线观看| 久久99国内精品| 国产v日产∨综合v精品视频| 成人妖精视频yjsp地址| 99精品欧美一区二区蜜桃免费 | 欧美午夜在线一二页| 欧美日韩国产bt| 欧美成人一区二区| 中文字幕精品一区二区精品绿巨人 | 国产亚洲一区二区三区四区| 国产精品乱码一区二区三区软件 | 经典三级一区二区| 9i看片成人免费高清| 欧美日韩在线观看一区二区 | 国产一区亚洲一区| 91麻豆免费看片| 日韩视频一区二区三区在线播放| 久久网站最新地址| 亚洲欧美国产毛片在线| 奇米色一区二区| 成人深夜福利app| 51精品视频一区二区三区| 国产亲近乱来精品视频| 亚洲一区二区精品久久av| 日韩成人伦理电影在线观看| 床上的激情91.| 7777女厕盗摄久久久| 国产色综合久久| 亚洲h在线观看| 成人美女视频在线观看18| 91精品国产综合久久福利软件| 中文字幕不卡一区| 青青国产91久久久久久| 91久久精品日日躁夜夜躁欧美| 亚洲精品在线免费观看视频| 亚洲第一二三四区| 99久久国产综合精品麻豆| 精品处破学生在线二十三| 亚洲va国产va欧美va观看| 91美女在线观看| 久久久亚洲国产美女国产盗摄 | 精品久久久久一区二区国产| 亚洲一区二区三区小说| 成人av在线影院| 久久精品视频在线免费观看| 免费观看30秒视频久久| 欧美在线综合视频| 成人欧美一区二区三区在线播放| 国产一区二区三区蝌蚪| 日韩欧美一级片| 久久精品国产久精国产| 欧美日韩黄色影视| 亚洲精品菠萝久久久久久久| 91香蕉视频污| 中文字幕色av一区二区三区| 成人av在线看| 国产精品电影院| 成人的网站免费观看| 中文字幕乱码一区二区免费| 国产成人精品免费视频网站| 亚洲精品在线观看网站| 精品一区二区三区在线播放视频| 欧美一区二区播放| 久久精品国产亚洲高清剧情介绍| 在线成人免费视频| 日日夜夜精品视频天天综合网| 欧美日韩高清影院| 石原莉奈在线亚洲二区| 日韩欧美一卡二卡| 国产成人午夜精品5599| 日本一区二区三区视频视频| 成人精品鲁一区一区二区| 国产精品每日更新在线播放网址| 99久久精品国产麻豆演员表| 亚洲男女一区二区三区| 欧美在线|欧美| 婷婷国产v国产偷v亚洲高清| 日韩视频免费观看高清在线视频| 久久99九九99精品| 国产女同性恋一区二区| 色悠悠久久综合| 日韩国产欧美一区二区三区| 久久夜色精品国产噜噜av| 成人午夜视频在线| 一区二区三区在线免费视频| 欧美日韩免费一区二区三区视频| 另类欧美日韩国产在线| 欧美国产视频在线| 欧美色大人视频| 久久成人综合网| 国产精品久久一卡二卡| 欧美久久一二区| 国产成人av影院| 亚洲一二三专区| 久久免费的精品国产v∧| 99久久国产免费看| 美女看a上一区| 亚洲人一二三区| 精品久久久久一区二区国产| caoporen国产精品视频| 日本成人在线网站| 亚洲男人电影天堂| 日韩精品在线看片z| 91最新地址在线播放| 毛片av一区二区| 怡红院av一区二区三区| 日韩精品一区二区在线观看| 99久久久国产精品免费蜜臀| 青青草伊人久久| 亚洲素人一区二区| 2021中文字幕一区亚洲| 欧美日韩国产一级片| 成人精品亚洲人成在线| 美腿丝袜亚洲三区| 亚洲午夜三级在线| 中文字幕亚洲综合久久菠萝蜜| 日韩三级视频中文字幕| 一本大道综合伊人精品热热| 成人一区二区视频| 蜜臀精品一区二区三区在线观看| 亚洲综合在线观看视频| 亚洲欧洲三级电影| 久久婷婷国产综合精品青草| 欧美一区二区私人影院日本| 日本韩国一区二区三区| 成人a免费在线看| 国产一二三精品| 韩国欧美国产一区| 奇米色777欧美一区二区| 天天做天天摸天天爽国产一区| 亚洲精品国产精品乱码不99 | 美腿丝袜亚洲三区| 日本中文字幕不卡| 天堂午夜影视日韩欧美一区二区| 亚洲一卡二卡三卡四卡五卡| 亚洲精品第一国产综合野| 亚洲女子a中天字幕| 亚洲人xxxx| 亚洲一区二区精品视频| 亚洲国产人成综合网站| 性久久久久久久久| 午夜精品福利视频网站| 午夜精品一区二区三区免费视频| 亚洲国产wwwccc36天堂| 日韩av一级片| 麻豆91小视频| 国产精品一区在线观看乱码| 国产精品1024| 不卡的av网站| 欧美亚洲高清一区| 欧美日韩国产一级| 日韩免费看的电影| 国产日韩在线不卡| 亚洲色图一区二区| 亚洲国产精品久久不卡毛片| 免费成人av在线| av电影在线观看完整版一区二区| 91麻豆精东视频| 欧美日本一区二区在线观看| 91精品国产综合久久精品性色| 日韩一卡二卡三卡| 国产精品网曝门| 亚洲一区二区三区四区在线观看| 日本伊人午夜精品| 成人精品在线视频观看| 欧日韩精品视频| 欧美videossexotv100| 综合久久久久久| 免费成人你懂的| 91天堂素人约啪| 欧美一区二区三区公司| 久久久91精品国产一区二区三区| 中文字幕在线免费不卡| 日韩国产成人精品| jvid福利写真一区二区三区| 欧美剧情片在线观看| 国产精品色哟哟| 日韩va亚洲va欧美va久久| 成人av网站在线观看免费| 欧美精品一级二级三级| 中文字幕第一区| 六月丁香综合在线视频| 99re8在线精品视频免费播放| 欧美一区二区视频在线观看2022| 中国色在线观看另类| 麻豆精品一区二区| 在线视频国产一区| 中文字幕第一区综合|