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

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

?? peheaderunit.pas

?? 一款delphi+arm寫的壓縮殼. 反破解方面做的不是很好.但壓縮性能和兼容性非常不錯.
?? PAS
字號:
unit PEHeaderUnit;

interface   
         
uses
  Windows, SysUtils, 
  JwaWinnt, UtilUnit;

type
  TPEHeader = class
  private
    FHdrPtr: Pointer;
    FSections: Array of PImageSectionHeader;
    FDataDirectorys: Array of PImageDataDirectory;
    FDosHeader: PImageDosHeader;
    FFileHeader: PImageFileHeader;
    FOptionalHeader32: PImageOptionalHeader32;
    procedure DumpHeader;
    procedure DumpDataDirectorys;
    procedure DumpSectionHeaders;
    function GetDataDirectory(Index: Cardinal): PImageDataDirectory;
    function GetDirectoryCount: Cardinal;
    function GetSection(Index: Cardinal): PImageSectionHeader;
    function GetSectionCount: Cardinal;
    function GetHeaderSize: Cardinal;
    procedure SetHeaderSize(const Value: Cardinal);
    function GetFileAlignment: Cardinal;
    procedure SetFileAlignment(const Value: Cardinal);
    function GetSectionAlignment: Cardinal;
    procedure SetSectionAlignment(const Value: Cardinal);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    function ValidatePE(HdrPtr: Pointer): Boolean;
    function Assign(HdrPtr: Pointer): Bool;
    function OffsetInSection(Offset: Cardinal): Cardinal;
    function OffsettoRVA(Offset: Cardinal): Cardinal;
    function RVAInSection(RVA: Cardinal): Cardinal;
    function RVAtoOffset(RVA: Cardinal): Cardinal;
    function RVAtoPtr(RVA: Cardinal): Pointer;
    function AddSection(var NewSectionHeader: PImageSectionHeader): Bool;
    function ExtendHeader(NewSize: Cardinal; var RealSize: Cardinal): Bool;
    function WipeSectionHeader(Index: Cardinal): Bool;
    function CalcFileAilgnment(RawLength: Cardinal): Cardinal;
    function CalcSectionAilgnment(RawLength: Cardinal): Cardinal;
    procedure UpdateImageSize;
    function GetRealHeaderSize: Cardinal;
    property HeaderPtr: Pointer read FHdrPtr;
    property SectionCount: Cardinal read GetSectionCount;
    property DirectoryCount: Cardinal read GetDirectoryCount;
    property Sections[Index: Cardinal]: PImageSectionHeader read GetSection;
    property DataDirectorys[Index: Cardinal]: PImageDataDirectory read GetDataDirectory;
    property DosHeader: PImageDosHeader read FDosHeader;
    property FileHeader: PImageFileHeader read FFileHeader;
    property OptionalHeader32: PImageOptionalHeader32 read FOptionalHeader32;
    property HeaderSize: Cardinal read GetHeaderSize Write SetHeaderSize;
    property SA: Cardinal read GetSectionAlignment write SetSectionAlignment;
    property FA: Cardinal read GetFileAlignment write SetFileAlignment;
  end;

implementation

{ TPEHeader }

function TPEHeader.AddSection(var NewSectionHeader: PImageSectionHeader): Bool;
var
  NeedHdrSize: Cardinal;
  i: integer;
  pLastSection: PImageSectionHeader;
  lsOffset: Cardinal;
  l: Cardinal;
  NeedMovPtr: Pointer;
  NeedMovSize: Cardinal;
  NeedMovOffset: Cardinal;
