![]() |
wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
Hi Leute,
ich würde gern das Zertifikat aus einer EXE auslesen, wie sigcheck von ![]() Bin nun schon seit 2 Tagen dran das zu realisieren und habe noch nicht ein mal einen Ansatz :wall: ! Hat jemand einen Denkanstoß für mich? Bin für jeden Tip dankbar. cya |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
wenn ich mich recht entsinne dann sind solche Funktionen in ImageHlp.dll enthalten.
Gruß Hagen |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
hi,
danke ! super ! ... genau der Ansatz hat mir gefehlt .. ich werde mal ne Unit dafür machen, evtl. kann das ja noch jemand gebrauchen. cya |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
hi,
also irgendwie komme ich da nicht weiter ....
Delphi-Quellcode:
Der Windows Explorer hat definitiv ein Zertifikat.
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR hFile : THandle; x : DWORD; px : pdword; BEGIN hFile := CreateFile(PChar('c:\windows\explorer.exe'), FILE_READ_DATA, 0,0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); IF hFile = 0 THEN exit; x := 0; px := @x; IF ImageEnumerateCertificates(hFile, CERT_SECTION_TYPE_ANY, px, NIL, 0) THEN BEGIN x:=px^; ShowMessage(IntToStr(x)); END; END; Was mache ich falsch ? :?: |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
hat denn wirklich keiner ne Idee um mir zu helfen :cry:
Es muss doch irgendwie gehen.... |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Zitat:
BTW: try-finally wäre passender als Resourcenschutz (Handle schließen) |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
schon klar ... hilft mir aber nicht viel weiter... :gruebel:
|
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Vielleicht hat deine Explorer.exe keine Zertifikats-Sektion.
(Kartenreiter 'Digitale Signaturen' in den Dateieigenschaften) Bei mir funktioniert (unter Wine) folgendes problemlos:
Delphi-Quellcode:
Explorer.exe = 0
function ImageEnumerateCertificates(FileHandle: THandle; TypeFilter: Word;
out CertificateCount: DWORD; Indices: PDWORD; IndexCount: DWORD): BOOL; stdcall; external 'imagehlp.dll' name 'ImageEnumerateCertificates'; procedure TForm1.Button1Click(Sender: TObject); const FILE_READ_DATA = $01; CERT_SECTION_TYPE_ANY = $FF; var FileHandle: THandle; CertificateCount: DWORD; begin FileHandle := CreateFile(PChar('D:\borland\delphi3\BIN\delphi32.exe'), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0); if FileHandle = INVALID_HANDLE_VALUE then ShowMessage('CreateFile: ' + SysErrorMessage(GetLastError)) else try CertificateCount := 0; if not ImageEnumerateCertificates(FileHandle, CERT_SECTION_TYPE_ANY, CertificateCount, nil, 0) then ShowMessage('ImageEnumerateCertificates: ' + SysErrorMessage(GetLastError)) else ShowMessage('CertificateCount: ' + IntToStr(CertificateCount)); finally CloseHandle(FileHandle); end; end; delphi32.exe = 1 Wenn ich mich recht erinnere, sind die delphi32.exe der anderen Delphi-Versionen nicht digital signiert... Gruß Nico |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
hmm ... klappt bei mir auch nicht ... auch mit deinem Code und der bds.exe nicht.
Der Windows Explorer hat definitif eins ... ! D:\Daten\Software\Systemtools\Sysinternals>sigchec k.exe c:\winnt\explorer.exe
Delphi-Quellcode:
das muss ja irgendwo herkommen ?
Sigcheck v1.1
Copyright (C) 2004-2005 Mark Russinovich Sysinternals - [url]www.sysinternals.com[/url] c:\winnt\explorer.exe: Verified: Signed Signing date: 06:30 20.06.2003 Publisher: Microsoft Corporation Description: Windows Explorer Product: Betriebssystem Microsoft(R) Windows (R) 2000 Version: 5.00.3700.6690 File version: 5.00.3700.6690 |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Is' Sigcheck eigentlich für alle Windowsversionen gedacht?
Vielleicht hilft es dir ja auch, wenn du dir mal ansiehst, welche DLL's das Proggi aufruft.. |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
naj .. sigcheck läuft auf allen NT Systemen ...
Statisch bindet das Programm nicht viel ein .. es wird alles Dynamisch nachgeladen ... habe trotzdem mal nen Dump gemacht..
Delphi-Quellcode:
bin jetzt am Analysieren , mal sehen ob ich da weiter komme.
Executable modules
Base Size Entry Name File version Path 00400000 00011000 0040317A sigcheck 1.10 D:\Daten\Software\Systemtools\Sysinternals\sigcheck.exe 74F90000 00008000 74F911AE WS2HELP 5.00.2134.1 C:\WINNT\system32\WS2HELP.DLL 74FA0000 00014000 74FA1C85 WS2_32 5.00.2195.6601 C:\WINNT\system32\WS2_32.DLL 74FC0000 00009000 WSOCK32 5.00.2195.6603 C:\WINNT\system32\WSOCK32.DLL 750C0000 0000F000 750C10D4 SAMLIB 5.00.2195.6897 C:\WINNT\system32\SAMLIB.dll 750E0000 0004F000 750EE53B netapi32 5.00.2195.6949 C:\WINNT\system32\netapi32.dll 75130000 00006000 NETRAP 5.00.2134.1 C:\WINNT\system32\NETRAP.dll 75940000 00006000 75941A6A LZ32 5.00.2195.6611 C:\WINNT\system32\LZ32.DLL 76080000 00050000 760BB257 WINHTTP 5.1.2600.1327 (x C:\WINNT\system32\WINHTTP.DLL 768D0000 0002B000 768F3440 Wintrust 5.131.2195.6824 C:\WINNT\system32\Wintrust.dll 772A0000 00069000 772A6271 SHLWAPI 6.00.2800.1584 ( C:\WINNT\system32\SHLWAPI.dll 77400000 00010000 77408C6C MSASN1 5.00.2195.6905 C:\WINNT\system32\MSASN1.DLL 77810000 00007000 77811334 VERSION 5.00.2195.6623 C:\WINNT\system32\VERSION.dll 77880000 00083000 ntdll 5.00.2195.6899 C:\WINNT\system32\ntdll.dll 77910000 00023000 77911158 IMAGEHLP 5.00.2195.6613 C:\WINNT\system32\IMAGEHLP.dll 77940000 0002B000 779410C0 WLDAP32 5.00.2195.6666 C:\WINNT\system32\WLDAP32.DLL 77970000 00024000 779712C2 DNSAPI 5.00.2195.6824 C:\WINNT\system32\DNSAPI.DLL 779A0000 0009B000 77A14030 OLEAUT32 2.40.4522 C:\WINNT\system32\OLEAUT32.dll 77A40000 000EF000 77A5B5CC ole32 5.00.2195.6906 C:\WINNT\system32\ole32.dll 77BE0000 00011000 77BE3FF0 NTDSAPI 5.00.2195.6666 C:\WINNT\system32\NTDSAPI.dll 77D20000 00071000 77D23E30 RPCRT4 5.00.2195.6904 C:\WINNT\system32\RPCRT4.dll 77E00000 0005F000 77E0DF34 USER32 5.00.2195.7017 C:\WINNT\system32\USER32.dll 77E70000 000C0000 77E77A40 KERNEL32 5.00.2195.6946 C:\WINNT\system32\KERNEL32.DLL 77F40000 0003B000 GDI32 5.00.2195.6945 C:\WINNT\system32\GDI32.dll 78000000 00045000 78001000 MSVCRT 6.10.9844.0 C:\WINNT\system32\MSVCRT.dll 791A0000 00062000 791EB67A USERENV 5.00.2195.6794 C:\WINNT\system32\USERENV.dll 79350000 00062000 79351ECE ADVAPI32 5.00.2195.6876 C:\WINNT\system32\ADVAPI32.DLL 79430000 0000F000 79432B19 secur32 5.00.2195.6695 C:\WINNT\system32\secur32.dll 79990000 00012000 7999135C cryptnet 5.131.2195.6824 C:\WINNT\system32\cryptnet.dll 799D0000 00087000 799D14C4 CRYPT32 5.131.2195.6824 C:\WINNT\system32\CRYPT32.dll 7CA00000 00023000 7CA0D3BA rsaenh 5.00.2195.6611 C:\WINNT\system32\rsaenh.dll |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
sooo .... hab jetzt mal bisl spioniert wie sigcheck da vorgeht ...
Delphi-Quellcode:
Werde nun mal den Versuch starten das im Delphi nachzubauen .. :???:
Wintrust.CryptCATAdminAcquireContext
/hTemplateFile |Attributes = NORMAL |Mode = OPEN_EXISTING |pSecurity = NULL |ShareMode = FILE_SHARE_READ |Access = GENERIC_READ |FileName \CreateFileW Wintrust.CryptCATAdminCalcHashFromFileHandle Wintrust.CryptCATAdminEnumCatalogFromHash Wintrust.CryptCATCatalogInfoFromContext ("C:\WINNT\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\sp4.cat" für Explorer.exe) Wintrust.WinVerifyTrust Wintrust.CryptCATAdminReleaseCatalogContext |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
so .... nach nen paar Tagen coden und debuggen hab ichs geschafft .... es funktioniert :-D
ich poste den Quellcode sobald ich ihn etwas aufgeräumt und dokumentiert habe ... wenns jemanden interessiert. |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
so... ich habe die Unit in die Code Lib gepostet ... :wink:
danke für die minimale Hilfe. |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
hmm was bringt einem das?
Wie kann ich nun selber programme signieren oder eine signatur einer exe hinzufügen? :gruebel: Bye |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
du kannst damit prüfen ob eine Date eine Signatur enthält und ob sie gültig ist.
Das kann man z.B. für einen Dateiscanner nutzen ... um nur unsignierte Dateien anzuzeigen. Oder um Einträge in einer Autorun Liste zu prüfen .... usw. |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Ok und wie signiere ich meine Datein?
Bye |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Bei div. von Microsoft authorisierten Partnern. A la Verisign gegen eine absolut minimale Gebühr.
Ich kenn die Gebühr zwar nicht, aber auch wenn sie wirklich minimal sein sollte, wird sich das bei entsprechender Nutzung garantiert ändern. |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Liste der Anhänge anzeigen (Anzahl: 2)
Da meine Unit in der Code Lib einfach gelöscht wurde poste ich sie eben hier noch mal :evil:
Updates: - einige Bugs gefixt - Speicherleaks beseitigt Als Anlage die neue Unit und ein kleines Beispiel Programm (setze ich täglich ein) |
Re: wie Signatur/Certific. von EXE auslesen (wie sigcheck.ex
Sollte
Code:
nicht so
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;
Code:
aussehen?
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} Gruß Nico |
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 |
AW: wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo TKC, vielen Dank für deine Unit uSimpleTrustCheck.pas in der Code-Bibliothek!
Ich habe das mal mit Windows Explorer getestet:
Code:
Darauf kam folgende Meldung, die ich ehrlich gesagt noch niemals gesehen habe:
IsSigned := uSimpleTrustCheck.CheckFileTrust('C:\Windows\explorer.exe');
Anhang 49189 Darauf machte ich den Test mit sigcheck, das die Signatur ganz normal darstellte: Anhang 49190 Weiß jemand, woran der Fehler mit uSimpleTrustCheck liegen könnte? |
AW: wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
sry war Verboten was ich schrieb.
|
AW: wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
Zitat:
|
AW: wie Signatur/Certific. von EXE auslesen (wie sigcheck.exe)
Ist eine Urheberrechtssache gegen die ich Verstoßen hätte von daher Beitrag entfernt und auch keine weiteren Reaktionen meinerseits dazu. Tut mir leid!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 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