//某文件是否是加密后zip文件 bool isEncryptedZipFile(const char* szFileName) { extern DWORD g_arrdwCrc32Table[256]; //打开文件 HANDLE hFile = ::CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hFile == INVALID_HANDLE_VALUE) { setLastError(AXP_ERR_FILE_ACCESS, "File=%s, WinErr=%d", szFileName, ::GetLastError()); return false; } //Get File Size unsigned int nFileSize = ::GetFileSize(hFile, 0); //文件太小 if(nFileSize <= 2 ) { ::CloseHandle(hFile); return false; } unsigned char temp[8]; DWORD bytesReaded; ::ReadFile(hFile, temp, 2, &bytesReaded, 0); ::CloseHandle(hFile); // BYTE _1 = getZipEncryptXORKey(0); // BYTE _2 = getZipEncryptXORKey(1); // temp[0] ^ getZipEncryptXORKey(0) if( 'P' == (temp[0] ^ getZipEncryptXORKey(0))&& 'K' == (temp[1] ^ getZipEncryptXORKey(1)) ) { return true; } return false; }
int __cdecl _zzip_encrypt_read ( int fh, void *buf, unsigned cnt ) { extern DWORD g_arrdwCrc32Table[256]; int pos = _tell(fh); int ret = _zzip_read(fh, buf, cnt); for(int i=0; i<ret; i++) { ((unsigned char*)buf)[i] ^= getZipEncryptXORKey(pos+i); } return ret; }
//将指定文件加密 bool encryptFile(const char* szFileName, bool ignoreTail) { //打开文件 HANDLE hInFile = ::CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_SEQUENTIAL_SCAN, 0); if(hInFile == INVALID_HANDLE_VALUE) { setLastError(AXP_ERR_FILE_ACCESS, "File=%s, WinErr=%d", szFileName, ::GetLastError()); return false; } //创建输出文件 char szOutFileName[MAX_PATH] = {0}; ::GetTempPath(MAX_PATH, szOutFileName); ::PathAppend(szOutFileName, ::PathFindFileName(szFileName)); strcat(szOutFileName, ".tmp"); HANDLE hOutFile = ::CreateFile(szOutFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0); if(hOutFile == INVALID_HANDLE_VALUE) { setLastError(AXP_ERR_FILE_ACCESS, "File=%s, WinErr=%d", szOutFileName, ::GetLastError()); ::CloseHandle(hInFile); return false; } //Get File Size unsigned int nFileSize = ::GetFileSize(hInFile, 0); if(ignoreTail) { if(nFileSize <= 4) { setLastError(AXP_ERR_PARAM, "File=%s(too small)", szFileName); ::CloseHandle(hInFile); return false; } nFileSize-=4; } const int MAX_BUFFER_SIZE = 1024; BYTE buffer[MAX_BUFFER_SIZE]; DWORD dwBytesRead; BOOL bSuccess = ReadFile(hInFile, buffer, sizeof(buffer), &dwBytesRead, NULL); DWORD dwBytesReadTotal = 0; while(bSuccess && dwBytesRead) { //加密 for(DWORD i=0; i<dwBytesRead; i++) { buffer[i] ^= getZipEncryptXORKey(i+dwBytesReadTotal); } dwBytesReadTotal+=dwBytesRead; if(dwBytesReadTotal > nFileSize) { dwBytesRead -= (dwBytesReadTotal-nFileSize); } if(dwBytesRead == 0) break; DWORD dwWriteBytes; bSuccess = ::WriteFile(hOutFile, buffer, dwBytesRead, &dwWriteBytes, 0); if(!bSuccess) { setLastError(AXP_ERR_FILE_WRITE, "WinErr=%d", ::GetLastError()); ::CloseHandle(hOutFile); ::CloseHandle(hInFile); DeleteFile(szOutFileName); return false; } bSuccess = ReadFile(hInFile, buffer, sizeof(buffer), &dwBytesRead, NULL); }; if(!bSuccess) { setLastError(AXP_ERR_FILE_WRITE, "WinErr=%d", ::GetLastError()); ::CloseHandle(hOutFile); ::CloseHandle(hInFile); DeleteFile(szOutFileName); return false; } ::CloseHandle(hOutFile); ::CloseHandle(hInFile); if(!::MoveFileEx(szOutFileName, szFileName, MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) { setLastError(AXP_ERR_FILE_WRITE, "WinErr=%d", ::GetLastError()); return false; } return true; }