《加密与解密》(第三版)【1】基础知识——小结

来源:互联网 发布:手机淘宝发布宝贝教程 编辑:程序博客网 时间:2024/06/05 02:28

这章纯基础知识,四块内容:文本字符、Windows操作系统、保护模式和PE格式。

文本字符是介绍了下ASCII和Unicode字符集,然后Windows操作系统介绍了下Windows下的一些常用API(后面逆向常会遇到,熟悉参数列表及函数功能)和术语(句柄)及消息机制等。保护模式和PE文件格式做了个粗略的介绍。

一、文本字符

首先,有大小端规则来说明多字节数据的存放顺序:

Big-Endian(正序、大端):高位字节存入低地址,地位字节存入高地址,依次排列。

Little-Endian(逆序、小端):地位字节存入低地址,高位字节存入高地址,依次排列。


常见的Intel体系芯片使用的编码属于小端规则,某些RISC架构的CPU,如IBM的Power-PC等属于大端规则。

这本书作者的讲解是基于Intelx86上的Windows平台的,所以都是小端规则。


ASCII和Unicode字符集,这个,继续维基百科:

ASCII:“ASCII(pronunciation: /ˈæski/ ASS-kee[1],American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語,而其擴展版本EASCII則可以勉強顯示其他西歐語言。它是現今最通用的單字節編碼系統(但是有被Unicode追上的跡象),並等同於國際標準ISO/IEC 646。” 

Unicode:“Unicode(统一码、万国码、单一码、标准万国码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简化地方式来呈现和处理文字。”

这样大概可以区别出来了,一个是主要显示现代英文,另一个是整合了其它文字系统(国际化必须)。另外,实现方面,一个7位,另一个16位。



二、Windows操作系统

WinAPI方面,介绍历史:

用于16位版本Windows的API(Windows1.0到Windows3.1)现在称作Win16。

用于32位版本Windows的API(Windows9x/NT/2000/XP/2003)现在称作Win32。

所有32位版本的Windows都支持Win16API(和旧应用程序兼容),不过Windows NT/2000/XP和Windows 9x的工作方式不同。

在Windows NT/2000/XP上,Win16函数调用通过一个转换层被转化为Win32函数调用,然后被操作系统处理(实际调用Win32,WOW)。

而在Windows 9x上,是由Win16函数支持的,既是Win32函数实际上是通过调用Win16函数实现的。


早起,Windows的主要部分只需要三个动态链接库实现:Kernel、User和GDI。

Kernel(由16位的KRNEL386.DLL和32位的KERNEL32.DLL实现):操作系统核心功能服务,包括进程和线程控制、内存管理和文件访问等。

User(由16位的USER.DLL和32位的USER32.DLL实现):负责处理用户接口,包括键盘和鼠标输入、窗口和菜单管理等。

GDI(由16位的GDI.DLL和32位的GDI32.DLL实现):图形设备接口、允许程序在屏幕和打印机上显示文本和图形。

除上述模块外,还提供其它功能模块。

(Windows 9x是一个16位和32位的混合体,因此系统需要加载16位和32位的DLL;而Windows NT/2000/XP是一个纯32位系统,并没有加载16位的DLL,不过还是保留在了SYSTEM32目录下。现在Win64下还有个SYSWOW64目录。)


接着,需要知道一些常用WinAPI。

hmemcpy、GetWindowsText……


还有句柄。应用程序中需要向系统申请一些对象,系统就会返回这些对象的句柄,通过这些句柄,进程可以操控对象。(不同进程同一对象句柄可能不同,意思是不能乱共享,需要正确方法。)


Windows 9x几乎都是使用ANSI字符串来进行所有的内部操作的。而新架构上,从头到尾都用Unicode进行开发,系统核心是用Unicode函数工作的。而ANSI版本,则需要通过一个转换层来调用Unicode版本的函数。(会进行些额外的操作,从而占用更多的内存和CPU资源。)


Windows消息机制,记住Windows是消息驱动型的系统就OK了。Windows系统中有两种消息队列:一种是系统消息队列,另一个中是应用程序消息队列。当一个事件发生时,先进系统消息队列,然后再拷贝到各应用程序消息队列。


三、保护模式

三种模式:实模式、保护模式、虚拟86模式。实模式是古老的MS-DOS运行的环境,只能利用32位寄存器的前16位,而后16位则白白浪费。而保护模式则可以运行更多的内存。


保护模式下的权限级别,在保护模式下,所有的应用程序都有权限级别(PL),从0到3有4等,其中0最高,3最低。操作系统的核心层是运行在Ring0级的,而Win32子系统(如KERNEL32.DLL、USER32.DLL)是运行在Ring3级的,以提供与应用程序的接口。




四、认识PE格式

Windows的可执行文件(EXE,DLL)是PE(Portable Executable )格式。

PE文件使用的是一个平面地址空间,所有的代码和数据都被合并在一起,组成一个很大的结构。文件的内容被分割为不同的区块(section,区段、节),块中包含代码或数据。每个块都有它自己在内存中的一套属性(是否包含代码,是否只读……)。

每个区块都有不同的名字,这个名字用来表示区块的功能。常见的块的含义:

*.text:是在编译或汇编结束时产生的一种块,它的内容全是指令代码;

*.rdata:是运行期只读数据;

*.data:是初始化的数据块;

*.idata:包含其他外来DLL的函数及数据信息,既输入表;

*.rsrc:包含模块的全部资源,如图标、菜单、位图等。


PE文件非常好的一个地方就是在磁盘上的数据结构与在内存中的结构是一致的。装载一个可执行文件到内存中主要就是讲一个PE文件的某一部分映射到地址空间中。这样,PE文件的数据结构在磁盘和内存中的是一样的。



PE相关名词解释:

1、入口点(Entry Point):PE文件执行时的入口点,也就是说,程序在执行时的第一行代码的地址应该就是这个值。

2、文件偏移地址(File Offset):当PE文件储存在磁盘上时,各数据的地址称作文件偏移地址。文件偏移地址从PE文件的第一个字节开始计数,起始值为0。

3、虚拟地址(Virtual Address,VA):由于Windows程序运行在386保护模式下,所以程序访问存储器所使用的逻辑地址成为虚拟地址,又称为内存偏移地址。与实地址模式下的分段地址类似。

4、基地址(ImageBase):文件执行时被映射到指定内存中,这个初始地址称为基地址(ImageBase)。这个值是由PE文件本省设定的。按照默认设置,用VC建立的EXE文件基地址是0040000h,DLL文件基地址是10000000h。但是,可以在创建应用程序的EXE文件时改变这个地址。

原创粉丝点击