begin
  result := true;
  NewSectionHeader := nil;

  NeedHdrSize := CalcFileAilgnment(Cardinal(PtrDiff(FDataDirectorys[DirectoryCount - 1],
    FHdrPtr)) + SizeOf(TImageDataDirectory) + (SectionCount + 1) *
    SizeOf(TImageSectionHeader));
  if (HeaderSize < NeedHdrSize)  then
    if not ExtendHeader(NeedHdrSize, l) then
      result := false;
  
  NeedMovSize := 0;
  if SectionCount > 0 then
    NeedMovOffset := PtrDiff(PtrAdd(Sections[SectionCount - 1],
      SizeOf(TImageSectionHeader) * 3), FHdrPtr)
  else
    NeedMovOffset := PtrDiff(PtrAdd(FDataDirectorys[DirectoryCount - 1],
      SizeOf(TImageDataDirectory)), FHdrPtr);
  for i := 0 to DirectoryCount - 1 do
  begin
    if DataDirectorys[i]^.VirtualAddress = 0 then Continue;
    if (DataDirectorys[i]^.VirtualAddress <= HeaderSize) and
       (HeaderSize - NeedMovOffset < DataDirectorys[i]^.Size) then
       inc(NeedMovSize, DataDirectorys[i]^.Size);
  end;
  if (NeedHdrSize < NeedMovOffset + NeedMovSize) then
    if not ExtendHeader(NeedMovOffset + NeedMovSize, l) then
      result := false;
  if result then
  begin
    if SectionCount > 0 then
    begin
      pLastSection := Sections[SectionCount - 1];
      lsOffset := PtrDiff(pLastSection, FHdrPtr) + SizeOf(TImageSectionHeader);
      NeedMovPtr := PtrAdd(pLastSection, SizeOf(TImageSectionHeader) * 2);
      inc(pLastSection);
    end
    else
    begin
      pLastSection := PtrAdd(FDataDirectorys[DirectoryCount - 1], SizeOf(TImageDataDirectory));
      lsOffset := PtrDiff(pLastSection, FHdrPtr);
      NeedMovPtr := PtrAdd(pLastSection, SizeOf(TImageSectionHeader));
    end;
    for i := 0 to DirectoryCount - 1 do
    begin
      if DataDirectorys[i]^.VirtualAddress = 0 then Continue;
      if DataDirectorys[i]^.VirtualAddress <= lsOffset then
      begin
        CopyMemory(NeedMovPtr, RVAtoPtr(DataDirectorys[i]^.VirtualAddress),
          DataDirectorys[i]^.Size);
        DataDirectorys[i]^.VirtualAddress := PtrDiff(NeedMovPtr, FHdrPtr);
        PtrAdd(NeedMovPtr, DataDirectorys[i]^.Size);
      end;
    end;

    ZeroMemory(pLastSection, SizeOf(TImageSectionHeader) * 2);
    inc(FFileHeader^.NumberOfSections);
    NewSectionHeader := pLastSection;
    if SectionCount > 1 then
      NewSectionHeader^.VirtualAddress :=
        CalcSectionAilgnment(Sections[SectionCount - 2]^.VirtualAddress +
        Sections[SectionCount - 2]^.Misc.VirtualSize)
    else       
      NewSectionHeader^.VirtualAddress := 0;

    NewSectionHeader^.Misc.VirtualSize := SA;
    NewSectionHeader^.SizeOfRawData := 0;
    NewSectionHeader^.PointerToRawData := 0;
    NewSectionHeader^.Characteristics := $E00000E0;
    DumpSectionHeaders;
  end;
end;

function TPEHeader.Assign(HdrPtr: Pointer): Bool;
begin
  result := ValidatePE(HdrPtr);
  if not result then exit;
  Clear;
  FHdrPtr := HdrPtr;
  DumpHeader;
  GetMem(FHdrPtr, HeaderSize);
  CopyMemory(FHdrPtr, HdrPtr, HeaderSize);
  DumpHeader;
  DumpDataDirectorys;
  DumpSectionHeaders;
  HeaderSize := GetRealHeaderSize;
end;

function TPEHeader.CalcFileAilgnment(RawLength: Cardinal): Cardinal;
begin
  result := RawLength;
  if result mod FA <> 0 then
    result := (result div FA + 1) * FA;
end;

function TPEHeader.CalcSectionAilgnment(RawLength: Cardinal): Cardinal;
begin
  result := RawLength;
  if result mod SA <> 0 then
    result := (result div SA + 1) * SA;
end;

procedure TPEHeader.Clear;
begin
  if FHdrPtr <> nil then
    FreeMem(FHdrPtr);
  FHdrPtr := nil;
  FDosHeader := nil;
  FFileHeader := nil;
  FOptionalHeader32 := nil;
end;

constructor TPEHeader.Create;
begin
  inherited;
end;

destructor TPEHeader.Destroy;
begin
  Clear;
  inherited;
end;

procedure TPEHeader.DumpDataDirectorys;  
var
  i: integer;
  DDPtr: PImageDataDirectory;
begin
  FDataDirectorys := nil;
  SetLength(FDataDirectorys, DirectoryCount);
  DDPtr := @FOptionalHeader32^.DataDirectory[0];
  for i := 0 to DirectoryCount - 1 do
  begin
    FDataDirectorys[i] := DDPtr;
    inc(DDPtr);
  end;
end;

procedure TPEHeader.DumpHeader;
begin
  FDosHeader := FHdrPtr;
  FFileHeader := PtrAdd(FDosHeader , FDosHeader^.e_lfanew + 4);
  FOptionalHeader32 := PtrAdd(FFileHeader, IMAGE_SIZEOF_FILE_HEADER);
