📄 warpdll.cpp
字号:
FILEHEAD filehead;
DWORD key[8] = {0, 0, 0, 0, 0, 0, 0, 0};
CFile SourceFile, TargetFile;
DWORD FBReg1, FBReg2, FBReg3, FBReg4;
DWORD buffer[BufferGroup];
DWORD lFileLength;
DWORD BufferSize = sizeof(buffer);
DWORD i, j, Blocks, Tail, TailGroup;
DWORD SecurityIV;
CString szSourceFile;
char szTempFileName[MAX_PATH];
unsigned char cmpkey1[128];
unsigned char cmpkey2[128];
unsigned char cmpkey3[128];
unsigned long S_Box[512];
pparams = (PWARPARAMS)pvoid;
if (strcmp(pparams->lpszFileName, "") == 0)
{
pparams->statue = S_FILE_NAME_EMPTY;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
szSourceFile = pparams->lpszFileName;
if (!SourceFile.Open(szSourceFile,
CFile::modeReadWrite | CFile::shareDenyRead |
CFile::shareDenyWrite, NULL))
{
pparams->statue = S_FILE_OPEN_ERROR;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
lFileLength = SourceFile.GetLength() - sizeof(filehead);
if (lFileLength < 0)
{
pparams->statue = S_FILE_CORRUPTED;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
if (!GetTempFileName(_T(".\\"), _T("wop"), 0, szTempFileName))
{
SourceFile.Close();
pparams->statue = S_FILE_OPEN_ERROR;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
if (!TargetFile.Open(TEXT(szTempFileName),
CFile::modeCreate | CFile::modeWrite |
CFile::shareDenyRead | CFile::shareDenyWrite, NULL))
{
SourceFile.Close();
pparams->statue = S_FILE_OPEN_ERROR;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
InitKeys(pparams->lpszKeys, key);
init_s_box(key[6], key[7], S_Box);
init_dec_cmpkeys(key[0], key[1], cmpkey1);
init_enc_cmpkeys(key[2], key[3], cmpkey2);
init_dec_cmpkeys(key[4], key[5], cmpkey3);
//Verify filehead.
SourceFile.Read(&filehead, sizeof(filehead));
if ((filehead.Version & 0xffff0000) != (DllVersion & 0xffff0000))
{
for (i = 0; i < 128; i++)
{
cmpkey1[i] = 0;
cmpkey2[i] = 0;
cmpkey3[i] = 0;
}
reset_s_box(S_Box);
SourceFile.Close();
TargetFile.Close();
TargetFile.Remove(szTempFileName);
pparams->statue = S_VERSION_NOT_MATCH;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
FBReg1 = filehead.CheckInfo[0];
FBReg2 = filehead.CheckInfo[1];
dec(filehead.CheckInfo[0], filehead.CheckInfo[1],
cmpkey1, cmpkey2, cmpkey3);
filehead.CheckInfo[0] ^= filehead.IV1;
filehead.CheckInfo[1] ^= filehead.IV2;
FBReg3 = filehead.CheckInfo[2];
FBReg4 = filehead.CheckInfo[3];
dec(filehead.CheckInfo[2], filehead.CheckInfo[3],
cmpkey1, cmpkey2, cmpkey3);
filehead.CheckInfo[2] ^= FBReg1;
filehead.CheckInfo[3] ^= FBReg2;
FBReg1 = FBReg3;
FBReg2 = FBReg4;
FBReg3 = filehead.CheckInfo[4];
FBReg4 = filehead.CheckInfo[5];
dec(filehead.CheckInfo[4], filehead.CheckInfo[5],
cmpkey1, cmpkey2, cmpkey3);
filehead.CheckInfo[4] ^= FBReg1;
filehead.CheckInfo[5] ^= FBReg2;
FBReg1 = FBReg3;
FBReg2 = FBReg4;
FBReg3 = filehead.CheckInfo[6];
FBReg4 = filehead.Tail;
dec(filehead.CheckInfo[6], filehead.Tail,
cmpkey1, cmpkey2, cmpkey3);
filehead.CheckInfo[6] ^= FBReg1;
filehead.Tail ^= FBReg2;
SecurityIV = filehead.CheckInfo[0]^Info0;
filehead.CheckInfo[0] ^= SecurityIV;
SecurityIV = lfsr(SecurityIV, Security1);
filehead.CheckInfo[1] ^= SecurityIV;
SecurityIV = lfsr(SecurityIV, Security2);
filehead.CheckInfo[2] ^= SecurityIV;
SecurityIV = lfsr(SecurityIV, Security3);
filehead.CheckInfo[3] ^= SecurityIV;
SecurityIV = lfsr(SecurityIV, Security4);
filehead.CheckInfo[4] ^= SecurityIV;
SecurityIV = lfsr(SecurityIV, Security5);
filehead.CheckInfo[5] ^= SecurityIV;
SecurityIV = lfsr(SecurityIV, Security6);
filehead.CheckInfo[6] ^= SecurityIV;
if (filehead.CheckInfo[0] != Info0 ||
filehead.CheckInfo[1] != Info1 ||
filehead.CheckInfo[2] != Info2 ||
filehead.CheckInfo[3] != Info3 ||
filehead.CheckInfo[4] != Info4 ||
filehead.CheckInfo[5] != Info5 ||
filehead.CheckInfo[6] != Info6)
{
for (i =0; i < 128; i++)
{
cmpkey1[i] = 0;
cmpkey2[i] = 0;
cmpkey3[i] = 0;
}
reset_s_box(S_Box);
SourceFile.Close();
TargetFile.Close();
TargetFile.Remove(szTempFileName);
pparams->statue = S_KEY_INCURRECT;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
lFileLength -= (8 - filehead.Tail & 7) & 7; //Get real file length
Tail = lFileLength % BufferSize; //Recalculate tail
Blocks = lFileLength / BufferSize;
//
FBReg1 = FBReg3;
FBReg2 = FBReg4;
for (j = 0; j < Blocks; j++)
{
SourceFile.Read(buffer, BufferSize);
for (i = 0; i < BufferGroup; ++i, ++i)
{
FBReg3 = buffer[i];
FBReg4 = buffer[i + 1];
dec(buffer[i], buffer[i + 1], cmpkey1, cmpkey2,
cmpkey3);
buffer[i] ^= FBReg1;
buffer[i + 1] ^= FBReg2;
FBReg1 = FBReg3;
FBReg2 = FBReg4;
}
TargetFile.Write(buffer, BufferSize);
if (pparams->bHalt)
{
for (i = 0; i < 128; i++)
{
cmpkey1[i] = 0;
cmpkey2[i] = 0;
cmpkey3[i] = 0;
}
reset_s_box(S_Box);
SourceFile.Close();
TargetFile.Close();
TargetFile.Remove(szTempFileName);
pparams->statue = S_CANCELED;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
pparams->iCompleteProgress = j * 100 / Blocks;
}
if (Tail != 0)
{
SourceFile.Read(buffer, BufferSize);
TailGroup = ((Tail >> 3) + 1) << 1;
for (i = 0; i < TailGroup; ++i, ++i)
{
FBReg3 = buffer[i];
FBReg4 = buffer[i+1];
dec(buffer[i], buffer[i+1], cmpkey1, cmpkey2,
cmpkey3);
buffer[i] ^= FBReg1;
buffer[i + 1] ^= FBReg2;
FBReg1 = FBReg3;
FBReg2 = FBReg4;
}
TargetFile.Write(buffer, Tail);
}
//Destory SourceFile
SourceFile.SeekToBegin();
for (j = 0; j < BufferGroup; j++)
buffer[j] = 0xffffffff;
for (j = 0; j < Blocks; j++)
SourceFile.Write(buffer, BufferSize);
if (Tail != 0)
SourceFile.Write(buffer, BufferSize);
SourceFile.SeekToBegin();
for (j = 0; j < BufferGroup; j++)
buffer[j] = 0;
for (j = 0; j < Blocks; j++)
SourceFile.Write(buffer, BufferSize);
if (Tail != 0)
SourceFile.Write(buffer, BufferSize);
SourceFile.SeekToBegin();
for (j = 0; j < BufferGroup; j++)
buffer[j] = 0xaaaaaaaa;
for (j = 0; j < Blocks; j++)
SourceFile.Write(buffer, BufferSize);
if (Tail != 0)
SourceFile.Write(buffer, BufferSize);
//
for (i = 0; i < 128; i++)
{
cmpkey1[i] = 0;
cmpkey2[i] = 0;
cmpkey3[i] = 0;
}
reset_s_box(S_Box);
SourceFile.Close();
TargetFile.Close();
SourceFile.Remove(szSourceFile);
TargetFile.Rename(szTempFileName, szSourceFile);
pparams->statue = S_ALL_RIGHT;
pparams->iCompleteProgress = PROGRESS_ALL_FINISHED;
return;
}
EXPORTDLL unsigned long CALLBACK Version()
{
return DllVersion;
}
EXPORTDLL long CALLBACK IsWeakKey(DWORD* LKey, DWORD* RKey)
{
return isweakkey(*LKey, *RKey);
}
EXPORTDLL void CALLBACK Init_S_Box(DWORD* LExKey, DWORD* RExKey,
unsigned long S_Box_Indentifer)
{
init_s_box(*LExKey, *RExKey, S_Boxes[S_Box_Indentifer]);
return;
}
EXPORTDLL void CALLBACK Reset_S_Box(unsigned long S_Box_Indentifer)
{
reset_s_box(S_Boxes[S_Box_Indentifer]);
return;
}
EXPORTDLL void CALLBACK Init_ENC_Subkeys(DWORD* LKey,
DWORD* RKey,
unsigned long S_Box_Indentifer)
{
init_enc_cmpkeys(*LKey, *RKey, Subkey[S_Box_Indentifer]);
return;
}
EXPORTDLL void CALLBACK Init_DEC_Subkeys(DWORD* LKey, DWORD* RKey,
unsigned long S_Box_Indentifer)
{
init_dec_cmpkeys(*LKey, *RKey, Subkey[S_Box_Indentifer]);
return;
}
EXPORTDLL void CALLBACK Fast_ENC(DWORD* LData, DWORD* RData,
unsigned long S_Box_Indentifer)
{
fast_desenc(*LData, *RData, Subkey[S_Box_Indentifer], S_Boxes[S_Box_Indentifer]);
return;
}
EXPORTDLL void CALLBACK Fast_DEC(DWORD* LData, DWORD* RData,
unsigned long S_Box_Indentifer)
{
fast_desdec(*LData, *RData, Subkey[S_Box_Indentifer], S_Boxes[S_Box_Indentifer]);
return;
}
EXPORTDLL unsigned long CALLBACK Gen_S_Box()
{
unsigned long rslt;
InitializeCriticalSection(&_WarpDllCS);
EnterCriticalSection(&_WarpDllCS);
int i;
if (_ThreadCounter < MAXTHREADNUMBER)
{
_ThreadCounter++;
for (i = 0; i < MAXTHREADNUMBER; i++)
if (S_Box_Status[i]) break;
rslt = i;
}
else
rslt = -1;
LeaveCriticalSection(&_WarpDllCS);
return rslt;
}
EXPORTDLL void CALLBACK Drop_S_Box(unsigned long S_Box_Indentifer)
{
InitializeCriticalSection(&_WarpDllCS);
EnterCriticalSection(&_WarpDllCS);
if (_ThreadCounter > 0)
{
if (!S_Box_Status[S_Box_Indentifer])
{
_ThreadCounter --;
S_Box_Status[S_Box_Indentifer] = 1;
}
}
LeaveCriticalSection(&_WarpDllCS);
}
EXPORTDLL void CALLBACK Reset_Subkeys(unsigned long S_Box_Indentifer)
{
for (int i = 0; i < 128; i++)
Subkey[S_Box_Indentifer][i] = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -