Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EXE Patchen -- Error: verletzt untere Grenzen (https://www.delphipraxis.net/105849-exe-patchen-error-verletzt-untere-grenzen.html)

hedie 31. Dez 2007 17:25


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:
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;
Nun der Code funktioniert einwandfrei (bis jetzt)

Ich wollte diesen Code kompilieren

Delphi-Quellcode:
UpdateOffset(lpBuffer, dwFileOffset, $01004B212405C6);
Kommt die Meldung:
Code:
[DCC Fehler] main.pas(201): E1012 Konstantenausdruck verletzt untere Grenzen
Woran liegt das?

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

Nuclear-Ping 31. Dez 2007 17:29

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.

hedie 31. Dez 2007 17:31

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Und wie kann ich das nun dennoch Patchen... ?

bzw. erweitern

Nuclear-Ping 31. Dez 2007 17:34

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Vlt. Blockweise?

Delphi-Quellcode:
UpdateOffset(lpBuffer, dwFileOffset, $212405C6);
UpdateOffset(lpBuffer, dwFileOffset + 4, $01004B);

hedie 31. Dez 2007 17:36

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Danke.. werd ich gleich mal testen

hedie 31. Dez 2007 17:55

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

ErazerZ 31. Dez 2007 21:15

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Hier noch was ganz schnell bevor ich gehe,
Delphi-Quellcode:
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;
Guten Rutsch noch :).

hedie 31. Dez 2007 21:17

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Danke

Werd ich in grosser hoffnung testen

Dir auch einen guten rutsch... :D

SirThornberry 31. Dez 2007 21:32

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.

hedie 31. Dez 2007 21:36

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.

Garfield 1. Jan 2008 10:08

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Zitat:

Zitat von hedie
Was muss ich dann in meinem Delphi Programm eintragen, ...

Den Ansatz hat Dir SirThornberry gegeben:
Zitat:

Zitat von SirThornberry
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.

Du arbeitest mit Cardinal = 32bit. Du benötigst aber Int64 = 64bit.

hedie 1. Jan 2008 11:01

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Also meinst dz dami, das das hier

Zitat:

Zitat von hedie

004452A8 |. C605 24214B00 01 MOV BYTE PTR DS:[4B2124],1

Das blaue, soll nach dem Programm aufruf in Adresse 004452A8 stehen.

64 Bit Programm Code ist?

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:
    dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8);
    UpdateOffset(lpBuffer, dwFileOffset, $90909090);


    //LoadFile(opendialog1.FileName, lpBuffer, dwFileSize);
    dwFileOffset := RvaToFileOffset(lpBuffer, $004452AC);
    UpdateOffset(lpBuffer, dwFileOffset , $909090);
Ich dachte mir, anstelle alles kompliziert in einem schritt einzutragen, mache ich das einfach hintereinander

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...

Garfield 1. Jan 2008 12:04

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 von hedie
64 Bit Programm Code ist?

Nein, der bleibt bei 32bit. Es ging um den Datentyp.

Zitat:

Zitat von hedie
Delphi-Quellcode:
procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: DWORD); overload;
begin
  PDWORD(Cardinal(lpBuffer) + dwFileOffset)^ := Value;
end;
Delphi-Quellcode:
UpdateOffset(lpBuffer, dwFileOffset, $01004B212405C6);

Deine Procedure nimmt maximal DWord, Du übergibst aber Int64.

hedie 1. Jan 2008 12:27

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;

Apollonius 1. Jan 2008 12:30

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Du musst dann aber entsprechend nach PInt64 statt nach PDWORD casten.

hedie 1. Jan 2008 12:31

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ooops stimmt

also so??

Delphi-Quellcode:
procedure UpdateOffset(var lpBuffer: Pointer; dwFileOffset: Cardinal; Value: Int64); overload;
begin
  PInt64(Cardinal(lpBuffer) + dwFileOffset)^ := Value;
end;
/////////////Edit

Ich hab den code mal an die anderen Proceduren angehängt (also unten drunter)

Danach habe ich mit diesem Code eingelesen

Delphi-Quellcode:
    dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8); // Adresse einlesen
      UpdateOffset(lpBuffer, dwFileOffset, $01004B212405C6); // Neues Offset
Jedoch hat es nur teilweise geklappt:

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...

Garfield 1. Jan 2008 13:19

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Dieses Bild und das aus dem ersten Beitrag zeigen dasselbe!?

hedie 1. Jan 2008 13:20

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?

Garfield 1. Jan 2008 13:47

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
:gruebel:

Jetzt ist es Int64 = 64bit = 8 Byte

Zitat:

Zitat von hedie
Delphi-Quellcode:
    dwFileOffset := RvaToFileOffset(lpBuffer, $004452A8); // Adresse einlesen
      UpdateOffset(lpBuffer, dwFileOffset, $01004B212405C6); // Neues Offset

:wall:

01 00 4B 21 24 05 C6 - Das sind nur 7 Byte. Eventuell aufteilen in 4, 2 und 1 Byte?

hedie 1. Jan 2008 13:51

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);

Garfield 1. Jan 2008 14:00

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Zitat:

Zitat von hedie
Ich weiss nicht wie ich das aufteilen soll....

Ich nehme an so:
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);

hedie 1. Jan 2008 14:04

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
So sieht der ganze Code aus

Delphi-Quellcode:
 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);
Dieser hat aber leider (wie von mir befürchtet) wieder nicht geklappt....

//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.....

Garfield 1. Jan 2008 20:23

Re: EXE Patchen -- Error: verletzt untere Grenzen
 
Jetzt habe ich mal
Delphi-Quellcode:
dwFileOffset := RvaToFileOffset(lpBuffer, $0001);
UpdateOffset(lpBuffer, dwFileOffset, $01004B21);
getestet. Das ergab dann 21 4B 00 01. Das heißt
Zitat:

Zitat von Garfield
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);

ergibt 21 4B 00 01 05 24 C6 anstelle von C6 05 24 21 4B 00 01.

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);

hedie 1. Jan 2008 20:31

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...

Garfield 1. Jan 2008 21:26

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