Autor Beitrag
CB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 23



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



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

ausblenden 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 user profile iconraziel: Code- durch Delphi-Tags ersetzt.
CB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 23



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 16



BeitragVerfasst: 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



BeitragVerfasst: 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):
ausblenden volle Höhe 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..1024of Char;
  dwBytesRead: DWORD;
  szStringRead: String;
begin
  Result := True;
  try
    SecAttr.nLength := SizeOf(TSecurityAttributes);
    SecAttr.lpSecurityDescriptor := nil;
    // create anonymous pipe
    SecAttr.bInheritHandle := True;
    // initialize the startup info for the new process
    if CreatePipe(dwPipeRead, dwPipeWrite, @SecAttr, 0then begin
      FillChar(StartInfo, SizeOf(TStartupInfo), 0);
      StartInfo.cb := SizeOf(TStartupInfo);
      StartInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      StartInfo.hStdOutput := dwPipeWrite;  // route output to pipe
      StartInfo.hStdError := dwPipeWrite;   // route output to pipe
      StartInfo.wShowWindow := SW_HIDE;     // this flag says that the commandprompt will be hidden

      // create the process, Inherited  has to be true, so the pipe handles will
      // be available in new process
      if CreateProcess(nil, PChar('"' + AUPXPath + '\upx.exe" -l "' + AFileName + '"'),
                       nilnil, True, CREATE_NEW_CONSOLE, nilnil, StartInfo,
                       ProcInfo)
      then begin
        // close the handles which will be created in the createProcess method
        // we don't need them anyway
        CloseHandle(ProcInfo.hProcess);
        CloseHandle(ProcInfo.hThread);
        // Close the pipe for writing
        // now the anonymous pipe knows in which direction to work
        // anonyme pipes only work in one direction
        CloseHandle(dwPipeWrite);

        // do it again and again to get all output generated by the program
        while True do begin
          Application.ProcessMessages;
          FillChar(Buffer, SizeOf(Buffer), 0);
          if ReadFile(dwPipeRead, Buffer, SizeOf(Buffer) - 1, dwBytesRead, nilthen begin
            szStringRead := szStringRead + String(Buffer);
            // check if file is packed
            if (Pos('NotPackedException', szStringRead) > 0then
      Result := False;
          end else
            Break;
        end;
      end;
      // release pipehandles
      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 user profile iconraziel: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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
BeitragVerfasst: 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 user profile iconraziel: Link zu Seite mit gecrackter Software entfernt
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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