Autor |
Beitrag |
CB
      
Beiträge: 23
|
Verfasst: Mi 12.06.02 10:41
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] www.thebartels.de[/url]
_________________ mfg\CB
|
|
toms
      
Beiträge: 1099
Erhaltene Danke: 2
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: 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?
_________________ mfg\CB
|
|
overmoon
      
Beiträge: 16
|
Verfasst: 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
Hält's aus hier
Beiträge: 3
|
Verfasst: 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):
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.
_________________ One OS to rule them all, one OS to find them.
One OS to brimng the all and in the darkness bind them.
|
|
toms
      
Beiträge: 1099
Erhaltene Danke: 2
|
Verfasst: 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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: 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  Wenn noch Diskussionsbedarf besteht dann bitte in der richtigen Sparte und nicht hier.
|
|
Gothicware
      
Beiträge: 77
Win 98, Win 2000, Win XP, BeOs-R5, Zeta 1.0(war nicht gut, also verkauft), KnoppiX, VM-Ware
D4 Client/Server, Turbo Basic, QBasic, Atari-Basic
|
Verfasst: 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
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: 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
_________________ JSXGraph
|
|
|