![]() |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Zitat:
|
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Zitat:
(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...) |
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 ?
|
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Etwa so:
Delphi-Quellcode:
Falls die Zeiger in der Union jemals nil sein können, sollte man ^TWinTrustXxx in PWinTrustXxx ändern (um den Vergleich auf nil zu vereinfachen).
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} |
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)
|
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Zitat:
Zitat:
|
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:
was man jetzt wissen muss (oder in einem Debugger anschaut :roll: ) ist ...
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; 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:
mit deiner deklaration in Delphi sind aber alle 5 Pointer gleich, sprich alle
PWINTRUST_SGNR_INFO = $12F310
PWINTRUST_FILE_INFO = $12F318 PWINTRUST_CATALOG_INFO = $12F326 PWINTRUST_BLOB_INFO = $12F334 PWINTRUST_CERT_INFO = $12F342 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:
Um das zu erkennen war wirklich harte Arbeit Debugger notwendig.
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 |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Zitat:
(vielleicht liegt's am fehlenden Kaffee) Zitat:
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... |
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. |
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 14:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz