![]() |
EXE Patchen -- Error: verletzt untere Grenzen
Hallo
Ich habe vor kurzen einen Thread übers Patchen von EXEn eröffnet.... Dabei wurde dieser Code gepostet
Delphi-Quellcode:
Nun der Code funktioniert einwandfrei (bis jetzt)
function LoadFile(const sFilename: string; var lpBuffer: Pointer; var dwFileSize: Cardinal): Boolean;
var hFile: THandle; lpNumberOfBytesRead: Cardinal; begin Result := False; hFile := CreateFile(PAnsiChar(sFilename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if (hFile <> INVALID_HANDLE_VALUE) then begin dwFileSize := GetFileSize(hFile, nil); if (dwFileSize > 0) then begin GetMem(lpBuffer, dwFileSize); Result := ReadFile(hFile, lpBuffer^, dwFileSize, lpNumberOfBytesRead, nil) and (lpNumberOfBytesRead = dwFileSize); end; CloseHandle(hFile); end; end; function SaveFile(const sFilename: string; var lpBuffer: Pointer; var dwFileSize: Cardinal): Boolean; var hFile: THandle; lpNumberOfBytesWritten: Cardinal; begin Result := False; hFile := CreateFile(PAnsiChar(sFilename), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0); if (hFile <> INVALID_HANDLE_VALUE) and (dwFileSize > 0) then begin Result := WriteFile(hFile, lpBuffer^, dwFileSize, lpNumberOfBytesWritten, nil) and (lpNumberOfBytesWritten = dwFileSize); CloseHandle(hFile); end; end; function RvaToFileOffset(var lpBuffer: Pointer; dwRva: Cardinal): Cardinal; var ImageDosHeader: PImageDosHeader; ImageNtHeaders: PImageNtHeaders; ImageSection: PImageSectionHeader; x: Word; begin Result := 0; ImageDosHeader := PImageDosHeader(Cardinal(lpBuffer)); if (ImageDosHeader^.e_magic = IMAGE_DOS_SIGNATURE) then begin ImageNtHeaders := PImageNtHeaders(Cardinal(lpBuffer) + Cardinal(ImageDosHeader._lfanew)); if (ImageNtHeaders^.Signature = IMAGE_NT_SIGNATURE) then begin if (dwRva > ImageNtHeaders^.OptionalHeader.ImageBase) then dwRva := dwRva - ImageNtHeaders^.OptionalHeader.ImageBase; for x := 0 to ImageNtHeaders^.FileHeader.NumberOfSections -1 do begin ImageSection := PImageSectionHeader(Cardinal(lpBuffer) + Cardinal(ImageDosHeader^._lfanew) + SizeOf(TImageNtHeaders) + (x * SizeOf(TImageSectionHeader))); if (dwRva >= ImageSection.VirtualAddress) and (dwRva < ImageSection.VirtualAddress + ImageSection.SizeOfRawData) then begin Result := dwRva - ImageSection.VirtualAddress + ImageSection.PointerToRawData; Break; end; end; end; end; end; procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: Byte); overload; begin PByte(Cardinal(lpBuffer) + dwFileOffset)^ := Value; end; procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: Word); overload; begin PWord(Cardinal(lpBuffer) + dwFileOffset)^ := Value; end; procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: DWORD); overload; begin PDWORD(Cardinal(lpBuffer) + dwFileOffset)^ := Value; end; procedure TForm1.FormCreate(Sender: TObject); var lpBuffer: Pointer; dwFileSize, dwFileOffset: Cardinal; begin if LoadFile('C:\z.exe', lpBuffer, dwFileSize) then begin dwFileOffset := RvaToFileOffset(lpBuffer, $0040104E); UpdateOffset(lpBuffer, dwFileOffset, $90909090); SaveFile('C:\z2.exe', lpBuffer, dwFileSize); FreeMem(lpBuffer, dwFileSize); end; end; Ich wollte diesen Code kompilieren
Delphi-Quellcode:
Kommt die Meldung:
UpdateOffset(lpBuffer, dwFileOffset, $01004B212405C6);
Code:
Woran liegt das?
[DCC Fehler] main.pas(201): E1012 Konstantenausdruck verletzt untere Grenzen
Ich nehme an am lanen offset, aber das wird so benötigt und abändern kann ich es nicht... Ich hoffe ihr habt ne Lösung für mein Problem Liebe grüsse Und frohes neues Jahr :D Claudio |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Der dritte Parameter von UpdateOffset erwartet einen Byte-Wert (0-255).
... Schmarrn. Wird ja überladen. Der Wert den du ändern willst und als Hex übergibst, würde in dezimaler Schreibweise 281.797.655.266.758 sein. Das sprengt einfach die Grenzen von DWORD. |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Und wie kann ich das nun dennoch Patchen... ?
bzw. erweitern |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Vlt. Blockweise?
Delphi-Quellcode:
UpdateOffset(lpBuffer, dwFileOffset, $212405C6);
UpdateOffset(lpBuffer, dwFileOffset + 4, $01004B); |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Danke.. werd ich gleich mal testen
|
Re: EXE Patchen -- Error: verletzt untere Grenzen
Liste der Anhänge anzeigen (Anzahl: 1)
Hat Leider nicht geklappt
Wie man im angehängten Screenshot von Olly sieht, sind beim Original (oben) alle 3 adressen Belegt, unten (nach dem patchen) sinds nur noch 2 Irgenwie scheint er was zu entfernen, weswegen dan auch das programm abstürtzt!! ///////Edit.. Sorry hab vergessen zu editieren |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Hier noch was ganz schnell bevor ich gehe,
Delphi-Quellcode:
Guten Rutsch noch :).
procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: array of Byte); overload;
begin CopyMemory(Pointer(Cardinal(lpBuffer) + dwFileOffset), @Value[0], SizeOf(Value)); end; ... const x: Array[0..7] of Byte = ($01, $00, $00, $4B, $21, $24, $05, $C6); begin .. UpdateOffset(lpBuffer, dwFileOffset, x); .. end; |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Danke
Werd ich in grosser hoffnung testen Dir auch einen guten rutsch... :D |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Bei 32bit kann die Speichereadresse auch nur 32bit sein was einem DWORD entspricht. Dementsprechend ist dein Offset-Wert definitiv falsch. Du kannst nicht eine Stelle bei 32bit patchen welche 32bit überschreitet.
Das ist als wölltest du in einem Auto einen Autositz einbauen der 20 Meter hinter der Motorhaupe beginnt obwohl das auto nur 4 Meter lang ist. |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Was muss ich dann in meinem Delphi Programm eintragen, damit folgender "Befehl" eingetragen wird?
004452A8 |. C605 24214B00 01 MOV BYTE PTR DS:[4B2124],1 Das blaue, soll nach dem Programm aufruf in Adresse 004452A8 stehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz