📄 signcsp.cpp
字号:
ErrorExit:
exit(exStatus);
}
void CallServer(void)
{
RpcTryExcept
{
cbSignatureLen = sizeof(pbSignature);
if (GenSignature(pbDigest, &cbSignatureLen, pbSignature))
{
printf("GenSignature returned an error \n");
ExitThread(TRUE);
}
}
RpcExcept(1)
{
printf("RPC error -- exception code is 0x%X\n", RpcExceptionCode());
ExitThread(RpcExceptionCode());
}
RpcEndExcept
ExitThread(FALSE);
}
// Given hInst, allocs and returns pointers to signature pulled from
// resource
BOOL GetCryptSigResourcePtr(
HMODULE hInst,
BYTE **ppbRsrcSig,
DWORD *pcbRsrcSig
)
{
HRSRC hRsrc;
BOOL fRet = FALSE;
// Nab resource handle for our signature
if (NULL == (hRsrc = FindResource(hInst, CRYPT_SIG_RESOURCE_NUMBER,
RT_RCDATA)))
goto Ret;
// get a pointer to the actual signature data
if (NULL == (*ppbRsrcSig = (PBYTE)LoadResource(hInst, hRsrc)))
goto Ret;
// determine the size of the resource
if (0 == (*pcbRsrcSig = SizeofResource(hInst, hRsrc)))
goto Ret;
fRet = TRUE;
Ret:
return fRet;
}
// Given hInst, hashes over the file skipping, hashing zero bytes where the
// resource is
BOOL HashTheFile(
LPCSTR pszFile,
DWORD dwCRCOffset,
BYTE *pbHash,
DWORD *pcbHash,
DWORD cbImage
)
{
MEMORY_BASIC_INFORMATION MemInfo;
BYTE *pbRsrcSig;
DWORD cbRsrcSig;
BYTE *pbStart;
BYTE *pbZeroSig = NULL;
MD5_CTX MD5Hash;
DWORD dwZeroCRC = 0;
DWORD cbPreCRC; // start of CRC
DWORD cbCRCToSig; // end of CRC to start of sig
BYTE *pbPostCRC; // just after CRC
DWORD cbPostSig; // size - (already hashed + signature size)
BYTE *pbPostSig;
HMODULE hInst = 0;
BOOL fRet = FALSE;
memset(&MD5Hash, 0, sizeof(MD5Hash));
memset(&MemInfo, 0, sizeof(MemInfo));
// Load the file as a datafile
if (NULL == (hInst = LoadLibraryEx(pszFile, NULL, LOAD_LIBRARY_AS_DATAFILE)))
goto Ret;
// get image start address
VirtualQuery(hInst, &MemInfo, sizeof(MemInfo));
pbStart = (BYTE*)MemInfo.BaseAddress;
// the resources signature
if (!GetCryptSigResourcePtr(hInst, &pbRsrcSig, &cbRsrcSig))
goto Ret;
// create a zero byte signature
if (NULL == (pbZeroSig = (BYTE*)LocalAlloc(LMEM_ZEROINIT, cbRsrcSig)))
goto Ret;
// want to hash the version and the CRC offset
CopyMemory(pbZeroSig, &dwSigInFileVersion, sizeof(dwSigInFileVersion));
CopyMemory(pbZeroSig + sizeof(dwSigInFileVersion), &dwCRCOffset,
sizeof(dwCRCOffset));
// hash over the relevant data
{
pbPostCRC = pbStart + dwCRCOffset + sizeof(dwZeroCRC);
cbCRCToSig = (DWORD)(pbRsrcSig - pbPostCRC);
pbPostSig = pbRsrcSig + cbRsrcSig;
cbPostSig = (cbImage - (DWORD)(pbPostSig - pbStart));
MD5Init(&MD5Hash);
MD5Update(&MD5Hash, pbStart, dwCRCOffset);
// pretend CRC is zeroed
MD5Update(&MD5Hash, (BYTE*)&dwZeroCRC, sizeof(dwZeroCRC));
// pretend image has zeroed sig
MD5Update(&MD5Hash, pbPostCRC, cbCRCToSig);
// pretend image has zeroed sig
MD5Update(&MD5Hash, pbZeroSig, cbRsrcSig);
MD5Update(&MD5Hash, pbPostSig, cbPostSig);
// Finish the hash
MD5Final(&MD5Hash);
*pcbHash = MD5DIGESTLEN;
memcpy(pbHash, MD5Hash.digest, MD5DIGESTLEN);
}
fRet = TRUE;
Ret:
if (hInst)
FreeLibrary(hInst);
if (pbZeroSig)
LocalFree(pbZeroSig);
return fRet;
}
DWORD GetCRCOffset(
LPCSTR szFile,
DWORD cbImage,
DWORD *pdwCRCOffset
)
{
DWORD dwErr = 0x1;
HANDLE hFileProv = NULL;
PBYTE pbFilePtr = NULL;
DWORD OldCheckSum;
DWORD NewCheckSum;
PIMAGE_NT_HEADERS pImageNTHdrs;
HANDLE hFileMap = NULL;
if (INVALID_HANDLE_VALUE == (hFileProv = CreateFile(szFile,
GENERIC_READ | GENERIC_WRITE,
0, // don't share
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0)))
{
printf("Couldn't CreateFile: 0x%x\n", GetLastError());
goto Ret;
}
if (NULL == (hFileMap = CreateFileMapping(
hFileProv,
NULL,
PAGE_READWRITE,
0,
0,
NULL)))
{
printf("Couldn't map file\n");
goto Ret;
}
if (NULL == (pbFilePtr = (PBYTE)MapViewOfFile(
hFileMap,
FILE_MAP_ALL_ACCESS,
0,
0,
0)))
{
printf("Couldn't create view\n");
goto Ret;
}
// compute a new checksum
if (NULL == (pImageNTHdrs = CheckSumMappedFile(pbFilePtr, cbImage,
&OldCheckSum, &NewCheckSum)))
goto Ret;
*pdwCRCOffset = (DWORD)((BYTE*)&pImageNTHdrs->OptionalHeader.CheckSum - pbFilePtr);
dwErr = ERROR_SUCCESS;
Ret:
if (pbFilePtr)
UnmapViewOfFile(pbFilePtr);
if (hFileMap)
CloseHandle(hFileMap);
if (hFileProv)
CloseHandle(hFileProv);
return dwErr;
}
// SetCryptSignatureResource
//
// slams signature resource in file with the new signature
//
// szFile is file to modify
// pbNewSig is new signature
// cbNewSig is new signature length
DWORD SetCryptSignatureResource(
LPCSTR szFile,
DWORD dwSigVersion,
DWORD dwCRCOffset,
PBYTE pbNewSig,
DWORD cbNewSig,
DWORD cbImage
)
{
DWORD dwErr = 0x1;
HANDLE hFileProv = NULL;
HMODULE hInst = NULL;
PBYTE pbFilePtr = NULL;
DWORD cbImageSize, cbSigOffset;
PBYTE pbSig;
DWORD cbSig;
MEMORY_BASIC_INFORMATION MemInfo;
BYTE *pbStart;
DWORD OldCheckSum;
DWORD NewCheckSum;
PIMAGE_NT_HEADERS pImageNTHdrs;
HANDLE hFileMap = NULL;
memset(&MemInfo, 0, sizeof(MemInfo));
// Load the file as a datafile
if (NULL == (hInst = LoadLibraryEx(szFile, NULL, LOAD_LIBRARY_AS_DATAFILE)))
{
printf("Couldn't load file\n");
goto Ret;
}
if (!GetCryptSigResourcePtr(hInst,
&pbSig,
&cbSig))
{
printf("Couldn't find signature placeholder\n");
goto Ret;
}
// get image start address
VirtualQuery(hInst, &MemInfo, sizeof(MemInfo));
pbStart = (BYTE*)MemInfo.BaseAddress;
FreeLibrary(hInst); hInst = NULL;
cbSigOffset = (DWORD)(pbSig - pbStart);
if (cbSig < (cbNewSig + (sizeof(DWORD) * 2)))
{
printf("Attempt to replace %d zeros with %d byte signature!\n", cbSig, cbNewSig);
goto Ret;
}
if (INVALID_HANDLE_VALUE == (hFileProv = CreateFile(szFile,
GENERIC_READ | GENERIC_WRITE,
0, // don't share
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0)))
{
printf("Couldn't CreateFile: 0x%x\n", GetLastError());
goto Ret;
}
if (NULL == (hFileMap = CreateFileMapping(
hFileProv,
NULL,
PAGE_READWRITE,
0,
0,
NULL)))
{
printf("Couldn't map file\n");
goto Ret;
}
if (NULL == (pbFilePtr = (PBYTE)MapViewOfFile(
hFileMap,
FILE_MAP_ALL_ACCESS,
0,
0,
0)))
{
printf("Couldn't create view\n");
goto Ret;
}
// copy version, CRC offset and new sig
CopyMemory(pbFilePtr+cbSigOffset, &dwSigVersion, sizeof(dwSigVersion));
cbSigOffset += sizeof(dwSigVersion);
CopyMemory(pbFilePtr+cbSigOffset, &dwCRCOffset, sizeof(dwCRCOffset));
cbSigOffset += sizeof(dwCRCOffset);
CopyMemory(pbFilePtr+cbSigOffset, pbNewSig, cbNewSig);
if (cbSig > (cbNewSig + (sizeof(DWORD) * 2)))
{
ZeroMemory(pbFilePtr+cbSigOffset+cbNewSig,
cbSig - (cbNewSig + (sizeof(DWORD) * 2)));
}
// compute a new checksum
if (NULL == (pImageNTHdrs = CheckSumMappedFile(pbFilePtr, cbImage,
&OldCheckSum, &NewCheckSum)))
goto Ret;
CopyMemory(&pImageNTHdrs->OptionalHeader.CheckSum, &NewCheckSum, sizeof(DWORD));
if (NULL == (pImageNTHdrs = CheckSumMappedFile(pbFilePtr, cbImage,
&OldCheckSum, &NewCheckSum)))
goto Ret;
if (OldCheckSum != NewCheckSum)
goto Ret;
dwErr = ERROR_SUCCESS;
Ret:
if (pbFilePtr)
UnmapViewOfFile(pbFilePtr);
if (hFileMap)
CloseHandle(hFileMap);
if (hInst)
FreeLibrary(hInst);
if (hFileProv)
CloseHandle(hFileProv);
return dwErr;
}
/*++
ShowHelp:
This routine displays a short help message to the given output stream.
Arguments:
ostr - The output stream to receive the help message.
Return Value:
None
Author:
Doug Barlow (dbarlow) 7/21/1995
--*/
void
ShowHelp()
{
printf("CryptoAPI Internal CSP Signing Utility\n");
printf("signcsp <filename>\n");
}
/* MIDL allocate and free */
void __RPC_FAR * __RPC_API midl_user_allocate(size_t len)
{
return(malloc(len));
}
void __RPC_API midl_user_free(void __RPC_FAR * ptr)
{
free(ptr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -