将文件隐藏到BMP中

// 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;
}

你可能感兴趣的:(c++)