end;

procedure TPEHeader.DumpSectionHeaders;
var
  i: integer;
  SHPtr: PImageSectionHeader;
begin
  FSections := nil;
  SetLength(FSections, SectionCount);
  SHPtr := PtrAdd(FOptionalHeader32, FFileHeader^.SizeOfOptionalHeader);
  for i := 0 to SectionCount - 1 do
  begin
    FSections[i] := SHPtr;
    inc(SHPtr);
  end;
end;

function TPEHeader.ExtendHeader(NewSize: Cardinal; var RealSize: Cardinal): Bool;
var
  i: integer;
  AddSize: Cardinal;
  TmpHdrPtr: Pointer;
begin
  NewSize := CalcFileAilgnment(NewSize);
  if (NewSize > HeaderSize) and (NewSize <= $1000) then
  begin
    AddSize := NewSize - HeaderSize;
    TmpHdrPtr := AllocMem(NewSize);
    CopyMemory(TmpHdrPtr, DosHeader, HeaderSize);
    Clear;
    FHdrPtr := TmpHdrPtr;
    DumpHeader;
    DumpDataDirectorys;
    DumpSectionHeaders;
    for i := 0 to SectionCount - 1 do
    begin
      inc(FSections[i]^.PointerToRawData, AddSize);
    end;
    inc(FOptionalHeader32^.SizeOfImage, AddSize);
    HeaderSize := NewSize;
    result := true;
  end
  else
    result := false;
  RealSize := HeaderSize;
end;

function TPEHeader.GetDataDirectory(Index: Cardinal): PImageDataDirectory;
begin
  if Index >= DirectoryCount then
    result := nil
  else
    result := FDataDirectorys[index];
end;

function TPEHeader.GetDirectoryCount: Cardinal;
begin
  result := FOptionalHeader32^.NumberOfRvaAndSizes;
end;

function TPEHeader.GetFileAlignment: Cardinal;
begin
  result := FOptionalHeader32^.FileAlignment;
end;

function TPEHeader.GetHeaderSize: Cardinal;
begin
  result := FOptionalHeader32^.SizeOfHeaders;
end;

function TPEHeader.GetRealHeaderSize: Cardinal;
var
  i: Cardinal;
begin
  result := $FFFFFFFF;
  for i := 0 to SectionCount - 1 do
  begin
    if Sections[i].PointerToRawData = 0 then Continue;
    result := Min(result, Sections[i].PointerToRawData);
  end;
end;

function TPEHeader.GetSection(Index: Cardinal): PImageSectionHeader;
begin
  if Index >= SectionCount then
    result := nil
  else
    result := FSections[index];
end;

function TPEHeader.GetSectionAlignment: Cardinal;
begin
  result := FOptionalHeader32^.SectionAlignment;
end;

function TPEHeader.GetSectionCount: Cardinal;
begin
  result := FFileHeader^.NumberOfSections;
end;

function TPEHeader.OffsetInSection(Offset: Cardinal): Cardinal;
var
  i: Cardinal;
begin
  result := NULL_VALUE;
  if Offset = 0 then exit;
  for i := 0 to SectionCount - 1 do
    if (Offset >= Sections[i]^.PointerToRawData) and
       (Offset - Sections[i]^.PointerToRawData < Sections[i]^.SizeOfRawData) then
    begin
      result := i;
      break;
    end;
end;

function TPEHeader.OffsettoRVA(Offset: Cardinal): Cardinal;
begin
  result := OffsetInSection(Offset);
  if result <> NULL_VALUE then
    result := Offset - Sections[result]^.SizeOfRawData +
              Sections[result]^.VirtualAddress;
end;

function TPEHeader.RVAInSection(RVA: Cardinal): Cardinal;
var
  i: Cardinal;
begin
  result := NULL_VALUE;
  if RVA = 0 then exit;
  for i := 0 to SectionCount - 1 do
    if (RVA >= Sections[i]^.VirtualAddress) and
       (RVA - Sections[i]^.VirtualAddress < Sections[i]^.Misc.VirtualSize) then
    begin
      result := i;
      break;
    end;
end;

function TPEHeader.RVAtoOffset(RVA: Cardinal): Cardinal;
var
  i: Cardinal;
