Skip to content

Commit 7671016

Browse files
committed
Upgrade to v2.1
Fix the problem that SHA256 Timetamp does not work Hook SignerTimeStampEx2 Hook SignerTimeStampEx3
1 parent 7fd98e0 commit 7671016

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

HookSigntool/main.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ HMODULE hModCrypt32 = NULL, hModMssign32 = NULL, hModKernel32 = NULL;
1010
using fntCertVerifyTimeValidity = decltype(CertVerifyTimeValidity);
1111
using fntSignerSign = decltype(SignerSign);
1212
using fntSignerTimeStamp = decltype(SignerTimeStamp);
13+
using fntSignerTimeStampEx2 = decltype(SignerTimeStampEx2);
14+
using fntSignerTimeStampEx3 = decltype(SignerTimeStampEx3);
1315
using fntGetLocalTime = decltype(GetLocalTime);
1416
fntCertVerifyTimeValidity* pOldCertVerifyTimeValidity = NULL;
1517
fntSignerSign* pOldSignerSign = NULL;
1618
fntSignerTimeStamp* pOldSignerTimeStamp = NULL;
19+
fntSignerTimeStampEx2* pOldSignerTimeStampEx2 = NULL;
20+
fntSignerTimeStampEx3* pOldSignerTimeStampEx3 = NULL;
1721
fntGetLocalTime* pOldGetLocalTime = NULL;
1822

