![]() |
EXE Patchen (nichts illegales!!)
Hallo
Ich habe mir mal ein CrackME heruntergeladen Nun habe ich es geschafft, es zu Patchen. Nun wollte ich mir auch einen Patch in Delphi schreiben, jedoch habe ich bei der Suche nichts Gefunden Wenn ich mich geirrt haben sollte, dann schreibt doch kurz den Link... Danke Ansonsten: Ich habe die Adresse, es soll einfach mit NOP's gepatcht werden Liebe grüsse Claudio |
Re: EXE Patchen (nichts illegales!!)
Du hast also das Offset in der EXE-Datei, das Du verändern möchtest und fragst Dich nun, wie das geht?
(1) TFileStream oder meinetwegen auch die Klassiker "AssignFile()", "Reset()", "Seek()", "Write()" und "Close()". (Siehe Delphi-Hilfe). (2) Bleibt die Frage, wie die binäre Repräsentation von NOP ausschaut, sprich: Welches Byte Du da zu schreiben hast. |
Re: EXE Patchen (nichts illegales!!)
Also als erstes, Datei im Speicher laden, mittels CreateFile, und dann ReadFile bei einem Zeiger einlesen oder sonstiges.
Danach einfach z.b. mit
Delphi-Quellcode:
den Wert an der bestimmten Adresse ändern.
PWord(Cardinal(lpBuffer) + Offset)^ := $90; // $90 = nop
Wenns RVA hast, dann musst du es in den FileOffset umwandeln. Danach einfach mittels WriteFile, den Pointer (lpBuffer) in einer Datei schreiben. |
Re: EXE Patchen (nichts illegales!!)
Danke für die Antworten...
Ok ich hab das mal im ansatz verstanden.. aber wörter wie FileOffset sind neu für mich :D Ich habe einfach das hier
Code:
Diese Zeile soll durch NOP's ersetzt werden
004012AF 75 1F JNZ SHORT crackme2.004012D0
Bei OllyDbg werden 2 zeilen NOP's gesetzt, ist das, weil dieser Befehl 2 Takte braucht? Ist das mit dem oben genannten vorgang möglich? |
Re: EXE Patchen (nichts illegales!!)
Nein, das hat mit der Anzahl der benötigten Takte für einen Befehl nix zutun. Nur mit der Größe der gespeicherten Information, also der Repräsentation des Codes in für die CPU lesbarer Binärform. Und die braucht hier 2 Bytes.
/Ergänzung: Du müsstest also auch 2 NOPs schreiben. |
Re: EXE Patchen (nichts illegales!!)
Leicht Offtopic: Es gibt fertiges Tools die dir sowas ohne weiteres zutun erledigen. Du gibts die ungepatchte EXE an, die gepatchte und das Programm erstellt den Patch von alleine. Müsste was in Richtung (diablo2oo2's Universal Patcher [dUP]) gehen.
|
Re: EXE Patchen (nichts illegales!!)
Ich habe hier mal was ganz schnell zusammengeschrieben, sollte funktionieren. Du musst halt den FileOffset zuerst mittels RvaToFileOffset umwandeln, also falls du Virtuelle Adressen benutzts.
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; |
Re: EXE Patchen (nichts illegales!!)
Ok hab das jetzt einfach mal frech direkt Üernommen....
Es erstellt eine neue EXE und diese ist auch gepatcht :D :D :D Ich werde den Code noch genau Studieren... Aber eins könntest du mir sagen, was hat es mit der zweiten adresse aufsich? Was genau meinst du mit Umwandeln und fals ich Virtuelle Adressen benutze? |
Re: EXE Patchen (nichts illegales!!)
Virtuelle Adresse ist die Adresse die du mit z.B OllyDbg siehst. Das ist die Adresse wo die Datei im Speicher liegt (0x0401000, etc.)
File Offset ist die Adresse in der Datei. Und da wir die Datei in unserem Speicher einfach nur eingelesen haben müssen wir FileOffset nutzten um es zu patchen. |
Re: EXE Patchen (nichts illegales!!)
Ok
Also wenn ich deinen Code 1:1 übernehme, dan funktioniert er nicht, ich musste zuerst die erste Adresse richtig stellen (auf die die ich oben gepostet hab) Danach hats geklappt :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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