AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EXE Patchen (nichts illegales!!)

Ein Thema von hedie · begonnen am 30. Dez 2007 · letzter Beitrag vom 31. Dez 2007
Antwort Antwort
Seite 1 von 3  1 23      
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#1

EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 12:31
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
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 12:40
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 12:43
Also als erstes, Datei im Speicher laden, mittels CreateFile, und dann ReadFile bei einem Zeiger einlesen oder sonstiges.
Danach einfach z.b. mit
PWord(Cardinal(lpBuffer) + Offset)^ := $90; // $90 = nop den Wert an der bestimmten Adresse ändern.
Wenns RVA hast, dann musst du es in den FileOffset umwandeln. Danach einfach mittels WriteFile, den Pointer (lpBuffer) in einer Datei schreiben.
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#4

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 12:47
Danke für die Antworten...

Ok ich hab das mal im ansatz verstanden.. aber wörter wie FileOffset sind neu für mich


Ich habe einfach das hier

Code:
004012AF    75 1F         JNZ SHORT crackme2.004012D0
Diese Zeile soll durch NOP's ersetzt werden

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?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von Mao
Mao

Registriert seit: 4. Dez 2006
Ort: Dresden
75 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 12:51
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.
Ein chinesisches Sprichwort sagt: Ein Weiser, der alle Dinge gesehen hat gleicht dennoch nicht dem Manne, der ein einzigstes Ding mit seinen eigenen Händen geschaffen hat.
---
Günstige Domains, Webhosting und Teamspeak-Server - info@max06.de!
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#6

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 13:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 13:21
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;
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#8

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 13:54
Ok hab das jetzt einfach mal frech direkt Üernommen....

Es erstellt eine neue EXE und diese ist auch gepatcht

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?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 14:00
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.
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#10

Re: EXE Patchen (nichts illegales!!)

  Alt 30. Dez 2007, 14:02
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
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz