![]() |
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. |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Zitat:
Zitat:
|
Re: EXE Patchen -- Error: verletzt untere Grenzen
Also meinst dz dami, das das hier
Zitat:
Wenn ja, stimmt nicht. Ich habe 32 Bit Windows und das Programm is auch 32 Bit Noch ne andere Frage... es bestünde auch die Möglichkeit die stelle einfach zu Noopen (also mit NOP's zu füllen) Dazu müsste ich AB! Adresse 004452A8 7 NOP's einfügen... Ich hab das mal so versucht
Delphi-Quellcode:
Ich dachte mir, anstelle alles kompliziert in einem schritt einzutragen, mache ich das einfach hintereinander
dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8);
UpdateOffset(lpBuffer, dwFileOffset, $90909090); //LoadFile(opendialog1.FileName, lpBuffer, dwFileSize); dwFileOffset := RvaToFileOffset(lpBuffer, $004452AC); UpdateOffset(lpBuffer, dwFileOffset , $909090); Wenn ich den code schlussendlich ausführe, werden zwar die NOP's eingetragen ABER! a) nur 5 stat 7 b) der unetere Code wird entfernt also alles ab der einfüge Adresse verschwindet... was bei OllyDBG nicht der fall ist Ich bin echt ratlos... |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Ich merke gerade, SirThornberry's Einwurf war nicht ganz korrekt. Die Speicheradresse ist DWord nur der Wert eben nicht.
Zitat:
Zitat:
|
Re: EXE Patchen -- Error: verletzt untere Grenzen
Also muss ich die Procedure für Int64 abändern richtig?
Würde das so funktionieren?
Delphi-Quellcode:
procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: Int64); overload;
begin PDWORD(Cardinal(lpBuffer) + dwFileOffset)^ := Value; end; |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Du musst dann aber entsprechend nach PInt64 statt nach PDWORD casten.
|
Re: EXE Patchen -- Error: verletzt untere Grenzen
Liste der Anhänge anzeigen (Anzahl: 1)
Ooops stimmt
also so??
Delphi-Quellcode:
/////////////Edit
procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: Int64); overload;
begin PInt64(Cardinal(lpBuffer) + dwFileOffset)^ := Value; end; Ich hab den code mal an die anderen Proceduren angehängt (also unten drunter) Danach habe ich mit diesem Code eingelesen
Delphi-Quellcode:
Jedoch hat es nur teilweise geklappt:
dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8); // Adresse einlesen
UpdateOffset(lpBuffer, dwFileOffset, $01004B212405C6); // Neues Offset Die bytes wurden richtig eingetragen sprich an der richtigen stelle aber es hat sonst irgendwas verschoben... Aber seht selbst Oben im bild vorher unten nachher Es sollte ja nur die zeile bei adresse 004452A8 updaten, statdessen hat es sonst was gemacht :) ich hoffe ihr seht den fehler den ich gemacht habe... |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Dieses Bild und das aus dem ersten Beitrag zeigen dasselbe!?
|
Re: EXE Patchen -- Error: verletzt untere Grenzen
Ja grunsätzlich schon
aber diesmal hab ich es noch n bisschen besser markiert.... Aber ich kann mir nicht erklären wo der fehler liegt... Habt ihr ne idee? |
Re: EXE Patchen -- Error: verletzt untere Grenzen
:gruebel:
Jetzt ist es Int64 = 64bit = 8 Byte Zitat:
01 00 4B 21 24 05 C6 - Das sind nur 7 Byte. Eventuell aufteilen in 4, 2 und 1 Byte? |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Ich weiss nicht wie ich das aufteilen soll....
Bin in diesem gebiet noch totaler anfänger :( Oder wird so aufgeteilt?
Delphi-Quellcode:
dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8);
UpdateOffset(lpBuffer, dwFileOffset, $C6); dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8); UpdateOffset(lpBuffer, dwFileOffset, $2405); dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8); UpdateOffset(lpBuffer, dwFileOffset, $01004B21); |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Zitat:
Delphi-Quellcode:
dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8);
UpdateOffset(lpBuffer, dwFileOffset, $01004B21); dwFileOffset := RvaToFileOffset(lpBuffer, $004452AC); UpdateOffset(lpBuffer, dwFileOffset, $2405); dwFileOffset := RvaToFileOffset(lpBuffer, $004452AE); UpdateOffset(lpBuffer, dwFileOffset, $C6); |
Re: EXE Patchen -- Error: verletzt untere Grenzen
So sieht der ganze Code aus
Delphi-Quellcode:
Dieser hat aber leider (wie von mir befürchtet) wieder nicht geklappt....
LoadFile(opendialog1.FileName, lpBuffer, dwFileSize);
dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8); UpdateOffset(lpBuffer, dwFileOffset, $01004B21); dwFileOffset := RvaToFileOffset(lpBuffer, $004452AC); UpdateOffset(lpBuffer, dwFileOffset, $2405); dwFileOffset := RvaToFileOffset(lpBuffer, $004452AE); UpdateOffset(lpBuffer, dwFileOffset, $C6); SaveFile(opendialog1.FileName, lpBuffer, dwFileSize); FreeMem(lpBuffer, dwFileSize); //Edit Wenn ihr seht, was ich falsch mache und denkt "weshalb kommt der nicht selbst drauf, der will doch nur das wir im alles vor coden" Dan sagt mir das doch bitte :D weill ich weis echt nicht was der fehler an dem code ist..... |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Jetzt habe ich mal
Delphi-Quellcode:
getestet. Das ergab dann 21 4B 00 01. Das heißt
dwFileOffset := RvaToFileOffset(lpBuffer, $0001);
UpdateOffset(lpBuffer, dwFileOffset, $01004B21); Zitat:
Dann sollte es so richtig sein:
Delphi-Quellcode:
dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8);
UpdateOffset(lpBuffer, dwFileOffset, $C6); dwFileOffset := RvaToFileOffset(lpBuffer, $004452A9); UpdateOffset(lpBuffer, dwFileOffset, $2405); dwFileOffset := RvaToFileOffset(lpBuffer, $004452AB); UpdateOffset(lpBuffer, dwFileOffset, $01004B21); |
Re: EXE Patchen -- Error: verletzt untere Grenzen
Jaaaaaaaaaaaaaa :D
Das war die ganze zeit der Fehler.... Vielen Vielen Dank.... Du hast echt was gut bei mir... |
Re: EXE Patchen -- Error: verletzt untere Grenzen
:cheers:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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