发新话题
打印

[转载]一段隐藏文件的C++程序源代码

[转载]一段隐藏文件的C++程序源代码

代码注释:dahubaobao
复制内容到剪贴板
代码:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int injectfile(char *, char *, char *, char *);
//隐藏文件函数
int exportfile(char *, char *, char *, char *);
//输出文件函数
void  cript_decript(char *, char *, long);
//简单的加密函数

int main(int argc, char *argv[])
{

if(argc != 6)
{
  cout << "\n\nShadowJPEG vers 1.1 ----\n";
  cout << "        Developed by [V]l4d for [url]www.noflyzone.org[/url] only\n\n";
  cout << "Usage: ShadowJPEG -i <jpeg in> <file to hide> <jpeg_out> <key>\n";
  cout << "     ShadowJPEG -e <modified jpeg> <original jpeg image&#39;s size> <output file name> <key>\n\n";
  cout << "-i = inject file into the jpeg image\n";
  cout << "-e = export hidden file from jpeg\n\n";
  
  return -1;
}

if(strstr(argv[1], "-i")) injectfile(argv[2], argv[3], argv[4], argv[5]);
if(strstr(argv[1], "-e")) exportfile(argv[2], argv[3], argv[4], argv[5]);

  return 0;
}

int injectfile(char* jpeg_in, char *file_to_hide, char *jpeg_out, char *pad)
{
     long file1long, file2long;
     char *file1str, *file2str;
     fstream fp1(jpeg_in, ios::in), fp2(file_to_hide, ios::in), fpout(jpeg_out, ios::out);
     //使用fstream类操作文件。fp1打开图片,fp2打开欲隐藏文件,fpout输出最后的“加密”文件。
     这三个都为文件对象,之后就可以用成员函数操作文件了

     if(!fp1)
     {
  cout << "unable to open the file...";
      return -1;
     }
     if(!fp2)
     {
  cout << "unable to open the file...";
      return -1;
     }
     if(!fpout)
     {
  cout << "unable to open the file...";
      return -1;
     }

fp1.seekg(0, ios::end);   //定位到图片文件的未部
fp2.seekg(0, ios::end);   //定位到欲隐藏文件的未部
file1long = fp1.tellg();  //统计图片文件的长度,赋值给file1long
file2long = fp2.tellg();  //统计欲隐藏文件的长度赋值给file2long
                        因为已经用seekg()定位到文件的未部了,所以可直接使用tellg()
fp1.seekg(0, ios::beg);   //定位到图片文件的首部  
fp2.seekg(0, ios::beg);   //定位到欲隐藏文件的首部  

     file1str = new char[file1long];  //新建数组,并赋值给指针file1str
     file2str = new char[file2long];  //新建数组,并赋值给指针file2str

     fp1.read(file1str, file1long);   //读取图片文件,字节由file1long指定
     fp2.read(file2str, file2long);   //读取欲隐藏文件,字节由file2long指定

cript_decript(file2str, pad, ((long)file2long));  //加密

     fpout.write(file1str, file1long);  //将file1str写入图片文件,字节由file1long指定
     fpout.write(file2str, file2long);  //将file2str继续写如图片文件,字节由file2long指定

     fp1.close();
     fp2.close();
     fpout.close();
     //关闭文件对象

cout << "injection finished...the original file size is: " << file1long <<" bytes!" << endl;

return 0;
}

int exportfile(char *modified_file, char *original_size, char *outfile, char *pad)
{
  long sum_long, file1long, file2long;
  char *fp2str;
  fstream fp1(modified_file, ios::in), fp2(outfile, ios::out);
  //Fp1为打开加密后的图片文件,Fp2为输出隐藏文件

  file1long = atoi(original_size);
  //original_size为函数的参数,用于指定原始图片文件的大小。
   //这里是将用户输入的大小(字符串)转换为长整形,并赋值给file1long
  
  if(!fp1)
  {
   cout << "unable to open the file... be sure that it exist and that u have the required permissions";
   return -1;
  }

  if(!fp2)
  {
   cout << "I cannot create the file...";
   return -1;
  }

  fp1.seekg(0, ios::end);  //定位到加密后的图片文件未部
  sum_long = fp1.tellg();  //统计长度
  fp1.seekg(0, ios::beg);  //定位到加密后图片文件的首部

  file2long = sum_long - file1long;  //用加密后的图片文件长度减去原始图片文件的长度
  fp2str = new char[file2long];     //新建数组,并赋值给指针fp2str

  fp1.seekg(file1long, ios::beg);    //定位到加密后的图片文件file1long处
  fp1.read(fp2str, file2long);      //读取隐藏文件,字节由file2long指定

  //这里注意一下,由于已经用加密后的图片文件减去了原始图片文件,
   //所以这里的fp2str就是我们隐藏文件的具体内容

  cript_decript(fp2str, pad, file2long);

  fp2.write(fp2str, file2long);  //到这里就输出我们隐藏的文件了
  fp1.seekg(0, ios::beg);      //再次定位到首部,不过这里已经是原来的图片文件了

  fp1.close();
  fp2.close();
  //关闭文件对象

  cout << "Export finished." << " ..:::ShadowJPEG on [url]www.noflyzone.org:::..[/url]" << endl;

  return 0;
}

void cript_decript(char *str, char *pad, long str_long)
{
int i, j, padlong;

padlong = strlen(pad);

for (i=0, j=0;i<str_long; i++, j++)
{
  if(j == padlong) j = 0;
  str[i]^=pad[j];
}
}
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题