Entwickler-Ecke
Windows API - UPX komprimierte Dateien erkennen per Auslesen des Header???
CB - Mi 12.06.02 10:41
Titel: UPX komprimierte Dateien erkennen per Auslesen des Header???
Hi!
Vielleicht kennt der ein oder andere den Executable Packer UPX. Da es sich bei diesem Programm um ein Kommandozeilen Tool handelt, habe ich eine GUI dafür programmiert, so dass es sich besser benutzen lässt.
Des weiteren habe ich eine ShellExtension dafür geschrieben, die zwei neue Einträge im Kontextmenü erstellt, welches erscheint, wenn man auf eine ausführbare Datei mit der rechten Maustaste klickt (z.B. im Windows Explorer).
Die zwei Einträge dienen zum Starten meiner GUI mit der angeklickten Datei als Parameter bzw. zum direkten Komprimieren mit UPX. Nun möchte ich, falls die ausgewählte Datei schon mit UPX komprimiert ist, die Einträge natürlich zum Dekomprimieren benutzen. Allerdings muss ich nun erkennen können, ob eine Datei mit UPX komprimiert ist.
Das scheint über die PE Header der Datei zu gehen. Allerdings hab ich keine Ahnung, wie man die ausliest. (Wenn möglich auch noch ohne Benutzung der VCL, da sonst die ShellExtension viel zu groß wird.)
Also meine Frage: Wie kann man per Code herausfinden, ob eine Datei mit UPX komprimiert wurde?
Danke schonmal für Antworten...
Ach ja...falls sich jemand da Programm ansehen will. Ihr findet es unter Download auf [url]
http://www.thebartels.de[/url]
toms - Mi 12.06.02 12:01
Hi,
Die Funktion IsUPXPacked durchsucht den Anfang der Exe-Datei
nach dem String UPX.
Vielleicht gibt's noch andere/bessere Methoden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function IsUPXPacked(const FileName: TFileName): Boolean; var l: Longint; sUPX: string; f: file; begin Result := False; sUPX := 'UPX'; AssignFile(f, FileName); Reset(f, 1); for l := 0 to 600 do begin Seek(f, l); BlockRead(f, sUPX[1], Length(sUPX)); if sUPX = 'UPX' then begin Result := True; Break; end; end; CloseFile(f); end; |
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
CB - Mi 12.06.02 12:33
Mh...ok...die sauberste Lösung ist es nicht...aber für den Notfall muss das reichen...
Hat noch jemand eine Idee?
overmoon - Mi 12.06.02 19:53
Titel: nicht suchen ?
Wie ich das sehe sucht er nach dem String UPX in der Datei.
Vielleicht steht das ja immer an der gleichen Stelle,
dann müsste man wenigstens nicht nach ihnen suchen ?
overmoon
d3g - Do 20.06.02 20:53
Hi Leute,
mein erster Post im neuen Forum :)
Eine weitere Möglichkeit ist es, UPX aufzurufen und den Konsolen-Output zu lesen. Es kommt schließlich zu einer Fehlermeldung, wenn UPX Komprimierungsdaten für einen ungepackten File auslesen will (Paramater -l). Das ist eine ziemlich sichere und, wie ich finde, nicht unelegeante Art.
Hier ein Code, der das bewerkstelligen könnte (Grundlage dieses Codes ist das Anonymous Pipes-Beispiel von NicoDE):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| function CheckIfFileCompressed(AUPXPath, AFileName: String): Boolean; var SecAttr: TSecurityAttributes; dwPipeRead: DWORD; dwPipeWrite: DWORD; StartInfo: TStartupInfo; ProcInfo: TProcessInformation; Buffer: array [0..1024] of Char; dwBytesRead: DWORD; szStringRead: String; begin Result := True; try SecAttr.nLength := SizeOf(TSecurityAttributes); SecAttr.lpSecurityDescriptor := nil; SecAttr.bInheritHandle := True; if CreatePipe(dwPipeRead, dwPipeWrite, @SecAttr, 0) then begin FillChar(StartInfo, SizeOf(TStartupInfo), 0); StartInfo.cb := SizeOf(TStartupInfo); StartInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; StartInfo.hStdOutput := dwPipeWrite; StartInfo.hStdError := dwPipeWrite; StartInfo.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar('"' + AUPXPath + '\upx.exe" -l "' + AFileName + '"'), nil, nil, True, CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProcInfo) then begin CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); CloseHandle(dwPipeWrite);
while True do begin Application.ProcessMessages; FillChar(Buffer, SizeOf(Buffer), 0); if ReadFile(dwPipeRead, Buffer, SizeOf(Buffer) - 1, dwBytesRead, nil) then begin szStringRead := szStringRead + String(Buffer); if (Pos('NotPackedException', szStringRead) > 0) then Result := False; end else Break; end; end; CloseHandle(dwPipeRead); end; except CloseHandle(dwPipeRead); end; end; |
Der Code ist nur ein Ansatz, da er absolut nicht iditoensicher ist (UPX-Path kann falsch sein, FileNotFoundException muss abgefangen werden, usw.). Das dürfte aber eigentlich leicht zu integrieren sein.
MfG,
d3g
Post Scriptum: Ist es möglich, das Forum so umzuschreiben, dass man auch innerhalb von Code formatieren kann? Der [i]-Tag-Bug fällt zwar weg, aber so ganz ohne Formatierungen find ich es auch nicht so übersichtlich...
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
toms - Do 20.06.02 23:43
Zitat: |
Post Scriptum: Ist es möglich, das Forum so umzuschreiben, dass man auch innerhalb von Code formatieren kann? Der [i]-Tag-Bug fällt zwar weg, aber so ganz ohne Formatierungen find ich es auch nicht so übersichtlich... |
Hab ich ja auch immer gesagt. Darum sollte man HTML einführen.
Unter SwissDelphiCenter läuft bestens mit HTML. Aber vielleicht
sind wir hier auch mal soweit.
tom
Tino - Fr 21.06.02 09:24
@ d3g & toms: Hallo Ihr beiden. HTML wird nicht freigeschaltet (wozu auch? Formatierungsmöglichkeiten gibt es genug). Das man innerhalb von Code-Tags keine Formatierungen angeben kann kann man positiv oder negativ sehen. Ich für meinen Teil bin erstmal froh das das Problem mit der Variable I nicht mehr vorhanden ist. Eventl. wird in Zukunft Pascal-Code automatisch formatiert dargestellt. Aber auch nur eventl :-D Wenn noch Diskussionsbedarf besteht dann bitte in der richtigen Sparte und nicht hier.
Gothicware - Di 22.02.05 02:39
Bei meinem Crack Spielzeugkasten hab ich "CodeDaemon by Viper" gefunden.
Der erkennt so ziemlich alle EXE-Copressor und Compiler.
Denn UPX kann auch (bis auf wenige ausnahmen) keine anderen bereit Kompriemierten Exe Kompriemieren. (Liegt an der veränderung des Headers).
Aber schau mal unter *entfernt* nach.
Das ist ne wirklich gute Seite zum Thema, leider nur in English und Japanisch oder sowas. :-)
Bei einen der VIIEELLEN Tuts, ist bestimmt was dabei.
Moderiert von
raziel: Link zu Seite mit gecrackter Software entfernt
raziel - Di 22.02.05 08:03
Hallo Gothicware,
ich habe den Link zur von dir angegebenen Seite entfernt, da auf ihr u.a. offensichtlich auch gecrackte Software angeboten wird. Bitte unterlasse es in Zukunft, Links auf solche Seiten zu posten, danke!
Gruß,
raziel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!