begin
  if integer(RVA - Sections[SectionCount - 1]^.VirtualAddress) >
     integer(Sections[SectionCount - 1]^.Misc.VirtualSize) then
    result := NULL_VALUE
  else
  begin
    i := RVAInSection(RVA);
    if i = NULL_VALUE then
      result := RVA
    else
      result := RVA - Sections[i]^.VirtualAddress +
                Sections[i]^.PointerToRawData;
  end;
end;

function TPEHeader.RVAtoPtr(RVA: Cardinal): Pointer;
begin
  result := PtrAdd(FHdrPtr, RVAtoOffset(RVA));
end;

procedure TPEHeader.SetFileAlignment(const Value: Cardinal);
begin
  FOptionalHeader32^.FileAlignment := Value;
end;

procedure TPEHeader.SetHeaderSize(const Value: Cardinal);
begin
  FOptionalHeader32^.SizeOfHeaders := Value;
end;

procedure TPEHeader.SetSectionAlignment(const Value: Cardinal);
begin
  FOptionalHeader32^.SectionAlignment := Value;
end;

procedure TPEHeader.UpdateImageSize;
begin
  FOptionalHeader32^.SizeOfImage := Sections[SectionCount - 1]^.VirtualAddress +
    Sections[SectionCount - 1]^.Misc.VirtualSize;
end;

function TPEHeader.ValidatePE(HdrPtr: Pointer): Boolean;
begin
  result := true;
  try
    result := not IsBadReadPtr(HdrPtr, 2) and result;
    if result then
    begin
      result := (PWORD(HdrPtr)^ = $5A4D) and result;
      HdrPtr := PtrAdd(HdrPtr, PImageDosHeader(HdrPtr)^.e_lfanew);
      result := not IsBadReadPtr(HdrPtr, 2) and result;
      if result then
        result := (PWORD(HdrPtr)^ = $4550) and result;
    end;
  except
    result := false;
  end;
end;

function TPEHeader.WipeSectionHeader(Index: Cardinal): Bool;
var
  i: Cardinal;
  ps, ps2: PImageSectionHeader;
begin
  result := false;
  if Index >= SectionCount then exit;
  ps := Sections[Index];
  ps2 := PtrAdd(ps, SizeOf(TImageSectionHeader));
  for i := Index to SectionCount - 1 do
  begin                                              
    ps2^.VirtualAddress := ps^.VirtualAddress;
    CopyMemory(ps, ps2, SizeOf(TImageSectionHeader));
    ps2^.VirtualAddress := ps^.VirtualAddress + ps^.Misc.VirtualSize;
    inc(ps);
    inc(ps2);
  end;
  ZeroMemory(ps2, SizeOf(TImageSectionHeader));
  dec(FFileHeader^.NumberOfSections);
  result := true;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品一区二区综合av| 日本欧美一区二区在线观看| 精品久久久久久久久久久久包黑料 | 另类小说视频一区二区| 亚洲成a人片在线观看中文| 亚洲午夜精品在线| 亚洲不卡av一区二区三区| 亚洲6080在线| 精品制服美女丁香| 国产尤物一区二区在线| 国产一区二区久久| 成人美女在线观看| 在线一区二区三区四区| 在线成人av网站| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日本伊人色综合网| 日韩av一二三| 国产成人精品午夜视频免费| 国产成人精品免费看| 91社区在线播放| 欧美一级艳片视频免费观看| 欧美成人伊人久久综合网| 久久久久久久综合色一本| 综合分类小说区另类春色亚洲小说欧美| 亚洲啪啪综合av一区二区三区| 亚洲一区二区3| 国产一区二区不卡| 欧美午夜精品电影| 久久综合久色欧美综合狠狠| 亚洲欧美日韩久久精品| 老司机精品视频在线| 9久草视频在线视频精品| 欧美日本免费一区二区三区| 久久网这里都是精品| 一区二区久久久久久| 久久精品噜噜噜成人av农村| voyeur盗摄精品| 精品久久五月天| 亚洲国产精品影院| 成人免费高清在线| 精品久久国产字幕高潮| 亚洲免费在线视频一区 二区| 日韩国产在线一| 91免费看视频| 国产欧美精品国产国产专区| 亚洲成人第一页| 91在线观看地址| 久久亚洲综合av| 天天操天天色综合| 欧美专区亚洲专区| 中文字幕av一区二区三区高| 久久精品国产免费| 欧美日韩精品一区二区三区蜜桃| 国产日韩欧美a| 另类人妖一区二区av| 欧美狂野另类xxxxoooo| 一区二区理论电影在线观看| 99久久精品国产导航| 国产亚洲欧洲997久久综合| 日韩精品五月天| 欧美日韩aaaaaa| 亚洲色图.com| 色国产精品一区在线观看| 日本一区二区电影| 国产成人精品免费看| 国产片一区二区三区| 国产精品主播直播| 久久久久久久久久久久久夜| 激情小说欧美图片| 精品国产电影一区二区| 精品一区二区在线看| 欧美一卡二卡三卡| 日韩av电影免费观看高清完整版 | 国产精品不卡一区二区三区| 国产精品综合视频| 欧美激情中文字幕| 成人高清视频免费观看| 久久久一区二区| 国产aⅴ精品一区二区三区色成熟| 2欧美一区二区三区在线观看视频| 日韩高清欧美激情| 精品国产凹凸成av人网站| 久久成人免费电影| 日韩美女视频一区二区在线观看| 男男gaygay亚洲| 精品不卡在线视频| a美女胸又www黄视频久久| 亚洲欧美成aⅴ人在线观看 | 日韩一区二区三区视频在线观看| 午夜成人免费电影| 亚洲一二三四在线| 欧美高清www午色夜在线视频| 午夜精品福利久久久| 日韩网站在线看片你懂的| 国产精品亚洲一区二区三区在线| 国产欧美一区二区精品忘忧草| 成人激情午夜影院| 亚洲va国产天堂va久久en| 日韩一二三区视频| 成人av影院在线| 亚洲成av人综合在线观看| 日韩一级二级三级| av日韩在线网站| 日韩国产高清影视| 久久久精品tv| 欧美日韩国产一区| 国产精品伊人色| 亚洲一区二区三区四区中文字幕| 欧美精选一区二区| 国产91在线观看丝袜| 亚洲一区二区在线免费观看视频| 欧美成人艳星乳罩| 91理论电影在线观看| 美女精品一区二区| 中文字幕一区二区不卡| 欧美一区二区在线视频| 99久久99久久精品免费看蜜桃| 午夜精品福利久久久| 综合久久给合久久狠狠狠97色 | 不卡av在线免费观看| 免费欧美高清视频| 亚洲精品日产精品乱码不卡| 国产亚洲一二三区| 欧美一区三区四区| 欧美亚洲愉拍一区二区| 成人动漫一区二区| 国内精品国产成人国产三级粉色| 一区二区三区久久| 国产精品久久毛片a| 久久免费看少妇高潮| 欧美精品日韩精品| 色婷婷综合久久久久中文| 国产sm精品调教视频网站| 久久99深爱久久99精品| 首页国产欧美久久| 亚洲午夜久久久久| 亚洲一区二区在线观看视频| 国产精品久久毛片av大全日韩| 精品国产乱码久久久久久蜜臀| 91官网在线观看| 91麻豆国产福利在线观看| 不卡的av在线| 99久久精品国产一区| 成人妖精视频yjsp地址| 成人午夜av电影| 成人午夜视频在线观看| 国产成人在线观看| 国产精品亚洲一区二区三区在线 | 欧美bbbbb| 日本欧美在线观看| 久久精品国产亚洲一区二区三区| 日韩av一区二区三区四区| 午夜精品国产更新| 日韩国产成人精品| 麻豆成人久久精品二区三区小说| 亚洲成av人片| 免费不卡在线视频| 狠狠色狠狠色综合| 成人影视亚洲图片在线| 99视频有精品| 欧美三级日韩在线| 91精品国产福利在线观看| 日韩免费一区二区| 日本一区二区三区久久久久久久久不| 久久久亚洲高清| 国产精品伦一区| 亚洲自拍偷拍综合| 美女脱光内衣内裤视频久久网站 | 色综合久久综合网97色综合| 在线免费观看一区| 欧美一级片在线看| 精品国产1区2区3区| 国产欧美1区2区3区| 亚洲老司机在线| 日本欧美大码aⅴ在线播放| 韩日av一区二区| 99r国产精品| 91精品国产丝袜白色高跟鞋| 欧美精品一区二区不卡| 国产女同性恋一区二区| 亚洲精品网站在线观看| 日韩av电影一区| av爱爱亚洲一区| 欧美日韩高清一区二区不卡| 久久久久久久久久久久久女国产乱| 国产精品久久久久久久午夜片| 亚洲黄色免费电影| 久久99久久久久| 色综合网色综合| 亚洲精品在线一区二区| 亚洲乱码精品一二三四区日韩在线| 午夜精品福利在线| av成人免费在线观看| 欧美一级一区二区| 亚洲猫色日本管| 国产传媒一区在线| 欧美一区二区高清| 亚洲男人的天堂在线aⅴ视频| 国内精品国产三级国产a久久| 欧美色大人视频|