原理
(1)程序如何在本地生成注册码
1.打开文件并写入MZ头部:打开一个二进制文件以进行写入操作。写入MZ头部,即前64字节,通常以字节序列 4D 5A 开始。
2.写入PE头部:PE头部紧随在MZ头部之后,其位置由MZ头部中的偏移地址 0x3C 指示。写入PE头部,即字节序列 50 45 00 00,表示ASCII字符 'P'、'E' 的ASCII码的十六进制表示,后跟两个空字节(0x00 0x00)。
3.写入其他PE文件头和节表等信息:根据PE文件格式的规范,可以写入其他必要的PE文件头信息,例如文件头部分、可选头部分等。还需要写入节表信息,包括节表项的描述和节数据。
4.计算注册码:注册码的生成可能涉及到各种算法,例如基于文件内容的哈希算法、加密算法等。通过对文件的特定部分进行计算,并结合密钥或其他参数,生成唯一的注册码。
5.将注册码写入文件中的特定位置或输出到控制台:注册码通常会被写入到文件中的特定位置,例如在PE文件的数据段之后,或者在文件的末尾添加一个特定的标记来存储注册码。另外,注册码也可以直接输出到控制台或保存到一个单独的文件中。
工具
1.windows环境
2.010editor
(1)分析pe文件格式中各重要字段值的过程,尤其是dos头、pe文件头、各区块头以及区块数据
1、MS-DOS:MZ头部
DOS MZ header:所有PE文件(甚至32位的DLLs) 必须以一个简单的DOS MZ header 开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS程序。以此达到对Dos系统的兼容。(DOS MZ header总共占用64byte)
MZ头部是Windows可执行文件的一部分,用于标识文件类型和指向PE头部(Portable Executable)的位置。它位于可执行文件的开头,通常以"4D 5A"这对字节开头。这个头部包含了一系列字段,其中大部分是保留字段,其值为0。最重要的字段之一是指向PE头部的偏移地址,它告诉系统在文件中找到PE头部的位置。 PE头部包含了更多关于文件结构和可执行代码的信息。
2.PE结构:
PE文件标识:
PE头部位于MZ头部之后,是PE文件的主要标识。它包含了PE文件的一些基本信息,比如文件类型、CPU架构、节表的位置等。PE头部通常是一个20字节的结构,以"PE"开头。PE文件标识是指在PE文件头部的起始位置处的一组字节,用于标识该文件为PE格式的可执行文件。在大多数情况下,这组字节的值为 "PE\0\0"(即 ASCII 字符 "P"、"E",后跟两个空字节)。这个标识是PE文件格式的基本特征之一,操作系统和其他相关工具通过检查这个标识来确认文件是否符合PE格式。 PE文件标识的存在使得操作系统能够正确地识别和处理PE格式的可执行文件。
PE文件头:
PE文件头是Windows可执行文件的核心部分,包含了标识、机器类型、节表数量、时间戳、符号表信息等重要字段,用于识别和加载文件。它的信息包括文件类型、架构、创建时间等,对于操作系统和开发者都至关重要。
PE可选头:
PE文件可选头部跟随在PE头部之后,包含了一些可选的信息,比如数据目录、程序入口点地址等。这个头部通常是一个224字节的结构。
Text头部:
"Text" 头部是PE文件中存储实际执行指令的部分,包含代码段起始地址、大小、属性等信息。它定义了程序的执行逻辑和入口点,对程序的执行至关重要。
Rdata头部:
Rdata头部是PE文件中的一个节表头部,存储只读数据,如常量、字符串等。它指示了该节在内存中的位置和大小,对于程序的安全性和性能至关重要。
Data头部:
Data头部是PE文件中用于存储各种类型数据的节表头部之一。常见的数据节包括存储已初始化变量的".data"节和存储未初始化变量的".bss"节。每个数据节都有自己的头部,包含节的起始地址、大小和属性等信息。
3.text区块:
text 区块通常是可执行文件中存储程序代码的部分。在可执行文件中,程序的指令集合会被存储在 .text 区块中。这个区块包含了程序的机器代码,即由处理器直接执行的指令序列。
在一个典型的可执行文件中,.text 区块是一个只读区块,因为程序的代码在运行时通常不会被修改。这个区块的属性通常被设置为可执行和可读,但不可写。
.text 区块是程序执行的起点,当程序被加载到内存并开始执行时,处理器会从 .text 区块的起始位置开始执行代码。
4.rdata区块:
.rdata 区块通常是可执行文件中存储只读数据的部分。在 Windows 操作系统中,它经常用于存储程序中的只读全局变量、常量以及其他只读数据。这些数据在程序运行时不能被修改,因此它们被放置在一个只读的区块中,以保证数据的完整性和安全性。(2)重点分析rdata区块的十六进制数填写过程
- 首先确定rdata段的起始地址,这里是600h。
- 确定导入表的相关信息。
- 填写数据目录数组的第二个元素导入表目录结构成员:
成员1:指向IMAGE_THUNK_DATA结构数组的RVA,映射后的值为“4C200000”。
成员2、成员3:用零填充。
成员4:指向DLL名字的RVA,即“user32.dll”的RVA为“6A200000”。
成员5:指向IMAGE_THUNK_DATA结构数组的RVA,映射后的值为“08200000”。
- 填写第二个数组元素的有关kennel32.dll信息的成员:
成员1:指向IMAGE_THUNK_DATA结构数组的RVA,映射后的值为“54200000”。
成员2、成员3、成员4、成员5:依次填写为“00000000”、“00000000”、“84200000”、“00200000”。
- 在IMAGE_IMPORT_DESCRIPTOR结构数组后面填写导入函数名称的RVA:
对于user32.dll,只有一个导入函数MessageBoxA,其RVA为“5C200000”,紧接着以“00000000”结束。
对于kennel32.dll,只有一个导入函数ExitProcess,其RVA为“76200000”,紧接着以“00000000”结束。
- 对齐.rdata段的剩余部分,用零填充。
- 最终得到的rdata区块为:
000600 A2 CA 81 7C 00 00 00 00 8A 05 D5 77 00 00 00 00
000610 4C 20 00 00 00 00 00 00 00 00 00 00 6A 20 00 00
000620 08 20 00 00 54 20 00 00 00 00 00 00 00 00 00 00
000630 84 20 00 00 00 20 00 00 00 00 00 00 00 00 00 00
000640 00 00 00 00 00 00 00 00 00 00 00 00 5C 20 00 00
000650 00 00 00 00 76 20 00 00 00 00 00 00 9D 01 4D 65
000660 73 73 61 67 65 42 6F 78 41 00 75 73 65 72 33 32
000670 2E 64 6C 6C 00 00 80 00 45 78 69 74 50 72 6F 63
000680 65 73 73 00 6B 65 72 6E 65 6C 33 32 2E 64 6C 6C
000690 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(3)完整的pe文件即exe文件以及其对应的十六进制数完整截图 (30分)
本文深入研究了PE(Portable Executable)文件格式,这是Windows操作系统下的一种常见的可执行文件格式。通过分析PE文件的各个重要字段值,包括DOS头、PE文件头、各区块头以及区块数据,加深了对PE文件结构的理解。了解到PE文件以MZ头部开头,这是为了在DOS系统下执行时能够被识别。然后,PE头部紧随其后,包含了PE文件的一些基本信息,如文件类型、CPU架构等。接着,可选头部包含了一些可选的信息,如数据目录、程序入口点地址等。在分析各个区块时,关注了.rdata区块,这是存储只读数据的部分。在Windows操作系统中,.rdata区块通常用于存储只读全局变量、常量等数据,保证了程序运行时这些数据的完整性和安全性。