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
a.def
(Gast)

n/a Beiträge
 
#1

AW: DEC 5.2 String hashen?

  Alt 2. Mai 2017, 22:05
Ok das ist mir dann doch etwas zu teuer und für eine Freeware absolut nicht nötig.
Zur Edge-Meldung. Ich habe gerade meine Datei, die schon seit Dezember auf dem Server liegt, selber runtergeladen und diese Meldung nicht erhalten. Es war eine Exe-Datei.

Was den Hash angeht. Wo könnte man ihn denn sonst verstecken? Denn sobald ich den Inhalt meiner Exe mit notepad++ ändere, und auch wenn es nur 1 Byte ist, ist die Exe wohl "kaputt".
 
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: DEC 5.2 String hashen?

  Alt 2. Mai 2017, 23:26
Ok das ist mir dann doch etwas zu teuer und für eine Freeware absolut nicht nötig.
Zur Edge-Meldung. Ich habe gerade meine Datei, die schon seit Dezember auf dem Server liegt, selber runtergeladen und diese Meldung nicht erhalten. Es war eine Exe-Datei.

Was den Hash angeht. Wo könnte man ihn denn sonst verstecken? Denn sobald ich den Inhalt meiner Exe mit notepad++ ändere, und auch wenn es nur 1 Byte ist, ist die Exe wohl "kaputt".
So ist das vgl.


Was u.U eine Möglichkeit wäre, Platz für den Hash und sein "Spiegelbild" vorbelegen, damit die Prüfsummenprüfung nicht zuschlägt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
 
nahpets
(Gast)

n/a Beiträge
 
#3

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 00:07
Eigentlich "gaaaaanz" einfach

Definiere eine Stringkonstante im Quelltext.

csMD5 = '@@@@HashwertHashwertHashwertHashwert@@@@'

Dann berechnest Du den Hashwert unter Auslassung des Bereiches in der Exe, der von der Konstanten belegt wird. (Das zwischen den beiden @@@@.)

Den Wert der Konstanten ersetzt Du anschließend durch den Hashwert.

Beim Prüfen berechnest Du den Hashwert unter Auslassung des Bereiches zwischen den @@@@ und vergleichst ihn mit dem Wert zwischen den @@@@.

Soweit, so theoretisch.

Ich bleib lieber bei der Checksumme am Ende der Exe. Wer die Checksumme am Ende synchron zur Exe so manipulieren kann, dass Deine Prüfung nicht fehlschlägt, ändert sie auch irgendwo mitten in der Exe.

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

Oder anders:

Man kann's auch übertreiben.
Konsequent zuende gedacht kommt man hier dann zum klassischen Wettrüsten.

Code:
While Universum besteht do begin
  Krieg ich's noch sicherer?
  Die Sicherung kann ich knacken!
end.
 
a.def
(Gast)

n/a Beiträge
 
#4

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 00: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 00:41 Uhr)
 
Michael II

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

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 11: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
 
#6

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 11: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 12:23 Uhr)
 
Michael II

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

AW: DEC 5.2 String hashen?

  Alt 3. Mai 2017, 12: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 12:41 Uhr)
 
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 19:01 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