1923
int year = -1, month = -1, day = -1, hour = -1, minute = -1, second = -1;
@@ -66,6 +70,33 @@ HRESULT WINAPI NewSignerTimeStamp(
6670
{
6771
return (*pOldSignerTimeStamp)(pSubjectInfo, ReplaceTimeStamp(pwszHttpTimeStamp), psRequest, pSipData);
6872
}
73+
HRESULT WINAPI NewSignerTimeStampEx2(
74+
_Reserved_ DWORD dwFlags,
75+
_In_ SIGNER_SUBJECT_INFO* pSubjectInfo,
76+
_In_ LPCWSTR pwszHttpTimeStamp,
77+
_In_ ALG_ID dwAlgId,
78+
_In_ PCRYPT_ATTRIBUTES psRequest,
79+
_In_ LPVOID pSipData,
80+
_Out_ SIGNER_CONTEXT** ppSignerContext
81+
)
82+
{
83+
return (*pOldSignerTimeStampEx2)(dwFlags, pSubjectInfo, ReplaceTimeStamp(pwszHttpTimeStamp), dwAlgId, psRequest, pSipData, ppSignerContext);
84+
}
85+
HRESULT WINAPI NewSignerTimeStampEx3(
86+
_In_ DWORD dwFlags,
87+
_In_ DWORD dwIndex,
88+
_In_ SIGNER_SUBJECT_INFO* pSubjectInfo,
89+
_In_ PCWSTR pwszHttpTimeStamp,
90+
_In_ PCWSTR pszAlgorithmOid,
91+
_In_opt_ PCRYPT_ATTRIBUTES psRequest,
92+
_In_opt_ PVOID pSipData,
93+
_Out_ SIGNER_CONTEXT** ppSignerContext,
94+
_In_opt_ PCERT_STRONG_SIGN_PARA pCryptoPolicy,
95+
_Reserved_ PVOID pReserved
96+
)
97+
{
98+
return (*pOldSignerTimeStampEx3)(dwFlags, dwIndex, pSubjectInfo, ReplaceTimeStamp(pwszHttpTimeStamp), pszAlgorithmOid, psRequest, pSipData, ppSignerContext, pCryptoPolicy, pReserved);
99+
}
69100
void WINAPI NewGetLocalTime(
70101
LPSYSTEMTIME lpSystemTime
71102
)
@@ -95,25 +126,34 @@ bool HookFunctions()
95126
if ((pOldCertVerifyTimeValidity = (fntCertVerifyTimeValidity*)GetProcAddress(hModCrypt32, "CertVerifyTimeValidity")) == NULL
96127
|| (pOldSignerSign = (fntSignerSign*)GetProcAddress(hModMssign32, "SignerSign")) == NULL
97128
|| (pOldSignerTimeStamp = (fntSignerTimeStamp*)GetProcAddress(hModMssign32, "SignerTimeStamp")) == NULL
129+
|| (pOldSignerTimeStampEx2 = (fntSignerTimeStampEx2*)GetProcAddress(hModMssign32, "SignerTimeStampEx2")) == NULL
130+
|| ((pOldSignerTimeStampEx3 = (fntSignerTimeStampEx3*)GetProcAddress(hModMssign32, "SignerTimeStampEx3")) == NULL && FALSE)
131+
/* SignerTimeStampEx3 does not exist in Windows 7 */
98132
|| (pOldGetLocalTime = (fntGetLocalTime*)GetProcAddress(hModKernel32, "GetLocalTime")) == NULL)
99133
return false;
100134

101135
if (DetourTransactionBegin() != NO_ERROR
102136
|| DetourAttach(&(PVOID&)pOldCertVerifyTimeValidity, NewCertVerifyTimeValidity) != NO_ERROR
103137
|| DetourAttach(&(PVOID&)pOldSignerSign, NewSignerSign) != NO_ERROR
104138
|| DetourAttach(&(PVOID&)pOldSignerTimeStamp, NewSignerTimeStamp) != NO_ERROR
139+
|| DetourAttach(&(PVOID&)pOldSignerTimeStampEx2, NewSignerTimeStampEx2) != NO_ERROR
140+
|| (pOldSignerTimeStampEx3 != NULL ? DetourAttach(&(PVOID&)pOldSignerTimeStampEx3, NewSignerTimeStampEx3) != NO_ERROR : FALSE)
141+
/* SignerTimeStampEx3 does not exist in Windows 7 */
105142
|| DetourAttach(&(PVOID&)pOldGetLocalTime, NewGetLocalTime) != NO_ERROR
106143
|| DetourTransactionCommit() != NO_ERROR)
107144
return false;
145+
108146
return true;
109147
}
110148
bool ParseConfig(LPWSTR lpCommandLineConfig, LPWSTR lpCommandLineTimestamp)
111149
{
112150
LPWSTR buf = new WCHAR[260];
113151
memset(buf, 0, sizeof(WCHAR) * 260);
152+
114153
if (_wgetcwd(buf, 260) == NULL)
115154
return false;
116155
wcscat(buf, L"\\");
156+
117157
if (lpCommandLineConfig) {
118158
if ((wcschr(lpCommandLineConfig, L':') - lpCommandLineConfig) == 1) {
119159
memset(buf, 0, sizeof(WCHAR) * 260);
@@ -138,6 +178,7 @@ bool ParseConfig(LPWSTR lpCommandLineConfig, LPWSTR lpCommandLineTimestamp)
138178
wsprintfW(lpTimestamp, lpCommandLineTimestamp);
139179
else
140180
GetPrivateProfileStringW(L"Timestamp", L"Timestamp", NULL, lpTimestamp, 20, buf);
181+
141182
return true;
142183
}
143184
BOOL WINAPI DllMain(
@@ -160,11 +201,15 @@ BOOL WINAPI DllMain(
160201
if (!wcscmp(szArglist[i], L"-ts"))
161202
its = i + 1;
162203
}
204+
163205
if (!ParseConfig(iconfig >= 0 ? szArglist[iconfig] : NULL, its >= 0 ? szArglist[its] : NULL))
164206
MessageBoxW(NULL, L"配置初始化失败,请检查hook.ini和命令行参数!", L"初始化失败", MB_ICONERROR);
207+
165208
LocalFree(szArglist);
209+
166210
if (!HookFunctions())
167211
MessageBoxW(NULL, L"出现错误,无法Hook指定的函数\r\n请关闭程序重试!", L"Hook失败", MB_ICONERROR);
212+
168213
MessageBoxW(NULL, lpTimestamp, L"自定义时间戳为", MB_OK);
169214
}
170215
return 1;

HookSigntool/mssign32.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ typedef struct _SIGNER_BLOB_INFO {
1313
BYTE* pbBlob;
1414
LPCWSTR pwszDisplayName;
1515
} SIGNER_BLOB_INFO, * PSIGNER_BLOB_INFO;
16+
typedef struct _SIGNER_CONTEXT {
17+
DWORD cbSize;
18+
DWORD cbBlob;
19+
BYTE* pbBlob;
20+
} SIGNER_CONTEXT, * PSIGNER_CONTEXT;
1621

1722
typedef struct _SIGNER_CERT_STORE_INFO {
1823
DWORD cbSize;
@@ -91,3 +96,24 @@ HRESULT WINAPI SignerTimeStamp(
9196
_In_opt_ PCRYPT_ATTRIBUTES psRequest,
9297
_In_opt_ LPVOID pSipData
9398
);
99+
HRESULT WINAPI SignerTimeStampEx2(
100+
_Reserved_ DWORD dwFlags,
101+
_In_ SIGNER_SUBJECT_INFO* pSubjectInfo,
102+
_In_ LPCWSTR pwszHttpTimeStamp,
103+
_In_ ALG_ID dwAlgId,
104+
_In_ PCRYPT_ATTRIBUTES psRequest,
105+
_In_ LPVOID pSipData,
106+
_Out_ SIGNER_CONTEXT** ppSignerContext
107+
);
108+
HRESULT WINAPI SignerTimeStampEx3(
109+
_In_ DWORD dwFlags,
110+
_In_ DWORD dwIndex,
111+
_In_ SIGNER_SUBJECT_INFO* pSubjectInfo,
112+
_In_ PCWSTR pwszHttpTimeStamp,
113+
_In_ PCWSTR pszAlgorithmOid,
114+
_In_opt_ PCRYPT_ATTRIBUTES psRequest,
115+
_In_opt_ PVOID pSipData,
116+
_Out_ SIGNER_CONTEXT** ppSignerContext,
117+
_In_opt_ PCERT_STRONG_SIGN_PARA pCryptoPolicy,
118+
_Reserved_ PVOID pReserved
119+
);

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66

77
## 原理
88
编译出的`HookSigntool.dll`通过微软的Detours库Hook了签名工具的函数调用以达到目的
9-
总共Hook了4个函数
9+
总共Hook了6个函数
1010
1. [crypt32.dll!CertVerifyTimeValidity](https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certverifytimevalidity) 返回值改为0,让签名工具误以为所有证书都在有效期内,以便在不修改系统时间的情况下用过期证书签名。
1111
2. [mssign32!SignerSign](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signersign) 传入参数 pwszHttpTimeStamp 修改为自建时间戳地址(自建时间戳接受地址中设定的时间,用以伪造签名)
1212
3. [mssign32!SignerTimeStamp](https://docs.microsoft.com/en-us/windows/win32/seccrypto/signertimestamp) 同上
13-
4. [kernel32.dll!GetLocalTime](https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlocaltime) 返回值根据配置文件修改,对于程序功能无影响。
13+
4. [mssign32!SignerTimeStampEx2](https://docs.microsoft.com/zh-cn/windows/win32/seccrypto/signertimestampex2) 同上
14+
5. [mssign32!SignerTimeStampEx3](https://docs.microsoft.com/zh-cn/windows/win32/seccrypto/signertimestampex3) 同上 (此函数在 Windows 7 上不存在)
15+
6. [kernel32.dll!GetLocalTime](https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlocaltime) 返回值根据配置文件修改,对于程序功能无影响。
1416

1517
## 用法
1618
这个`dll`有两种设置方法,一种是`ini`文件,另一种是命令行参数

0 commit comments

Comments
 (0)