#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];
}
}
分享到:
相关推荐
本资源包含了"C++实验程序源代码",旨在帮助学习者深入理解面向对象编程的核心概念和C++语言的使用。 1. **面向对象编程基础** - 类与对象:面向对象编程的基础是类,它是一种抽象的数据类型,定义了一组属性...
通过阅读和分析《C++程序设计(第8版)》的源代码,可以深入了解以上知识点的实际应用,并提升编程技能。每个示例代码都精心设计,旨在引导学习者逐步掌握C++的核心概念和实践技巧。通过动手实践,将理论知识与实际...
除了这些基本概念,学习此项目源代码还可以了解到文件I/O、动态内存管理、函数指针、STL(标准模板库)等C++进阶主题。STL包含容器(如vector、list、set)、迭代器、算法和函数对象,它们提供了高效的内存管理和...
【标题】:“C++潜艇大战源代码”是一个关于利用C++编程语言开发潜艇大战游戏的教程,通过实际的代码示例介绍了游戏的核心机制和开发流程。 【描述】:描述中的代码段展示了水雷的控制逻辑,当水雷的顶部位置达到50...
10. **编译和链接**:C++源代码通常包含多个文件,涉及头文件(.h或.hpp)和实现文件(.cpp),学习如何正确组织和编译这些文件也是学习C++的重要部分。 通过研究《C++技术内幕第六版》的源代码,读者不仅可以深化...
- **编译与运行**:编写完成后,需要使用C++编译器将源代码编译成可执行文件。常用的编译器有GCC、Clang等。 ##### **1.5 关于C++上机实践** - **练习项目**:通过实际操作,加深对概念的理解。例如,可以编写简单...
总的来说,这段源代码提供了一个实用的工具,通过VC++2008编译,能够帮助用户深入分析磁盘使用情况,有效地管理文件系统。开发者可以学习其中的数据遍历、磁盘空间计算和界面展示技巧,这对于开发类似工具或增强现有...
屏保程序是计算机系统中的一种特殊应用程序,当用户在一段时间内无操作时,它会自动显示,以保护显示器不被长时间静态图像烧伤。在这个C++课程设计项目中,我们关注的是如何用C++编程语言编写屏保程序。C++是一种...
5. **程序的开发过程**:编程通常包括编写源代码、编译、链接,最终形成可执行文件。在C++中,IDE(集成开发环境)如Visual Studio或Code::Blocks能提供便利的开发环境。调试工具帮助我们定位并修复程序错误,版本...
GDB是Unix下的一个强大的源代码级调试工具,用于查找和修复程序中的错误。学会使用GDB可以帮助我们更有效地调试C++程序。 通过以上知识点的学习和实践,你将能够掌握C++的基础并进行有效的Unix环境下的编程。不断...
### C++程序设计基础知识点梳理 #### 第一章:程序设计与C++语言初步 - **程序设计方法:** - 自顶向下方法(Top-down):将复杂问题分解为多个较小、较简单的子问题来解决。 - 自底向上方法(Bottom-up):将已...
这两个函数都需要包含`windows.h`头文件,并且在C++程序中使用`#define _WIN32`或`#define _WINDOWS`预处理器指令。 ```cpp #include void moveMouse(int x, int y) { SetCursorPos(x, y); } void clickMouse...
4. **编译与连接**:编译过程是将源代码转换为机器码,连接则是将多个目标文件链接为可执行文件。 5. **早期绑定与晚期绑定**:早期绑定在编译时确定函数或变量的地址,而晚期绑定则在运行时才确定。 6. **面向对象...
这个“显示或隐藏桌面窗口(VC++6.0源代码)”的压缩包提供了在VC++6.0开发环境中实现这一功能的源代码。 VC++6.0是Microsoft公司推出的一款经典的C++集成开发环境,广泛应用于Windows平台上的应用程序开发。通过它,...
在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Class)应用程序中添加文件和文件夹,以及相关的源代码实现。MFC是微软提供的一套面向对象的类库,用于简化Windows应用程序开发,它基于C++语言。 首先,...
C++程序设计是计算机科学中的基础且重要的一环,它是一种强大的编程语言,结合了低级语言的效率和高级语言的抽象能力。本篇习题指导主要针对C++程序设计的学习,适合初学者掌握和理解C++的核心概念。 首先,C++语言...
这个"LPK劫持源代码 xp win7通用.zip"文件包含的可能是一段跨平台的源代码,可以用于在Windows XP和Windows 7这两个不同的操作系统版本上执行LPK劫持。 源代码通常由编程语言编写,这里标签提及了"vc",这可能意味...
标题中的“隐藏我的电脑、网上邻居的源代码”是指一种编程技术,主要目的是为了保护用户的计算机资源不被未经授权的访问。在IT行业中,这通常涉及到系统安全、隐私保护以及访问控制等领域。源代码是程序的基本构成,...