Introduction
After I read the article 'Hiding a text file in a BMP file', I found it very funny, and maybe useful. So I decided to extend it to fit in with any file, any password, and become easy to use.
Background
You can find its principle here: Hiding a text file in a BMP file. Very thanks to Ahmed Osama's idea and good work.
Class Structure
class CBmpHermitCrab
{
...
public:
bool Hermit(const char* pszDestFileName,
const char* pszSrcFileName,
const char* pszPassword=NULL,
const char* pszResultFile=NULL);
bool IsHermitCrabBMPFile(const char* pszFileName);
bool RecoverCrabFile(const char* pszFileName,
const char* pszPassword=NULL, const char* pszPath=NULL);
};
It provides three methods to implement the following tasks:
Hermit()
. Hides a file in a BMP file.
The main code:
...
nIndex=0;
for(int i=0;i<(iBinaryLen/8); i++){
temp= m_binaryMap[(unsigned char) strBufferAll[i]];
srcBinary[nIndex] = temp[0];
srcBinary[nIndex+1] =temp[1];
srcBinary[nIndex+2] =temp[2];
srcBinary[nIndex+3] =temp[3];
srcBinary[nIndex+4] =temp[4];
srcBinary[nIndex+5] =temp[5];
srcBinary[nIndex+6] =temp[6];
srcBinary[nIndex+7] =temp[7];
nIndex=nIndex+8;
}
int mask=254;
for (i=0 ; i<iBinaryLen ; i++){
bmpBuffer[i+55]=bmpBuffer[i+55] & mask;
if (srcBinary[i]=='1')
bmpBuffer[i+55]=bmpBuffer[i+55]+1;
}
...
Through our binary table srcBinary
and the correct index, we can express a char by using the original pixel color value micro-changed.
RecoverCrabFile()
. Recovers hidden file from a HermitCrab ;) BMP file.
The key code:
...
for(j=55+8*nHeadSize; j < 55+8*nHeadSize
+pHermitCrabHead->bPasswordLen*8+
pHermitCrabHead->bFileNameLen*8;j++){
recBin[j]=
(unsigned char) ((unsigned char)buffer[j] & 1);
}
CString strTemp;
for(j=55+8*nHeadSize; j <
55+8*nHeadSize+pHermitCrabHead->bPasswordLen*8+
pHermitCrabHead->bFileNameLen*8;j=j+8){
temp=128*recBin[j]+64*recBin[j+1]+32*recBin[j+2]+
16*recBin[j+3]+8*recBin[j+4]+4*recBin[j+5]+
2*recBin[j+6]+1*recBin[j+7];
strTemp+=temp;
}
...
IsHermitCrabBMPFile()
. Like method 2, but it just recovers the fist 8 bytes, and whether the first two bytes: 'C' and 'H'.
Using the code
- Include the BmpHermitCrab.h file.
- Generate a
CBmpHermitCrab
instance.
- With the instance, use the
Hermit()
method to hide a file in a BMP file with optional password and use the RecoverCrabFile()
method to recover a file from a 'HermitCrab' BMP file. You can check the BMP file format by IsHermitCrabBMPFile()
method.
Hope you enjoy the program!