AGB  ·  Datenschutz  ·  Impressum  







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

DEC 5.2 String hashen?

Ein Thema von a.def · begonnen am 2. Mai 2017 · letzter Beitrag vom 7. Mai 2017
Thema geschlossen
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: DEC 5.2 String hashen?

  Alt 4. Mai 2017, 14:45
Exe erstellen.
Mit UPX packen.
MD5-Checksumme (oder auch beliebige andere) hinten dran hängen.
Frage: Kann man die Prüfung dann auch "mal eben" wegpatchen?
UPX bietet - wie du ja selbst erwähnst - von Haus aus eine Funktion an, mit der man Dateien wieder entpacken kann. Bietet also auch keinen größeren Schutz. Man patcht nicht den Hash, sondern die Prüfung ansich.

Die Änderung müsste dann wohl eher zur Laufzeit im Arbeitsspeicher passieren.
Diese Möglichkeit gibt es natürlich auch noch jederzeit. Entweder per Loader, oder man modifiziert die IAT, um dem Programm eine extra DLL unterzumogeln. Lohnt sich bei Tools, welche auch erst zur Laufzeit (partiell) unpacked werden und so gute Hash-Checks besitzen, dass es vom Zeitaufwand schnell in die Stunden/Tage gehen könnte sie auszubauen.

Wenn es zeitlich und räumlich nicht so nah ist, und an zig verschiedenen Stellen,
wird es zumindest nicht so leicht zu hacken sein.
Das ist in der Tat schonmal eine Stufe aufwändiger - besonders, wenn man eine dynamische Analyse per Debugger vornimmt.

Der Hacker braucht ja events um zu checken wann geprüft wird und wann wans entschieden wird.
Exakt. Wobei viele Leute auch statische Analysen mit IDA vornehmen und dabei nicht auf irgendwelche Events angewiesen sind. Hierfür muss man allerdings in der Regel schon direkt mehr Zeit einplanen, um relevante Codestellen zu finden.

Aktuell ist meine Unit umfangreich mit ein paar Einstellungsmöglichkeiten und ich brauche nur an einer einzigen Stelle etwas hinschreiben, damit der Selbsttest ausgeführt wird.
Genau das ist aber leider absolut kein Vorteil. Hast du eine inline Funktion, welche du an mehreren Stellen - z.b. wie von Rollo beschrieben beim Auftreten "zufälliger" Events - einsetzt, dann muss ich auch diverse Stellen patchen und kann mir außerdem erstmal nie sicher sein, wirklich alle Vorkommen gefunden zu haben. Nagut, habe ich eine Stelle, kann ich nach der entsprechenden Code-Signatur im ganzen Programm suchen, aber im Optimalfall verwendest du mehrere komplett individuelle Funktionen.

Edit:
Ich habe mal noch ein paar Bilder angehangen, die die Vorgehensweise demonstrieren. Den String zu verschleiern würde in diesem Falle keinen Mehrwert erzeugen, da man stattdessen auch einen Breakpoint auf MSDN-Library durchsuchenMessageBoxW setzen könnte. Und selbst komplett ohne MessageBox kann man die Routine finden, welche den hinterlegten Hash aus der Datei ausliest, indem man einen BP auf MSDN-Library durchsuchenCreateFileW platziert.
Angehängte Grafiken
Dateityp: png 1.png (42,9 KB, 17x aufgerufen)
Dateityp: jpg 2.jpg (152,1 KB, 18x aufgerufen)
Dateityp: jpg 3.jpg (141,2 KB, 15x aufgerufen)
Dateityp: png 4.png (8,7 KB, 12x aufgerufen)
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 4. Mai 2017 um 14:58 Uhr)
 
a.def
(Gast)

n/a Beiträge
 
#2

AW: DEC 5.2 String hashen?

  Alt 4. Mai 2017, 15:11
