计算机科学与技术专业毕业设计-pe格式程序加壳软件内容摘要:

列号的过程,其实就是验证用户名和序 列号之间的数学映射关系。 这个映射关系是由软件的设计者制定的,所以各个软件生成序列号的算法是不同的。 这是最常见的一种保护方式。 4 警告( NAG)窗口 Nag 的本义是烦人的意思。 Nag 窗口是软件设计者用来不时提醒用户购买正式版本的窗口。 时间限制 这类保护的软件一般都有时间段的限制,例如试用 30天等。 当过了共享软件的试用期后,就不予运行。 只有向软件作者付费注册之后才能得到一个无时间限制的注册版本。 Key File 保护 Key File(注册文件)是一种利用文件 来注册软件的保护方式。 Key File 一般是一个小文件,可以是纯文本文件,也可以是包含不可显示字符的二进制文件,其内容是一些加密过或未加密的数据,其中可能有用户名、注册码等信息。 文件格式则由软件作者自己定义。 试用版软件没有注册文件,当用户向作者付费注册之后,会收到作者寄来的注册文件,其中可能包含用户的个人信息。 用户只要将该文件放入指定的目录,就可以让软件成为正式版。 该文件一般是放在软件的安装目录中或系统目录下。 软件每次启动时,从该文件中读取数据,然后利用某种算法进行处理,根据处理的结果判断是否为正确的注册文 件,如果正确则以注册版模式来运行。 功能限制的程序 这种程序一般是 DEMO 版或菜单中部分选项是灰色。 有些 DEMO 版本的部分功能里面根本就没有。 而有些程序功能全有,只要注册后就正常了。 CDcheck 最简单也最常见的光盘保护就是程序在启动时判断光驱中的光盘上是否存在特定的文件,如果不存在则认为用户没有正版光盘,拒绝运行。 在程序运行的过程当中一般不再检查光盘的存在与否。 5 3 软件加壳脱壳介绍 什么是壳 自然界中,植物用壳来保护种子,动物用壳来保护身体等。 同样, 在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。 它们附加在原程序上通过 windows 加载器载入内存后,先于原始程序执行,得到控制权。 执行过程中对原始程序进行解密,还原,还原完成后再把控制权交还给原始程序,执行原因来的代码的部分。 加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的。 只在执行时在内容存中还原,这样就可以比较有效地防止破解者对程序文件的非法 修改,同时也可防止程序被静态反编译。 由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳 ”了。 ( 图 ) 加壳软件一般都有良好的操作界面,使用也比较简单。 除了一些商业壳,还有一些个人开发的壳,种类较多。 壳对软件提供了良好保护的同时,也带来了兼容性的问题。 选择一款壳保护软件后,要在不同硬件和系统上多测试。 由于壳能保护自身代码,因此许多木马或者病毒都用壳来保护和隐藏自己。 对于一些流行的壳,杀毒引擎能对目标软件脱壳,再进行病毒检查。 而大多数私人壳,杀毒软件不会专门开发解压引擎,而是直接把壳当成木马或者病毒处理。 有加壳就一定有脱壳。 一般的脱壳软件多是专门针对某加壳软件而编写的,虽然针对性强 ,效果好,但收集麻烦。 6 壳的种类 压缩壳 不同的外壳所侧重方面不一样,有的侧重于压缩,有的则侧重于加密。 压缩壳的特点是减小软件体积,加密保护不是重点。 常见的压缩壳有: UPX, ASPack, PECompact 等 . 加密壳 加密壳和类多 ,一些加密壳单纯保护程序 ,另一些壳还提供额外的功能 .侧重于软件的保护 , 使软件不容易被分析 , 反汇编 . 常见的加密壳有 :ASProtect,Armadillo,EXECryptor,Themida 等 脱壳技术 任何事物都有两面 性 ,有加壳 ,就必有脱壳 .加壳与脱壳有着紧密的联系 .一些脱壳技术是针对加壳而产生的 ,脱壳的进步 ,又迫使加壳软件不断创新发展 . 脱壳一般分手动和自动两种,手动就是用 TRW20 TR、 SOFTICE 等调试工具对付,对脱壳者有一定水平要求,涉及到很多汇编语言和 软件调试 方面的知识。 而自动就是用专门的脱壳 工具来脱,最常用某种 压缩软件 都有他人写的反压缩工具对应,有些压缩工具自身能解压,如 UPX;有些不提供这功能,如: ASPACK,就需要 UNASPACK 对付,好处是简单,缺点是版本更新了就没用了。 另外脱壳就是用专门的脱壳工具来对付,最流行的是 PROCDUMP ,可对付目前各种 压缩软件 的压 缩档。 知道文件的加密方式,就可以使用不同的工具、不同的方法进行脱壳。 7 4 PE 文件结构 简介 PE文件被称为可移植的执行体是 Portable Execute 的全称,常见的 EXE、 DLL、 OCX、SYS、 COM 都是 PE 文件, PE 文件是 微软 Windows 操作系统 上的 程序文件 (可能是间接被执行,如 DLL) 认识可执行文件的结构非常重要,在 DOS 下是这样,在 Windows 系统下更是如此。 了解了这种结构后就可以对可执行程序进行加密、加壳和修改等,一些黑客也利用了这些技术。 对于一切的加壳脱壳 ,都是对 PE文件进行加壳脱壳。 所以了解 PE文件对加壳及脱壳是必不可少的。 PE 文件结构布局 PE文件的数据结构在磁盘中和内存中一样这个是它的最大特点。 加载一个可执行文件到内存主要是把 PE 文件中的某个部分映 射到地址空间中。 那么不仅要问编写好的代码怎样变成了可执行文件,这个过程就是编译器的主要工作,它将其编译称为目标文件 OBJ,这样连接器就将 OBJ 文件和涉及到的库文件以及资源文件连接起来,生成最后的 EXE 文件保存在磁盘中,当我们运行其文件时 Windows 加载器就负责把 EXE 文件按照 PE 文件格式映射到内存的线性地址空间,最终表现为一个进程。 当然这只是一个简单的介绍,这里面还涉及到操作系统的很多内容,这里我们关系与 PE文件格式相关的内容有:相对虚拟地址、导入表、重定位表等内容。 8 (图 ) 重 要的 PE 结构 输入表 输入表是 PE 文件结构中不可或缺的部分,输入表也称之为“导入表”。 要想了解输入表,首先还得先从 DLL 文件入手。 日常生活中我们会看见一些大型软件有很多的 DLL格式的文件,它们是“ 动态链接库文件 ”,这些文件中有很多的导入函数,这些函数不会直接被执行,当一个程序( EXE)运行时,导入函数是被程序调用执行的,其执行的代码 9 是不在主程序( EXE)中的一小部分函数,其真正的代码却在 DLL 文件中。 这时我们就会想,那么 EXE 主程序是如何找到这些需要导入的函数呢,这就要归结于“输入表”了,输入表就相当于 EXE 文件与 DLL 文件沟通的钥匙,形象的可以比喻成两个城市之间交流的高速公路,所有的导入函数信息都会写入输入表中,在 PE 文件映射到内存后, windows将相应的 DLL 文件装入, EXE 文件通过“输入表”找到相应的 DLL 中的导入函数,从而完成程序的正常运行,这一动态连接的过程都是由“输入表”参与的。 输入表的结构:输入表是以一个 IMAGE_IMPORT_DESCRIPTOR(IID)数组开始,一个程 序 要调用几个 dll 就会有几个 IID 项,即每个 IID 对应于一个 dll IID 结构: IMAGE_IMPORT_DESCRIPTOR struct union{ DWORD Characteristics。 00h DWORD originalFirstThunk。 }。 TimeDateStamp DWORD。 04h ForwarderChain DWORD。 08h Name DWORD。 0Ch FirstThunk DWORD。 10h IMAGE_IMPORT_DESCRIPTOR ends 当 pe 文件被装载 器装入之后, OriginalFirstThunk 还指向原来的数组( INT 输入名字表: Import Name Table), 而 FirstThunk 则用调用的输入函数在内存的虚拟地址来代替表中的内容,即指向的是一张指向输入函数地址的表,称为: IAT(输入地址表: Import Address Table) IMAGE_THUNK_DATA 结构: typedef struct IMAGE_THUNK_DATA{ union{ PBYTE ForwarderString。 //当该结构双字最高位为 1 时,表示函数以序号方式输入,此时双字低位为函数序号 PDWORD Function。 10 //当最高位为 0时,表示函数以字符串类型的函数名方式输入,此时整个双字的值是 DWORD ordinal。 //一个 RVA,指向一个 MAGE_IMPORT_BY_NAME 结构(如下定义) PIMAGE_IMPORT_BY_NAME AddressOfData。 // }ul。 } IMAGE_IMPORT_BY_NAME 结构: MAGE_IMPORT_BY_NAME STRUCT Hint WORD ? //指示本函数在所驻留 dll 中的输出表中的序号(不是必须的) Name BYTE ? //含有输入函数的函数名,一个 ASCII 码字符串,以 NULL 结尾(可变尺寸 ) MAGE_IMPORT_BY_NAME ENDS 输入表的结构如下图所示 (图 ) 11 输出表 当 PE 文件被执行的时候, windows 装载器将文件装入内存并将 输入表 中登记的 DLL 文件一并装入,再根据 DLL 文件中的函数输出信息对被执行文件的 IAT 表进行修正。 在这些包含输出函数的 DLL 文件中,输出信息被保存在输出表中,通过输出表, DLL 文件向系统提供输出函数的名 称,序号和入口地址等信息。 以便 windows 装载器通过这些信息来完成 动态链接 的过程。 一般来说, exe 文件不存在输出表, DLL 文件大部分都包含输出表,不过这不是绝对的。 一个 Windows 程序,它所实现的所有功能最终几乎都是调用系统 DLL 提供的 API 函数。 通过我先前文章手写的 Hello World 程序可以看出,要使用任何一个 DLL 所提供的函数,我们需要将它导入,也就是用到了导入表。 然而对于那些提供了被导出 的函数的 DLL 程序来说,他们必须使用导出表将函数导出,之后别的程序才可以使用。 无论是系统提供的标准 DLL 还是个人编写的 DLL,只要想提供自己的函数给别人使用就必须建立导出表。 一般使用任何开发环境编写具有导出功能的程序,导出表都是由链接器自动建立的。 程序员只需指定被导出的函数名称或序号即可。 以下是输出表的定义: typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics。 DWORD TimeDateStamp。 WORD MajorVersion。 WORD MinorVersion。 DWORD Name。 DWORD Base。 DWORD NumberOfFunctions。 DWORD NumberOfNames。 DWORD AddressOfFunctions。 // RVA from base of image DWORD AddressOfNames。 // RVA from base of image DWORD AddressOfNameOrdinals。 // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY。 12 第一个成员( Characteristics)是个 DWORD 类型,占四个字节。 通常该值为零。 第二个成员( TimeDateStamp) DWORD 类型,表示输出表创建的时间,该时间是自 1970年 1 月 1 日至今的秒数。 这个值通常不会影响程序执行,可以是。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。