Beispiel #1
0
//某文件是否是加密后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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
//将指定文件加密
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;
}