65.9K
CodeProject is changing. Read more.
Home

Hide a file in a BMP file (Plus).

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (22 votes)

Nov 28, 2003

1 min read

viewsIcon

82973

downloadIcon

3093

Hide a file in a BMP file: extended from the author Ahmed Osama's article.

Sample Image - HideIt2.jpg

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:

  1. 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=254for (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.

  2. 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;
     } 
    ...
  3. IsHermitCrabBMPFile(). Like method 2, but it just recovers the fist 8 bytes, and whether the first two bytes: 'C' and 'H'.

Using the code

  1. Include the BmpHermitCrab.h file.
  2. Generate a CBmpHermitCrab instance.
  3. 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!