// HideInBMP.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
char* ReadFileContent(char* filename, DWORD* filesize)
{
HANDLE hfile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
if (hfile==INVALID_HANDLE_VALUE)
{
printf("Open File %s Error\n", filename);
return NULL;
}
DWORD dwRead;
DWORD dwSize = GetFileSize(hfile, &dwRead);
*filesize = dwSize;
char* buf = new char[dwSize];
RtlZeroMemory(buf, dwSize);
ReadFile(hfile, buf, dwSize, &dwRead, 0);
if (dwRead != dwSize)
{
printf("Read %s file content error",filename);
return NULL;
}
CloseHandle(hfile);
return buf;
}
bool SaveFile(char* filename,char* buf, int len)
{
HANDLE hfile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,NULL, OPEN_ALWAYS, NULL, NULL);
if (hfile==INVALID_HANDLE_VALUE)
{
printf("Open File %s Error\n", filename);
return NULL;
}
// save bytes
DWORD dwWrite;
SetFilePointer(hfile, 0, 0, FILE_BEGIN);
WriteFile(hfile, buf, len,&dwWrite,0);
CloseHandle(hfile);
return true;
}
bool Hide(char* sercretFileName, char* bmpFileName)
{
DWORD dwBMPSize=0, dwSecretSize=0;
char* pBMP = ReadFileContent(bmpFileName, &dwBMPSize);
char* pSecretFile = ReadFileContent(sercretFileName, &dwSecretSize);
DWORD *lpFirstPointOffset = (DWORD*)(pBMP + 10);
printf("First Pixel Offset is:%d\n", *lpFirstPointOffset);
char* pCurrentBMP = pBMP + *lpFirstPointOffset+3;
char* pCurrentSecretBMP = pSecretFile;
//
*((DWORD*)pCurrentBMP) = dwSecretSize;
pCurrentBMP += 6;
for (;pCurrentBMP<(pBMP+dwBMPSize) && pCurrentSecretBMP<=(pSecretFile+dwSecretSize);pCurrentBMP +=6)
{
*pCurrentBMP = *pCurrentSecretBMP;
*(pCurrentBMP+1) = *(pCurrentSecretBMP+1);
*(pCurrentBMP+2) = *(pCurrentSecretBMP+2);
pCurrentSecretBMP += 3;
}
SaveFile(bmpFileName, pBMP, dwBMPSize);
delete[] pBMP;
delete[] pSecretFile;
return true;
}
bool Recovery(char* bmpFileName, char* secretFileName)
{
DWORD dwBMPSize=0;
char* pBMP = ReadFileContent(bmpFileName, &dwBMPSize);
DWORD* pFirstPoint = (DWORD*)(pBMP + 10);
printf("The first pixel of Offset:%d\n", *pFirstPoint);
DWORD dwSecretSize = *(DWORD*)(pBMP + *pFirstPoint+3);
char* buf = new char[dwSecretSize];
char* pCurrentBMP = pBMP + *pFirstPoint + 6+3;
for (size_t i = 0; pCurrentBMP<(pBMP+dwBMPSize)&&i
buf[i] = *pCurrentBMP;
buf[i+1] = *(pCurrentBMP+1);
buf[i+2] = *(pCurrentBMP+2);
i += 3;
}
SaveFile(secretFileName, buf, dwSecretSize);
delete[] pBMP;
delete[] buf;
return true;
}
int main(int argc,char* argv[])
{
if (argc<3)
{
printf("Usage:%s Encrypt secret_file_name BMP_filename\n",argv[0]);
printf("Usage:%s Encrypt secret_file_name BMP_filename\n", argv[0]);
return -1;
}
if (strcmp(argv[1],"Encrypt")==0)
{
Hide(argv[2], argv[3]);
}
else if (strcmp(argv[1],"Decrypt")==0)
{
Recovery(argv[2], argv[3]);
}
else
{
printf("Error");
}
printf("Done");
return 0;
}