AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
Thema durchsuchen
Ansicht
Themen-Optionen

wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)

Ein Thema von TKC · begonnen am 3. Feb 2005 · letzter Beitrag vom 1. Jun 2018
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#21

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

  Alt 7. Apr 2005, 20:41
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#22

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

  Alt 8. Apr 2005, 09:24
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...)
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#23

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

  Alt 11. Apr 2005, 20:30
wo wir gerade dabei sind ... wie hättest du denn das mit der union choice in der WINTRUST_DATA gelöst ?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#24

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

  Alt 11. Apr 2005, 20:59
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).
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#25

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

  Alt 13. Apr 2005, 13:00
hmm ... das mit dem Case funktioniert so aber nicht ... (hatte ich ursprünglich auch mal so)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#26

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

  Alt 13. Apr 2005, 13:16
Zitat von ACE-ppc:
hmm ... das mit dem Case funktioniert so aber nicht
Was funktioniert nicht?
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...
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#27

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

  Alt 15. Apr 2005, 08:20
naja ... das problem sind die Speicher Leaks die dabei übrig bleiben

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

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


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

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.
Miniaturansicht angehängter Grafiken
debug_638.jpg  
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#28

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

  Alt 15. Apr 2005, 08:38
Zitat von ACE-ppc:
naja ... das problem sind die Speicher Leaks die dabei übrig bleiben
Ich kann den Zusammenhang nicht ganz nachvollziehen...
(vielleicht liegt's am fehlenden Kaffee)

Zitat von ACE-ppc:
was man jetzt wissen muss (oder in einem Debugger anschaut ) 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
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...
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#29

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

  Alt 15. Apr 2005, 13:08
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

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.
  Mit Zitat antworten Zitat
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#30

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

  Alt 11. Mär 2015, 17:53
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 21:48 Uhr.
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