driverinterfacehash.c
来自「文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2」· C语言 代码 · 共 339 行
C
339 行
// Description:
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW: http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//
#include "FreeOTFEDebug.h"
#include "FreeOTFElib.h"
#include "DriverInterfaceHash.h"
#include "DriverInterfaceCommon.h"
// =========================================================================
BOOL driver_HashLoadDLL(WCHAR* Filename, MODULE_DETAILS_HASH* DLLDetails)
{
BOOL retval = TRUE;
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("driver_HashLoadDLL\n")));
// Get library path and filename...
if (retval)
{
// +1 for terminating NULL
DLLDetails->Filename = calloc((wcslen(Filename) + 1), sizeof(DLLDetails->Filename[0]));
if (DLLDetails->Filename == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to malloc memory to copy driver filename\n")));
retval = FALSE;
}
else
{
wcscpy(DLLDetails->Filename, Filename);
}
}
// Load library...
if (retval)
{
DLLDetails->Lib = LoadLibrary(DLLDetails->Filename);
if (DLLDetails->Lib == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to load library\n")));
retval = FALSE;
}
}
// Get library function address...
if (retval)
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_HASH_IDENTIFYDRIVER));
DLLDetails->FnIdentifyDriver = (PHashDLLFnIdentifyDriver)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_HASH_IDENTIFYDRIVER
);
if (DLLDetails->FnIdentifyDriver == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_HASH_IDENTIFYSUPPORTED));
DLLDetails->FnIdentifySupported = (PHashDLLFnIdentifySupported)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_HASH_IDENTIFYSUPPORTED
);
if (DLLDetails->FnIdentifySupported == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_HASH_GETHASHDETAILS));
DLLDetails->FnGetHashDetails = (PHashDLLFnGetHashDetails)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_HASH_GETHASHDETAILS
);
if (DLLDetails->FnGetHashDetails == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_HASH_HASH));
DLLDetails->FnHash = (PHashDLLFnHash)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_HASH_HASH
);
if (DLLDetails->FnHash == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
}
// In case of failure, shutdown any loaded lib, overwrite, and free off...
if (!(retval))
{
driver_HashUnloadDLL(DLLDetails);
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("driver_HashLoadDLL\n")));
return retval;
}
// =========================================================================
void driver_HashUnloadDLL(MODULE_DETAILS_HASH* DLLDetails)
{
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("driver_HashUnloadDLL\n")));
if (DLLDetails != NULL)
{
// DLL handle
if ((DLLDetails->Lib) != NULL)
{
FreeLibrary(DLLDetails->Lib);
DLLDetails->Lib = NULL;
}
SecZeroAndFreeWCHARMemory(DLLDetails->Filename);
SecZeroMemory(DLLDetails, sizeof(*DLLDetails));
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("driver_HashUnloadDLL\n")));
}
// =========================================================================
// malloc a HASH_DRIVER_INFO structure, and populate as appropriate; returning
// a pointer to the structure in driverInfo
BOOL driver_HashGetDriverDetails(WCHAR* HashFilename, HASH_DRIVER_INFO* driverInfo)
{
BOOL retval = FALSE;
MODULE_DETAILS_HASH DLLDetails;
DIOC_HASH_IDENTIFYDRIVER identifyBuf;
DWORD supportedBufSize;
DIOC_HASH_IDENTIFYSUPPORTED* supportedBuf;
HASH* hashArray;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("driver_HashGetDriverDetails\n")));
if (driver_HashLoadDLL(HashFilename, &DLLDetails))
{
if (DLLDetails.FnIdentifyDriver(&identifyBuf) != ERROR_SUCCESS)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Call to FnIdentifyDriver FAILED!")));
}
else
{
supportedBufSize = (
sizeof(*supportedBuf) -
sizeof(HASH) +
(sizeof(HASH) * identifyBuf.CountHashes)
);
supportedBuf = malloc(supportedBufSize);
if (supportedBuf == NULL)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Unable to malloc DIOCBuffer FnIdentifySupported call\n")));
}
else
{
if (DLLDetails.FnIdentifySupported(
supportedBufSize,
supportedBuf
) != ERROR_SUCCESS)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Call to FnIdentifySupported FAILED!")));
}
else
{
hashArray = calloc(supportedBuf->BufCount, sizeof(HASH));
if (hashArray == NULL)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Unable to malloc buffer for list of supported to be returned\n")));
}
else
{
driverInfo->DriverGUID = identifyBuf.DriverGUID;
memcpy(
driverInfo->DriverTitle,
identifyBuf.Title,
sizeof(identifyBuf.Title)
);
driverInfo->DriverVersionID = identifyBuf.VersionID;
driverInfo->HashCount = identifyBuf.CountHashes;
memcpy(
hashArray,
supportedBuf->Hashes,
(supportedBuf->BufCount * sizeof(*hashArray))
);
driverInfo->HashDetails = hashArray;
retval = TRUE;
}
}
SecZeroAndFreeMemory(supportedBuf, supportedBufSize);
}
SecZeroMemory(&identifyBuf, sizeof(identifyBuf));
}
driver_HashUnloadDLL(&DLLDetails);
}
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("driver_HashGetDriverDetails\n")));
return retval;
}
// =========================================================================
void driver_HashFreeDriverDetails(HASH_DRIVER_INFO* driverInfo)
{
if (driverInfo != NULL)
{
SecZeroMemory(driverInfo, sizeof(*driverInfo));
SecZeroAndFreeMemory(
driverInfo->HashDetails,
(driverInfo->HashCount * sizeof(HASH))
);
}
}
// =========================================================================
void driver_HashPrettyprintAlgTitle(
HASH* hashInfo,
WCHAR* buffer,
int bufferSize // In bytes
)
{
WCHAR tmpStrBuf[1024]; // 1024 relativly arbitary; must be big enough to
// store a full prettyprinted hash/cypher title
// Convert straight ASCII title to UNICODE
memset(tmpStrBuf, 0, sizeof(tmpStrBuf));
mbstowcs(
tmpStrBuf,
hashInfo->Title,
strlen(hashInfo->Title)
);
// Prettyprint to buffer
_snwprintf(
buffer,
(bufferSize / sizeof(buffer[0])),
STR_FORMAT_FULL_HASH_TITLE,
tmpStrBuf,
hashInfo->Length,
hashInfo->BlockSize
);
SecZeroMemory(tmpStrBuf, sizeof(tmpStrBuf));
}
// =========================================================================
BOOL
driver_HashGetImplDetails(
WCHAR* HashFilename,
GUID* HashImpl,
HASH* ImplDetails
)
{
BOOL retval = FALSE;
HASH_DRIVER_INFO hashInfo;
unsigned int i;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("driver_HashGetImplDetails\n")));
if (driver_HashGetDriverDetails(
HashFilename,
&hashInfo
))
{
for (i = 0; i < hashInfo.HashCount; i++)
{
if (IsEqualGUID(
HashImpl,
&(hashInfo.HashDetails[i].HashGUID)
))
{
*ImplDetails = hashInfo.HashDetails[i];
retval = TRUE;
break;
}
}
driver_HashFreeDriverDetails(&hashInfo);
}
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("driver_HashGetImplDetails\n")));
return retval;
}
// =========================================================================
BOOL driver_HashData(
WCHAR* HashDriverFilename,
GUID HashGUID,
unsigned int BufferSizeIn, // In *bits*
unsigned char* BufferIn,
unsigned int* ptrBufferSizeOut, // In *bits*
unsigned char* BufferOut
)
{
BOOL retval = FALSE;
MODULE_DETAILS_HASH DLLDetails;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("driver_HashData\n")));
if (driver_HashLoadDLL(HashDriverFilename, &DLLDetails))
{
retval = (DLLDetails.FnHash(
&HashGUID,
BufferSizeIn,
BufferIn,
ptrBufferSizeOut,
BufferOut
) == ERROR_SUCCESS);
driver_HashUnloadDLL(&DLLDetails);
}
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("driver_HashData\n")));
return retval;
}
// =========================================================================
// =========================================================================
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?