您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > Pe文件实现信息隐藏-冯绍东-
Pe文件实现信息隐藏冯绍东主要内容:•PE文件结构•原理•实现•上述算法的一点改进•小结一PE文件结构•PE文件框架构成DOSMZheaderDOSstubPEheaderSectiontableSection1Section2Section...SectionnPE文件结构的总体层次分布。DOSMZheaderDOSstub所有PE文件(甚至32位的DLLs)必须以一个简单的DOSMZheader开始,在偏移0处有DOS下可执行文件的“MZ标志”,有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZheader之后的DOSstub。DOSstub实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显示一个错误提示,类似于字符串ThisprogramcannotruninDOSmode或者程序员可根据自己的意图实现完整的DOS代码。通常DOSstub由汇编器/编译器自动生成,对我们的用处不是很大,它简单调用中断21h服务9来显示字符串ThisprogramcannotruninDOSmode。节表(Section):typedefstruct_IMAGE_SECTION_HEADER{BYTEName[IMAGE_SIZEOF_SHORT_NAME];//节表名称,如“.text”union{DWORDPhysicalAddress;//物理地址DWORDVirtualSize;//真实长度}Misc;DWORDVirtualAddress;//RVADWORDSizeOfRawData;//物理长度DWORDPointerToRawData;//节基于文件的偏移量DWORDPointerToRelocations;//重定位的偏移DWORDPointerToLinenumbers;//行号表的偏移WORDNumberOfRelocations;//重定位项数目WORDNumberOfLinenumbers;//行号表的数目DWORDCharacteristics;//节属性}可用空间=SizeOfRawData(物理长度)-VirtualSize(真实长度)二原理(1)PE文件由于使用高级语言编写的,存在大量的冗余,我们需要做的是在不影响程序执行的基础上把我们的资料存放到那些程序没用到的空间。我们可在上边的节表中发现SizeOfRawData,VirtualSize,一个是物理长度,一个是实际长。SizeOfRawData-VirtualSize就是我们可利用的空间。我们只要找到这段空间的起始地址就行了。而PointerToRawData就是我们要的,这样问题都解决了。剩下的只是编程实现了。另外,除了段空间可利用外,文件头也有一大段的空间可用,CIH病毒就是利用它隐藏自己的。为了加强隐密性,我们需要把VirtualSize的值改为VirtualSize+加入该段的长度。而这会导致后来还原不回来,所以要在文件中加入一段特殊的字符串,这样在还原时根据该字符串得到隐藏资料的起点。在程序中特殊字符串即用户输入的密码。这样不知道密码者就不容易获得其中隐藏资料。原理(2)段隐藏空间段程序占用空间可利用空间段首地址PointerToRawData真实长度VirtualSize物理长度SizeOfRawData原理(3)PE文件头隐藏空间PE文件头第一段的PointerToRawDataDOSMZheaderDOSstubPEheaderSectiontable可利用空间(大约3kb,CIH病毒利用此空间)三实现•首先获得pe文件头的信息•获得段的信息•写文件,实现信息隐藏获得pe文件头的信息Voidgetpeheader(CStringfilename){CFilecf;cf.Open(filename,CFile::modeRead);cf.ReadHuge(&dos_head,sizeof(IMAGE_DOS_HEADER));cf.Seek(dos_head.e_lfanew,0);cf.ReadHuge(&signature,sizeof(DWORD));cf.ReadHuge(&_head,sizeof(IMAGE_FILE_HEADER));cf.ReadHuge(&opt_head,sizeof(IMAGE_OPTIONAL_HEADER));cf.Close();}获得段的信息Voidgetsection(Cstringfilename){CFilecf;cf.Open(filename,CFile::modeRead);longsecpos=sizeof(IMAGE_DOS_HEADER)+dos_head.e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)+sizeof(IMAGE_OPTIONAL_HEADER);cf.Seek(secpos,0);for(intI=0;I_head.NumberOfSections;I++)cf.ReadHuge(§ion_header[I],sizeof(IMAGE_OPTIONAL_HEADER));cf.Close();}程序中段的总数段表位置写文件,实现信息隐藏Voidwritefile(Cstringfilename,intsection){CFilecf;cf.Open(filename,CFile::modeWrite);if((section_header[section].SizeOfRawData-section_header[section].Misc.VirtualSize)=0){cf.Close();return;}cf.Seek(section_header[section].PointerToRawData+section_header[section].VirtualSize,0);longI=0;charch;while(Isection_header[section].SizeOfRawData-section_header[section].Misc.VirtualSize){if((ch=mygetch()))cf.WriteHuge(&ch,1);I++;}cf.Close();}四上述算法的一点改进•为了增强保密性,最好在隐藏资料前对资料进行加密,如使用rijnaedl等算法•为了能检测出,资料是否被修改,可以采取校验位方法•详细做法参看程序源代码使用rijnaedl•可利用现成的控件•可以用程序接口简单校验位方法添加检验位根据密码弄乱顺序五小结•pe文件具有一定的隐藏性.许多病毒程序就隐藏于它.和bmp图象隐藏相比有它自己的特点•Pe文件实现信息隐藏目的在于提供一种新想法谢谢!如有错误请指出EMAIL:sudunfsd@163.com
本文标题:Pe文件实现信息隐藏-冯绍东-
链接地址:https://www.777doc.com/doc-3435868 .html