`
宋科明
  • 浏览: 99556 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一段隐藏文件的C++程序源代码

阅读更多

#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'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];
}
}

分享到:
评论

相关推荐

    vc++ 开发实例源码包

    MP3解压程序源代码 如题。 MPEG4播放器源代码 如题。 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ整套聊天系统) 老版qq系统的实现...

    VC++9.0编写的 贪吃蛇 程序和源码

    本压缩包包含编译好的exe可运行文件和源代码。可以重新编译和修改。 本程序在Microsoft Visual C++ 2008 Express Edition编译并调试通过。 想运行本程序需要您的机器上装有.Net Framework 2.0(或以上版本) 和 VC...

    Visual C++编程技巧精选500例.pdf

    042 如何在程序启动时弹出文件打开对话框? 第4章 标题栏与菜单栏 043 如何获取标题栏高度? 044 如何设置标题栏文字? 045 如何获取标题栏文字颜色? 046 如何设置标题栏文字颜色? 047 如何在文档类中设置标题栏文字? ...

    C/C++面试题目及解答.doc

    &lt;br&gt;3.main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题) 答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行; 如果你需要加入一段在main退出后执行的代码,可以使用...

    最新名企标准通用C++面试题,

    这样声明之后,相当于告诉C, 函数const void f(void)是在C++语言的文件中声明或者实现的,c程序可以使用这个C++中的函数了,从而实现C++和c的混合编程。 13、编写一个函数,作用是把一个char组成的字符串...

    代码语法错误分析工具pclint8.0

    Windows平台下也有好多人都喜欢用SourceInsight编辑C/C++程序,如果将pclint集成到SourceInsight中,那就相当于给SourceInsight增加了一个C/C++编译器,而且它的检查更严格,能发现一些编译器发现不了的问题,可以...

    delphi经典编程入门

    Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。...要查看某一特定程序的源代码,只需用鼠标点动写有该库单元文件名的页标签,就可以对该库单元进行编辑了。

    易语言程序免安装版下载

    修改BUG:在IDE中打开源代码文件(.e)后,高级选择夹组件不能正确切换到“现行子夹”属性设定的子夹。 9. 修改BUG:矢量动画支持库中的“矢量编辑框”组件在光标位于组件右下角时按右光标键进入下一行会导致显示...

    ARM开发工具ADS原理与应用 读书笔记

    4.4.2 建立一个使用c/c++库的应用程序 4.4.3 建立一个不包含C库的应用程序 4.5 关于使用用户库 第5章 编辑器及浏览器 5.1 编辑器窗口功能介绍 5.2 搜索和替换操作 5.2.1 搜索和替换的方法 5.2.2 使用习惯表达式的...

    新版Android开发教程.rar

    放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay ...

    嵌入式软件测试工具--LOGISCOPE

    它面向源代码进行工作。LOGISCOPE 针对编码、测试和维护。因此,LOGISCOPE 的重点是帮助代码评审(Review )和动态覆盖测试(Testing )。 LOGISCOPE对软件的分析,采用基于国际间使用的度量方法(Halstead、...

    Thinking in Java 中文第四版+习题答案

    8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善...

    Think in Java(中文版)chm格式

    8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口...

Global site tag (gtag.js) - Google Analytics