Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe) (https://www.delphipraxis.net/39528-wie-signatur-certific-von-exe-auslesen-wie-sigcheck-exe.html)

TKC 7. Apr 2005 20:41

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
Zitat:

Zitat von NicoDE
Sollte
Code:
  CATALOG_INFO = record
    cbStruct: DWORD;                             // = sizeof(WINTRUST_CATALOG_INFO)
    sCatalogFile: array[[color=red]0..MAX_PATH[/color]] of WCHAR;   // Dateiname incl. Pfad zur CAT Datei
  end;
  PCATALOG_INFO = ^CATALOG_INFO;
nicht so
Code:
type
  PCatalogInfo = ^TCatalogInfo;
  PCATALOG_INFO = PCatalogInfo;
  {$EXTERNALSYM PCATALOG_INFO}
  CATALOG_INFO_ = record
    cbStruct     : DWORD;                          // = SizeOf(TCatalogInfo)
    wszCatalogFile: array [[color=green]0..MAX_PATH-1[/color]] of WCHAR; // Name of the catalog file.
  end;
  {$EXTERNALSYM CATALOG_INFO_}
  TCatalogInfo = CATALOG_INFO_;
  CATALOG_INFO = CATALOG_INFO_;
  {$EXTERNALSYM CATALOG_INFO}
aussehen?

Gruß Nico

so kann man es auch machen ... welchen Vorteil hat das denn :gruebel:

NicoDE 8. Apr 2005 09:24

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
Zitat:

Zitat von ACE-ppc
so kann man es auch machen ...

Ich meinte nur die fehlende -1.
(der Rest ist Routine beim Konvertieren von APIs, die Deklaration des C-Pointes ist zwar nicht Borland-konform, dafür aber besser bei var-Parametern...)

TKC 11. Apr 2005 20:30

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
:-D wo wir gerade dabei sind ... wie hättest du denn das mit der union choice in der WINTRUST_DATA gelöst ?

NicoDE 11. Apr 2005 20:59

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
Etwa so:
Delphi-Quellcode:
type
  PWinTrustData = ^TWinTrustData;
  PWINTRUST_DATA = PWinTrustData;
  {$EXTERNALSYM PWINTRUST_DATA}
  _WINTRUST_DATA = record
    cbStruct          : DWORD; // SizeOf(TWinTrustData)
    pPolicyCallbackData: Pointer;
    pSIPClientData    : Pointer;
    dwUIChoice        : DWORD; // WTD_UI_*
    fdwRevocationChecks: DWORD; // WTD_REVOKE_*
    case dwUnionChoice : DWORD of
      WTD_CHOICE_FILE  : (pFile  : ^TWinTrustFileInfo);
      WTD_CHOICE_CATALOG: (pCatalog: ^TWinTrustCatalogInfo);
      WTD_CHOICE_BLOB  : (pBlob  : ^TWinTrustBlobInfo);
      WTD_CHOICE_SIGNER : (pSgnr  : ^TWinTrustSgnrInfo);
      WTD_CHOICE_CERT  : (pCert  : ^TWinTrustCertInfo;
  { end; }
    dwStateAction: DWORD;       // Reserved = 0
    hWVTStateData: THandle);    // Reserved = THandle(nil)
  end;
  {$EXTERNALSYM _WINTRUST_DATA}
  TWinTrustData = _WINTRUST_DATA;
  WINTRUST_DATA = _WINTRUST_DATA;
  {$EXTERNALSYM WINTRUST_DATA}
Falls die Zeiger in der Union jemals nil sein können, sollte man ^TWinTrustXxx in PWinTrustXxx ändern (um den Vergleich auf nil zu vereinfachen).

TKC 13. Apr 2005 13:00

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
hmm ... das mit dem Case funktioniert so aber nicht :warn: ... (hatte ich ursprünglich auch mal so)

NicoDE 13. Apr 2005 13:16

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
Zitat:

Zitat von ACE-ppc
hmm ... das mit dem Case funktioniert so aber nicht :warn:

Was funktioniert nicht?
Zitat:

Zitat von ACE-ppc
(hatte ich ursprünglich auch mal so)

Bitte die 'verschobene' Klammer des letzten varianten Ausdrucks nicht übersehen, da die Delphi Language keine Member nach varianten Teilen zulässt. Und ob ich nun 'foo: dword; case dword of' oder 'case foo: dword of' schreibe ist egal...

TKC 15. Apr 2005 08:20

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
Liste der Anhänge anzeigen (Anzahl: 1)
naja ... das problem sind die Speicher Leaks die dabei übrig bleiben :warn:

Ok ... schaun wir uns das im Original noch mal an.
Code:
typedef struct _WINTRUST_DATA {
    DWORD cbStruct;
    LPVOID pPolicyCallbackData;
    LPVOID pSIPClientData;
    DWORD dwUIChoice;
    DWORD fdwRevocationChecks;
    DWORD dwUnionChoice;
    union {
          struct WINTRUST_FILE_INFO_* pFile;
          struct WINTRUST_CATALOG_INFO_* pCatalog;
          struct WINTRUST_BLOB_INFO_* pBlob;
          struct WINTRUST_SGNR_INFO_* pSgnr;
          struct WINTRUST_CERT_INFO_* pCert;
        };
    DWORD dwStateAction;
    HANDLE hWVTStateData;
    WCHAR* pwszURLReference;
    DWORD dwProvFlags;
    DWORD dwUIContext;
} WINTRUST_DATA,
*PWINTRUST_DATA;
was man jetzt wissen muss (oder in einem Debugger anschaut :roll: ) ist ...
im c++ wird der Pointer, der über dwUnionChoice gewählt wurde,
an die erste Stelle im Speicher verschoben und die anderen kommen hinten dran :warn:
z.B.
dwUnionChoice = 3 (WINTRUST_SGNR_INFO)
dann sieht es im Speicher so aus
Code:
  PWINTRUST_SGNR_INFO    = $12F310
  PWINTRUST_FILE_INFO   = $12F318
  PWINTRUST_CATALOG_INFO = $12F326
  PWINTRUST_BLOB_INFO   = $12F334
  PWINTRUST_CERT_INFO   = $12F342
mit deiner deklaration in Delphi sind aber alle 5 Pointer gleich, sprich alle
sind auf $12F310 (siehe Angefügtes Bild)

Die Funktion WinVerifyTrust() legt im Hintergrund 5 der Strukturen an und weist ihnen Speicher zu.
Jetzt schiebst du die WINTRUST_DATA mit 5 Pointern rein die alle auf den gleichen Platz im Speicher
verweisen !
Wenn dann der Aufruf durch ist versucht die Funktion den Speicher Freizugeben .. doch nanu ... an stelle der
5 Speicheradressen ist nur noch eine da ... naja dann gibt sie halt nur eine von den 5 frei !!!

Und schon iss es passiert ein richtig fettes Leak (rund 2-4MB weil intern noch etliche unterstrukturen da waren) :warn:

Wenn ich das mit meiner Hand ausdrücken soll .. würde ich es so erklären:

WinVerifyTrust() hat 5 Löcher wo jeweils nur 1 Finger reinpasst und keines freibleiben darf ...
also musst man 5 Finger reinstecken und wieder rausziehen und nicht einen in 5 Löcher :stupid:


Der Spass hat mich ne ganze weile beschäftigt .... :x

Der Trick ist nun ... wie du dir sicherlich schon denken kannst... es folgender maßen zu deklarieren
Delphi-Quellcode:
    dwUnionChoice: DWORD;                        // benötigt, welche Datenstruktur soll verwendet werden
    pWTDINFO: pointer;                           // Pointer zu einer der Wintrust_X_Info Strukturen
    pFake: pointer;                              //Fake Pointer - nötig damit der Speicer wieder freigegeben wird
    pFake1: pointer;                             //Fake Pointer - nötig damit der Speicer wieder freigegeben wird
    pFake2: pointer;                             //Fake Pointer - nötig damit der Speicer wieder freigegeben wird
    pFake3: pointer;                             //Fake Pointer - nötig damit der Speicer wieder freigegeben wird
Um das zu erkennen war wirklich harte Arbeit Debugger notwendig.

NicoDE 15. Apr 2005 08:38

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
Zitat:

Zitat von ACE-ppc
naja ... das problem sind die Speicher Leaks die dabei übrig bleiben :warn:

Ich kann den Zusammenhang nicht ganz nachvollziehen...
(vielleicht liegt's am fehlenden Kaffee)

Zitat:

Zitat von ACE-ppc
was man jetzt wissen muss (oder in einem Debugger anschaut :roll: ) ist ...
im c++ wird der Pointer, der über dwUnionChoice gewählt wurde,
an die erste Stelle im Speicher verschoben und die anderen kommen hinten dran :warn:
z.B.
dwUnionChoice = 3 (WINTRUST_SGNR_INFO)
dann sieht es im Speicher so aus
Code:
  PWINTRUST_SGNR_INFO    = $12F310
  PWINTRUST_FILE_INFO   = $12F318
  PWINTRUST_CATALOG_INFO = $12F326
  PWINTRUST_BLOB_INFO   = $12F334
  PWINTRUST_CERT_INFO   = $12F342

Tut mir leid, aber den C/C++-Compiler möchte ich gerne sehen...
Eine Union ist nunmal dazu da, dass die Member an der gleichen Adresse beginnen.
Vielleicht ist der Debugger nicht in der Lage die Debug-Informationen anständlig zu parsen/anzuzeigen, oder MS hat sich bei der Deklaration vertan - die Dokumentation behauptet weiterhin die Struktur wäre in WinBase.h deklariert...

TKC 15. Apr 2005 13:08

Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
 
wenn du meinst ... teste es doch mal, dann wirst du feststellen das du ein Speicher Leak bekommst.

Btw ... die Pointer waren nur Beispiele ... aber ich kann dir ja ein Messer schicken .. dann kannst du
damit die Haare spalten :-D

Also be mir ist die laut doku in der wintrust.h ... und zwar so:

Code:
//////////////////////////////////////////////////////////////////////////////
//
// WINTRUST_DATA Structure
//----------------------------------------------------------------------------
//  Used when calling WinVerifyTrust to pass necessary information into
//  the Providers.
//
typedef struct _WINTRUST_DATA
{
    DWORD          cbStruct;                  // = sizeof(WINTRUST_DATA)

    LPVOID         pPolicyCallbackData;       // optional: used to pass data between the app and policy
    LPVOID         pSIPClientData;            // optional: used to pass data between the app and SIP.

    DWORD          dwUIChoice;                // required: UI choice. One of the following.
#                       define     WTD_UI_ALL             1
#                       define     WTD_UI_NONE            2
#                       define     WTD_UI_NOBAD           3
#                       define     WTD_UI_NOGOOD          4

    DWORD          fdwRevocationChecks;       // required: certificate revocation check options
#                       define     WTD_REVOKE_NONE        0x00000000
#                       define     WTD_REVOKE_WHOLECHAIN  0x00000001

    DWORD          dwUnionChoice;             // required: which structure is being passed in?
#                       define     WTD_CHOICE_FILE        1
#                       define     WTD_CHOICE_CATALOG     2
#                       define     WTD_CHOICE_BLOB        3
#                       define     WTD_CHOICE_SIGNER      4
#                       define     WTD_CHOICE_CERT        5
    union
    {
        struct WINTRUST_FILE_INFO_      *pFile;        // individual file
        struct WINTRUST_CATALOG_INFO_   *pCatalog;     // member of a Catalog File
        struct WINTRUST_BLOB_INFO_      *pBlob;        // memory blob
        struct WINTRUST_SGNR_INFO_      *pSgnr;        // signer structure only
        struct WINTRUST_CERT_INFO_      *pCert;
    };

    DWORD          dwStateAction;                     // optional (Catalog File Processing)
#                       define     WTD_STATEACTION_IGNORE          0x00000000
#                       define     WTD_STATEACTION_VERIFY          0x00000001
#                       define     WTD_STATEACTION_CLOSE           0x00000002
#                       define     WTD_STATEACTION_AUTO_CACHE      0x00000003
#                       define     WTD_STATEACTION_AUTO_CACHE_FLUSH 0x00000004

    HANDLE         hWVTStateData;                     // optional (Catalog File Processing)

    WCHAR          *pwszURLReference;         // optional: (future) used to determine zone.

calibra301 11. Mär 2015 17:53

AW: wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
 
Hallo,

grabe das Thema mal aus...folgendes Problem:
Ich benutze eine DLL die bis vor kurzem SHA1 signiert war. Nun SHA256.
Unter XP SP3 (welches SHA256 TEILWEISE können soll ) geht die Prüfung leider gegen den Baum.
WinVerifyTrust gibt einen negativen Wert zurück.

Ja..ich weiss..XP ist veraltet...aber manche nutzen es trotzdem noch. Genau wie ich immer noch D6 :-)
Hatte schon jemand ein ählniches Prob ?

Gruss
Calli


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 Uhr.
Seite 3 von 4     123 4      

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