Zitat:
aber im Optimalfall verwendest du mehrere komplett individuelle Funktionen.
Habe ich zum Glück schon. Mein Programm prüft einmal diese Hash-Sache und dann aber noch etwas komplett anderes.

Zitat:
indem man einen BP auf CreateFileW platziert.
Um CreateFileW kommt man vermutlich nicht herum richtig? (Datei anderweitig laden)

Allgemeine Frage an dich nahpets:
wirst du deine Methode weiterhin benutzen und einen Selbsttest durchführen?

Geändert von a.def ( 4. Mai 2017 um 15:24 Uhr)
 
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: DEC 5.2 String hashen?

  Alt 4. Mai 2017, 15:34
Zitat:
indem man einen BP auf CreateFileW platziert.
Um CreateFileW kommt man vermutlich nicht herum richtig? (Datei anderweitig laden)
Würde mir zumindest auf Anhieb jetzt keine Möglichkeit einfallen, die nicht genauso einfach zu erkennen ist.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
 
a.def
(Gast)

n/a Beiträge
 
#4

AW: DEC 5.2 String hashen?

  Alt 4. Mai 2017, 15:38
Zitat:
Würde mir zumindest auf Anhieb jetzt keine Möglichkeit einfallen, die nicht genauso einfach zu erkennen ist.
Ok. Zeugenvernehmung beendet. Urteil gesprochen: Zacherl hat das Zepter und kommt eh um alles rum
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.502 Beiträge
 
Delphi 12 Athens
 
#5

AW: DEC 5.2 String hashen?

  Alt 4. Mai 2017, 16:06
Die wichtigen Teile der EXE sind in den RAM gemappt, also kann man das auch im RAM hashen, anstatt die Datei.
Nur muß man hier erstmal alle Teile finden, da erstens die PE-Sektionen einzeln geladen werden, die Reallocationstabellen übershrieben werden und auch überall die Sprung-/Speicheradressen werden vom Windows gepatcht, wenn das Image im RAM verschoben wurde.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Mai 2017 um 16:16 Uhr)
 
a.def
(Gast)

n/a Beiträge
 
#6

AW: DEC 5.2 String hashen?

  Alt 4. Mai 2017, 16:10
Klingt kompliziert und resultiert bestimmt wieder in keinerlei Mehrwert. Denn CreateFile muss man ja nicht suchen denke ich.
 
a.def
(Gast)

n/a Beiträge
 
#7

AW: DEC 5.2 String hashen?

  Alt 5. Mai 2017, 08:47
Eine Frage hätte ich noch. Ich habe gerade mal beobachtet wie die "E/A Bytes (Lesen)" im Taskmanager aussieht nachdem ich mein Testprogramm starten.
Mit meinem aktuellen Code und einem <Stream>.LoadFromFile() geht der o.g. Wert direkt in die Höhe. Ich würde mal sagen dort steht dann Programmgröße + 200KB.

Wenn ich folgenden Code verwende, dann passiert das nicht. Woran liegt das?
Delphi-Quellcode:
 aFileStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite);
 try
  // Get hash from stream end
  SetLength(s, 32 * SizeOf(Byte));
  aFileStream.Position := aFileStream.Size - Length(s);
  aFileStream.Read(s[1], Length(s));

  ShowMessage(s);
 finally
  aFileStream.Free;
 end;
Wo ist also der Unterschied was den Wert "E/A Bytes (Lesen)" angeht zwischen den Zeilen unten?

Delphi-Quellcode:
// Verursaacht hohe (Programmgröße + ~100KB) "E/A Bytes (Lesen)" im Taskmanager
aByteStream := TBytesStream.Create;
aByteStream.LoadFromFile(ParamStr(0));

// Verursacht dieses Problem nicht
aFileStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyWrite);
Und: gibt es eine Lösung TBytesStream zu verwenden -ohne- dieses Problem im TaskManager? (TStringStream verursacht diese Anzeige übrigens auch)
 
Thema geschlossen


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 08:34 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