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
Seite 5 von 12   « Erste     345 67     Letzte »    
a.def
(Gast)

n/a Beiträge
 
#41

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 01:11
Zitat:
Wenn die Checksumme am Ende steht, so steht da ja noch nicht drin, über welchen Bereich der Exe sie gemacht wurde. Muss ja nicht die ganze Exe sein, könnten ja auch nur die ersten X Byte sein. Oder MD5-Checksumme einer MD5-Checksumme oder die Checksumme wird vorm Speichern noch mit irgend 'nem Wert gexodert ...
Bei mir steht aktuell nur eine Checksumme am Ende der Exe. Der Programmstart hat sich deshalb schon um ~200ms verlangsamt. Reicht mir erstmal
Zum Hashen benutze ich, wie man in der Unit sieht, übrigens nicht DEC sondern System.Hash.THash ....

Nochmal zu meiner Ausgangsfrage:
ist es denn überhaupt möglich mit DEC einen String zu hashen?

Geändert von a.def ( 3. Mai 2017 um 01:41 Uhr)
 
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#42

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 12:24
Hallo a.def

ich hatte dir via PN geantwortet.

Öffne ein neues Projekt, setze einen Button aufs Form und kopiere den Text unten rein.

Starte das Programm und klick auf den Button.

Deine exe sieht momentan so aus:
¦FILE EXE TEIL 1¦In EXE nach diesem Text suchen..¦FILE EXE TEIL 2¦

Wenn du den Button drückst, dann wird der Hash Wert h von
¦FILE EXE TEIL 1¦FILE EXE TEIL 2¦
berechnet.

Anschliessend wird eine neue exe md5c.exe erzeugt mit Inhalt:
¦FILE EXE TEIL 1¦<h>¦FILE EXE TEIL 2¦
Anstelle von "In EXE nach diesem Text suchen.." steht also nun der Wert von h in md5c.exe.

Starte md5c.exe. Drücke den Button. md5c.exe berechnet den Hash Wert von
¦FILE EXE TEIL 1¦FILE EXE TEIL 2¦
und liest den Wert von h aus md5c.exe

Die beiden Werte werden in der Zeile "showmessage" miteinander verglichen.

Man kann's sicher kürzer und besser schreiben (und du musst natürlich noch "try finally/except end" einbauen) ...aber es funktioniert.


Delphi-Quellcode:

var
  a : RawByteString = 'In EXE nach diesem Text suchen..';


implementation

{$R *.dfm}


function TByteToHex( b : TBytes ): RawByteString;
var i : integer;
begin
  Result := '';
  for i := 0 to High(b) do
    Result := Result + RawByteString(inttohex( b[i] ));
end;


procedure TForm77.Button1Click(Sender: TObject);
var f2, f : TBytesStream;
    mf, mfc : string;
    hp : int64;
    hashRaw : RawByteString;

