📄 peloader.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 + -