1 #include "..\include\raMain.h" 39 return raCRC32Table[(a ^ b) & 0xFF] ^ (a >> 8);
41 bool raFile::FillCRC32Table()
45 if(raCRC32TableFilled)
49 for(DWORD a = 0; a < 256; a++)
52 for(
int b = 0; b < 8; b++)
54 c = c & 1 ? 0xEDB88320 ^ (c >> 1) : c >> 1;
62 raCRC32TableFilled = TRUE;
63 RINFO(
"CRC32-Tabelle wurde generiert!");
67 bool raFile::UpdateZipKeys(DWORD* pdwKey, BYTE c)
71 pdwKey[0] =
raCRC32(pdwKey[0], c);
72 pdwKey[1] += pdwKey[0] & 0x000000FF;
73 pdwKey[1] = pdwKey[1] * 134775813 + 1;
74 pdwKey[2] =
raCRC32(pdwKey[2], (BYTE)(pdwKey[1] >> 24));
82 wTemp = (WORD)(pdwKey[2] | 2);
83 return (((wTemp * (wTemp ^ 1)) >> 8) & 0xFF);
85 bool raFile::DecryptZipObject(DWORD dwObjectCRC32, BYTE* pEncryptionHeader, BYTE*
pData,
98 if(!raCRC32TableFilled)
102 adwKey[0] = 305419896;
103 adwKey[1] = 591751049;
104 adwKey[2] = 878082192;
107 for(
int a = 0; a < (int)(strlen(pcPassword.c_str())); a++)
108 UpdateZipKeys(adwKey, (BYTE)(pcPassword[a]));
111 for(
int a = 0; a < 12; a++)
113 Temp = *((BYTE*)(pEncryptionHeader) + a) ^
DecryptZipByte(adwKey);
114 pEncryptionHeader[a] = Temp;
115 UpdateZipKeys(adwKey, Temp);
119 if((BYTE)((dwObjectCRC32 & 0xFF000000) >> 24) != pEncryptionHeader[11])
return false;
122 iSize = raSystem::raMemManager::Instance().MemGetSize(pData);
123 for(
int a = 0; a < iSize; a++)
127 UpdateZipKeys(adwKey, Temp);
135 bool raFile::DecryptPassword(
raString pcPassword)
138 int aiKey[50] = {0x02, 0x03, 0x05, 0x07, 0x11, 0x13, 0x17, 0x19, 0x23, 0x29,
139 0xA2, 0xB3, 0xC5, 0xD7, 0xE1, 0xF3, 0xA7, 0xB9, 0xC3, 0xD9,
140 0x93, 0xA4, 0xB6, 0xC8, 0xD2, 0xE4, 0x98, 0xA8, 0xB4, 0xC8,
141 0x46, 0x58, 0x63, 0x67, 0x74, 0x78, 0x57, 0x57, 0x68, 0x67,
142 0xA9, 0xBC, 0xC9, 0xDF, 0xF6, 0x0C, 0xBF, 0xCF, 0xFC, 0xFF};
145 char acPassword[256];
149 ZeroMemory(iHexToDec, 256 *
sizeof(
int));
160 iHexToDec[
'A'] = iHexToDec[
'a'] = 10;
161 iHexToDec[
'B'] = iHexToDec[
'b'] = 11;
162 iHexToDec[
'C'] = iHexToDec[
'c'] = 12;
163 iHexToDec[
'D'] = iHexToDec[
'd'] = 13;
164 iHexToDec[
'E'] = iHexToDec[
'e'] = 14;
165 iHexToDec[
'F'] = iHexToDec[
'f'] = 15;
169 ZeroMemory(acPassword, 256 *
sizeof(
char));
170 for(
int a = 0; a < (int)(strlen(pcPassword.c_str())); a += 2)
172 acPassword[a / 2] = iHexToDec[pcPassword[a]] * 16 +
173 iHexToDec[pcPassword[a + 1]];
182 srand(strlen(acPassword) * 17);
184 size_t len = strlen(acPassword);
185 srand(UINT(len * 17));
187 for(
int a = 0; a < (int)(strlen(acPassword)); a++)
191 srand(rand() + strlen(acPassword) * a);
193 len = strlen(acPassword);
194 srand(UINT(rand() + len * a));
196 srand((rand() % (aiKey[a % 50])) + (rand() % (aiKey[(a * 23) % 50])));
197 srand((rand() % (aiKey[(a + 2305) % 50])) + (rand() % (aiKey[(17 + a * 133) % 50])) * 177);
200 pcPassword[a] = acPassword[a] - (rand() % 256);
203 srand(((BYTE)(acPassword[a]) + 1) * (a + 23) + (rand() % 1381));
211 bool raFile::ReadFile(
raString pcFilename,
void** ppOut)
213 char acFilename[256];
221 strcpy(acFilename, pcFilename.c_str());
222 pcFilename = acFilename;
228 pcAt =
new raString(strrchr(pcFilename.c_str(),
'@'));
229 if(!pcFilename.find(
'@'))
233 return ReadRawFile(pcFilename, ppOut);
247 pcPassword =
new raString(strrchr(pcRight->c_str(),
'>'));
248 if(pcPassword->c_str())
257 if(*pcPassword->c_str() ==
'?')
258 DecryptPassword(*(++pcPassword));
262 return ReadZipFileObject(*pcRight, *pcLeft, *pcPassword, ppOut);
267 bool raFile::ReadZipFileObject(
raString pcZipFilename,
raString pcObjectName,
272 char acObjectName[256];
275 BYTE aEncryptionHeader[12];
283 pZipFile = fopen(pcZipFilename.c_str(),
"rb");
298 if(fread(&ZipHeader,
sizeof(
raZipHeader), 1, pZipFile) != 1)
301 RERROR(
"Fehler beim Lesen des Headers!");
310 RERROR(
"Das Objekt wurde nicht gefunden!");
319 ZeroMemory(acObjectName, 256 *
sizeof(
char));
323 RERROR(
"Fehler beim Lesen des Dateinamens!");
328 if(!_stricmp(pcObjectName.c_str(), acObjectName))
347 fseek(pZipFile, 12, SEEK_CUR);
357 RERROR(
"Komprimiertes Objekt gefunden! Dekomprimierung wird nicht unterstützt!");
366 if(fread(aEncryptionHeader, 12, 1, pZipFile) != 1)
369 RERROR(
"Fehler beim Lesen des Verschlüsselungs-Headers!");
375 pData = raSystem::raMemManager::Instance().MemAlloc(ZipHeader.
dwCompressedSize - (bEncrypted ? 12 : 0));
382 iSize = raSystem::raMemManager::Instance().MemGetSize(pData);
383 if(fread(pData, iSize, 1, pZipFile) != 1)
385 raSystem::raMemManager::Instance().MemFree(pData);
387 RERROR(
"Fehler beim Lesen der Objektdaten!");
394 if(DecryptZipObject(ZipHeader.
dwCRC32, aEncryptionHeader,
395 (BYTE*)(pData), pcPassword))
397 raSystem::raMemManager::Instance().MemFree(pData);
399 RERROR(
"Entschlüsselung fehlgeschlagen!");
415 bool raFile::ReadRawFile(
raString pcFilename,
void** ppOut)
417 struct stat FileStats;
422 ZeroMemory(&FileStats,
sizeof(
struct stat));
423 stat(pcFilename.c_str(), &FileStats);
424 if(FileStats.st_size <= 0) {
RERROR_FILE(pcFilename);
return false; }
427 pData = raSystem::raMemManager::Instance().MemAlloc(FileStats.st_size);
435 pFile = fopen(pcFilename.c_str(),
"rb");
438 raSystem::raMemManager::Instance().MemFree(pData);
444 if(fread(pData, FileStats.st_size, 1, pFile) != 1)
446 raSystem::raMemManager::Instance().MemFree(pData);
463 bool raFile::WriteFile(
raString pcFilename,
void* pData,
int iNumBytes)
473 pFile = fopen(pcFilename.c_str(),
"wb");
481 if(fwrite(pData, iNumBytes, 1, pFile) != 1)
BYTE DecryptZipByte(DWORD *pdwKey)
void RAPI RERROR_FILE(raString f)
void RAPI RERROR_INVALIDVALUE(raString x)
DWORD raCRC32(DWORD a, BYTE b)
void RAPI RERROR_NULLPOINTER(raString x)
ID3D11Buffer D3D11_BUFFER_DESC void * pData
void RAPI RINFO(raString x)
void RAPI RERROR_OUTOFMEM()
void RAPI RERROR(raString x)