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

📄 peloader.dpr

📁 delphi开发语言下的源代码分析
💻 DPR
字号:
program PELoader;
{$IMAGEBASE $72C00000}
{$APPTYPE CONSOLE}

uses
  Windows,
  ImageHlp,
  SysUtils,
  Classes;

const SoftWareName = 'PELoader Ver1.0 pro,';
      CompanyName  = 'copyright(c) 1999,2003 Aurora software';
      Width        = 80 - Length(SoftWareName);

var
  Module : HModule;
  pDOS : PImageDosHeader absolute Module;

  ImageName, TempImage : String;
  FixBase, NewBase, NewSize, OldBase, OldSize, OldTime: DWORD;

function GetImageSize : Integer;
begin
  if pDOS = nil then
    Result := 0
  else
    Result := PImageNtHeaders(DWORD(pDOS) + pDOS^._lfanew)^.OptionalHeader.SizeOfImage;
end;

begin
  Write(SoftWareName,CompanyName:Width);
  Writeln('By Mr. Aimingoo.'); Writeln;

  if ParamCount < 1 then
  begin
    writeln('Usage :(1) PELoader FileName [Special ImageBase]');
    writeln('       (2) PELoader /r <Special ImageBase>');
    writeln;
    writeln(' (1): Load File to Default / Special ImageBase');
    writeln(' (2): Force Fix Self to Special ImageBase');
    Exit;
  end;

  if UpperCase(ParamStr(1)) = '/R' then
    ImageName := ParamStr(0)
  else
    ImageName := ParamStr(1);

  if ParamCount > 1 then
  begin
    NewBase := StrToInt(ParamStr(2));
    TempImage := ImageName + '.tmp';
    CopyFile(pChar(ImageName), pChar(TempImage), False);

    Module := LoadLibraryEx(pChar(ImageName), 0, DONT_RESOLVE_DLL_REFERENCES);
    OldTime := GetTimestampForLoadedLibrary(Module);
    FreeLibrary(Module);

    FixBase := NewBase;
    writeln('Try ReBaseImage to $', IntToHex(NewBase, 8));
    ReBaseImage(pChar(TempImage), nil, True, True, True, 0, OldSize, OldBase, NewSize, NewBase, OldTime);
    if NewBase - FixBase <> 0 then // 我也不知道为什么ReBaseImage()重设映时总会与需求值存在差异, 我只能修正之
    begin
      NewBase := FixBase + (FixBase - NewBase);
      ReBaseImage(pChar(TempImage), nil, True, True, True, 0, OldSize, OldBase, NewSize, NewBase, OldTime);
    end;
    writeln('    ReBaseImage to $', IntToHex(NewBase, 8));

    if ImageName = ParamStr(0) then
    begin
      writeln('SaveFile to: ', TempImage); 
      Exit;
    end;
  end;

  Module := LoadLibraryEx(pChar(ImageName), 0, DONT_RESOLVE_DLL_REFERENCES);

readln;

  writeln('Load and Map Image $', IntToHex(Module, 8));
  with TMemoryStream.Create do
  begin
    Write(Pointer(Module)^, GetImageSize);
    Seek(0, soFromBeginning);
    SaveToFile(ImageName + '.IMG');
    Free;
  end;
  FreeLibrary(Module);

  if NewBase <> 0 then
    DeleteFile(ImageName);

end.

⌨️ 快捷键说明

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