begin
  mf := extractfilepath(application.ExeName) + 'md5.exe';
  mfc := extractfilepath(application.ExeName) + 'md5c.exe';

  if copyfile( PChar(application.ExeName), PChar(mf), false ) then
  begin
     f := TBytesStream.Create;
     f.LoadFromFile( mf );
     hp := pos( RawByteString(a), RawByteString(f.Bytes) );
     f2 := TBytesStream.Create;
     f2.Write( f.Bytes[0], hp-1 );
     f2.Write( f.Bytes[hp+length(a)], f.Size - (hp+length(a)) + 1 );

     hashRaw := TByteToHex( System.hash.THashMD5.GetHashBytes( f2 ) );

     showmessage( string(hashraw) + #10 + string(a) + #10 + (hashraw=a).ToInteger.ToString );

     if extractfilename( application.ExeName ) <> 'md5c.exethen
     begin
        move( hashRaw[1], f.Bytes[hp-1], length(a) );
        f.SaveToFile( mfc );
     end;
     f.Free;
     close;

     DeleteFile( mf );
  end;
end;
Michael Gasser
 
a.def
(Gast)

n/a Beiträge
 
#43

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 12:55
Danke für die Erklärung! Beim ersten f2.Write ist hinten das +1 zuviel glaube ich. Ich habs weggenommen denn sonst wird ein NULL-Zeichen mit verarbeitet das es nicht gibt.

Delphi-Quellcode:
 aByteStream := TBytesStream.Create;
 try
  aByteStream.LoadFromFile(aFileName);
  iPosRawByte := Pos(RawByteString(a), RawByteString(aByteStream.Bytes));

  if iPosRawByte > 0 then
   begin
    aByteStream2 := TBytesStream.Create;
    try
     aByteStream2.Write(aByteStream.Bytes[0], iPosRawByte - 1);
     aByteStream2.Write(aByteStream.Bytes[iPosRawByte + Length(a)], aByteStream.Size - (iPosRawByte + Length(a)));
     aByteStream2.SaveToFile('_STREAM.txt'); // zum test um mir zu zeigen, was in aBytesStream2 vorhanden ist

     hashRaw := TByteToHex(System.hash.THashMD5.GetHashBytes(aByteStream2));

     ShowMessage(string(hashRaw) + #10 + string(a) + #10 + (hashRaw = a).ToInteger.ToString);
    finally
     aByteStream2.Free;
    end;
   end;
 finally
  aByteStream.Free;
 end;
Irgendwo scheint es aber noch ein Problem zu geben. hashRaw ist bei mir D41D8CD98F00B204E9800998ECF8427E, es sollte aber 2708D4849D8E94F1FB0F8145999B632A sein.
Ob da irgendwo was mit der Umwandlung von Byte to Hex schiefgeht?

Edit
mit folgender Zeile klappt es und der Hash ist korrekt. Nur ob das eine schöne Lösung ist?
hashRaw := System.hash.THashMD5.GetHashString(Trim(TEncoding.ANSI.GetString(aByteStream2.Bytes)));

Nur das erneute Auslesen des Hashes funktioniert nicht. Denn wenn ich den RawByteString ersetze, kann ich ja später nicht mehr nach ihm suchen.

Geändert von a.def ( 3. Mai 2017 um 13:23 Uhr)
 
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#44

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 13:31
Hallo a.def

1.
wenn du das Programm startest, sind natürlich die Hash Werte voneinander verschieden, denn es wird ja

"In EXE nach diesem Text suchen.." als Hash Wert interpretiert und verglichen mit dem Hash Wert von ¦FILE EXE TEIL 1¦FILE EXE TEIL 2¦.

Wenn du aber die vom Programm erzeugte md5c.exe startest, dann steht anstelle von "In EXE nach diesem Text suchen.." nun der Hash Wert von ¦FILE EXE TEIL 1¦FILE EXE TEIL 2¦. Die Hash Werte sollten nun übereinstimmen.

2.
Zitat:
Beim ersten f2.Write ist hinten das +1 zuviel glaube ich
Nebenbei: Beim ersten f2.write steht am Ende ein -1 und nicht +1 .

Rasch checken: Wie viele Bytes b werden in f2 geschrieben?

b = (hp-1) + (f.Size - (hp+length(a)) + 1) = f.Size-length(a)

Korrekte Länge.

Hast du mit meinem Codete getestet oder mit deinem?
Michael Gasser

Geändert von Michael II ( 3. Mai 2017 um 13:41 Uhr)
 
a.def
(Gast)

n/a Beiträge
 
#45

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 13:36
Habe deinen Code genommen und angepasst. Das hier ist mein Code. Ehrlich gesagt verstehe ich noch nicht, wie man TEIL1 und TEIL2 wieder zusammenfügen sollen, wenn am Ende doch ein Hash dazwischen steht.

Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var
 aByteStream, aByteStream2: TBytesStream;
 iPosRawByte: Int64;
 sHash: string;
begin
 // Save hash on the position of RawByteString "a"

 aByteStream := TBytesStream.Create;
 try
  aByteStream.LoadFromFile(aFileName);
  iPosRawByte := Pos(RawByteString(a), RawByteString(aByteStream.Bytes));

  if iPosRawByte > 0 then
   begin
    aByteStream2 := TBytesStream.Create;
    try
     aByteStream2.Write(aByteStream.Bytes[0], iPosRawByte - 1);
     aByteStream2.Write(aByteStream.Bytes[iPosRawByte + Length(a)], aByteStream.Size - (iPosRawByte + Length(a))); // +1 entfernt, da Hash sonst falsch
     // Original: f2.Write( f.Bytes[hp+length(a)], f.Size - (hp+length(a)) + 1 );

     sHash := System.hash.THashSHA2.GetHashString(Trim(TEncoding.ANSI.GetString(aByteStream2.Bytes))); // abgeändert, da Hash sonst ebenfalls falsch
     // Original: hashRaw := TByteToHex( System.hash.THashMD5.GetHashBytes( f2 ) );

     Move(AnsiString(sHash)[1], aByteStream.Bytes[iPosRawByte - 1], Length(a));
     aByteStream.SaveToFile(aFileName);
    finally
     aByteStream2.Free;
    end;
   end;
 finally
  aByteStream.Free;
 end;
end;
Das hier ist meine Prozedur die -nur- dafür da ist den Hash in die Datei zu schreiben.

Erklärung;
ich habe ein kleines Tool, welches NUR dafür da ist die Hashwerte ans Ende von jeder meiner Exe-Dateien zu schreiben.
Ich schiebe dem Tool einfach meine Exe-Dateien in ein Memo, klicke den Button und alle Exen werden angepasst.

Geändert von a.def ( 3. Mai 2017 um 13:41 Uhr)
 
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#46

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 14:15
Du schreibst

beim ersten Mal
iPosRawByte - 1

und beim zweiten Mal
aByteStream.Size - (iPosRawByte + Length(a))

Bytes in deinen aByteStream2. Insgesamt also

iPosRawByte - 1 + aByteStream.Size - iPosRawByte - Length(a)

=
aByteStream.Size - 1 - length(a)

Ist nicht schlimm, da du die allermeisten Bytes deiner exe ja berücksichtigst - und weil du es beim Schreiben und Lesen gleich machst.

Ich würde auf TypeCasts wie AnsiString(..) String(..) wenn immer möglich verzichten.

Die Trim Funktion ist soweit ich sehe falsch. Es könnte ja sein, dass in deinem BytesStream vorne oder hinten der Code für das Leerzeichen steht. Mit Trim löschst du diese Leerzeichen Bytes. OK In diesem Anwendungsfall eher nicht [Byte 1 im exe Header ist immer gleich, am Ende der exe?]. Aber wenn du den Code anderswo so verwendest, verlierst du u.U. Infos, bevor du den Hash ermittelst. Also weg damit

Zitat:
Ehrlich gesagt verstehe ich noch nicht, wie man TEIL1 und TEIL2 wieder zusammenfügen sollen, wenn am Ende doch ein Hash dazwischen steht
Diese Teile sind in der "Quell exe" und in der "Ziel exe" identisch. Deshalb "hashen" wir über diese beiden Teile.
Michael Gasser
 
a.def
(Gast)

n/a Beiträge
 
#47

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 14:31
Ich verstehe es leider nicht. ich bleibe lieber beim alten System

Das Schreiben/modifizieren verstehe ich.

Was ich aber in keinster Weise verstehe ist, wie ich mit der modifizierten Exe (die sich ja SELBER prüft!) wieder an genau die stelle kommen soll, wo der RawByteString durch den Hash ersetzt wurde.
Denn zum Prüfen müsste ich ja von INHALT1<HASH>INHALT2 den <HASH> entfernen, damit ich INHALT1 INHALT2 hashen kann und mit <HASH> vergleichen kann.
Nur die Position ist mir ja, nachdem mit der Exe ( dem Tool die meine Exen modifiziert) die Programm-Exe ansich modifiziert wurde, nicht mehr bekannt da ich sie nicht mehr finden kann.

Geändert von a.def ( 3. Mai 2017 um 14:33 Uhr)
 
nahpets
(Gast)

n/a Beiträge
 
#48

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 14:38
Deshalb hatte ich ja in meinem Beispiel die vier @ davor und dahinter.

Das ist die Kennung der Position.

Du brauchst in der Exe eine Dir bekannte Information, die sagt: Hier hinter steht der Hash.

Oder zwischen diesen beiden steht der Hash, ja nach dem, wie Du es lieber lösen möchtest.
 
a.def
(Gast)

n/a Beiträge
 
#49

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 14:39
Zitat:
Du brauchst in der Exe eine Dir bekannte Information, die sagt: Hier hinter steht der Hash.
Das war die fehlende Information denke ich.

ich dachte das ist ein NoGo? ich teste es mal.
 
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#50

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 14:44
Und noch etwas:

Mir fällt gerade auf, dass du nun nicht mehr MD5 sondern SHA2 verwendest.

SHA2 Hashs sind länger als MD5. Du musst dies bei deiner Wahl von "a" berücksichtigen.


Im "Fall MD5" wird

a : RawByteString = 'In EXE nach diesem Text suchen..';

in der Ziel exe ersetzt durch sowas wie das hier:

a : RawByteString = 'a8910908bcd9012ba29208210120cd9e';

Wenn du SHA2 verwendest, dann muss dein a doppelt so lang definiert sein.

Wenn du dein a zu kurz wählst, dann überschreibst du Dinge, die du besser stehen lässt .

[Ich habe noch einmal meinen Code gecheckt - und finde keine Fehler. Solltest du meinen Code bei dir laden und laufen lassen und einen Fehler entdecken, dann schreib mir. Danke. Ich verlasse dieses Thema.]
Michael Gasser
 
Thema geschlossen
Seite 5 von 12   « Erste     345 67     Letzte »    


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 11:29 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