《加密与解密基础》读书笔记
2021-04-26 08:38:31 0 举报
AI智能生成
《加密与解密(第3版)》以加密与解密为切入点,讲述了软件安全领域许多基础知识和技能,如调试技能、逆向分析、加密保护、外壳开发、虚拟机设计等。读者在掌握《加密与解密(第3版)》的内容,很容易在漏洞分析、安全编程、病毒分析、软件保护等领域扩展,这些知识点都是相互的,彼此联系。国内高校对软件安全这块教育重视程度还不够,许多方面还是空白,而近年来许多企业对软件安全技术人才需求量越来越大。从就业角度来说,掌握这方面技术,可以提高自身的竞争能力。从个人成长角度来说,研究软件安全技术有助于掌握一些系统底层知识。《加密与解密》由看雪软件安全论众多高手共同打造而成,读者将从《加密与解密(第3版)》中获得许多极具价值的技术,是专业开发人员不可多得的一本好书。
作者其他创作
大纲/内容
2.1 ASCII字符集 (American Standard Code for Information Interchange)
Unicode是ASCII字符编码的一个扩展,只不过在Windows中用2个字节对其进行编码,也称为“宽字符集”(Widechars)。
在Unicode中,所有的字符都是16位,包括所有的7位ASCII码都被扩充为16位(注意,高位扩充的是零)。例如,字符串“pediy”的ASCII码是:70h 65h 64h 69h 79h。其Unicode码的十六进制是:0070h 0065h 0064h 0069h 0079h
2.2 字节存储顺序
例如,将12345678h写入到以1000h开始的内存中,则结果如图1.1所示。本书以运行在Intel x86 CPU上的Windows为讲解平台,因此涉及的编码皆为Little-Endian类。
Big-Endian 高位字节存入低地址,低位字节存入高地址,依次排列;
Little-Endian 低位字节存入低地址,高位字节存入高地址,反序排列。
3.1 Windows API函数
初期,Windows程序员能够使用的编程工具唯有API函数。这些函数提供应用程序运行所需要的窗口管理、图形设备接口、内存管理等各项服务功能。以函数库的形式组织在一起,形成了Windows应用程序编程接口(API),简称“Win API”。
API函数是构筑整个Windows框架的基石
16位版本Windows的API(Windows 1.0到Windows 3.1)称作“Win16”,用于32位版本Windows的API(Windows 9x/NT/2000/XP/2003)称作“Win32”。64位版本Windows API的名称和功能基本没有变化,还是Win32的函数名,只不过是用64位代码实现的。API函数调用在从Win16到Win32的转变中保持兼容,并在数量和功能上不断增强——Windows 1.0支持不到450个函数调用,现在已有几千个函数。
动态链接库
Windows的3个主要子系统,
Kernel(由16位的KRNL386.EXE和32位的KERNEL32.DLL实现):操作系统核心功能服务,包括进程与线程控制、内存管理、文件访问等。
User(由16位的USER.EXE和32位的USER32.DLL实现):负责处理用户接口,包括键盘和鼠标输入、窗口和菜单管理等。
GDI(由16位的GDI.EXE和32位的GDI32.DLL实现):图形设备接口,允许程序在屏幕和打印机上显示文本和图形。
除了上述模块以外,Windows还提供了其他DLL以支持另外一些功能,包括对象安全性、注册表操作(ADVAPI32.DLL)、通用控件(COMCTL32.DLL)、公共对话框(COMDLG32.DLL)、用户界面外壳(SHELL32.DLL)、图形引擎(DIBENG.DLL)和网络(NETAPI32.DLL)。
例如,编程时使用MessageBox函数,而在USER32.DLL中却没有32位MessageBox函数的入口点。实际上,有两个入口点,一个名为“MessageBoxA”(ANSI版),另一个名为“MessageBoxW”(宽字符版)。幸运的是,程序员通常不必关心这个问题,代码中只需要使用MessageBox,开发工具中的编译模块就会根据设置来决定是采用MessageBoxA还是MessageBoxW。
3.2 WOW64(Windows-on-Windows 64-bit)
Windows的64位系统文件都放在一个叫作“System32”的文件夹中,WindowsSystem32文件夹中包含原生的64位映像文件。为了兼容32位操作系统,还增加了WindowsSysWOW64文件夹,其中是32位的系统文件。
64位应用程序会加载System32目录下64位的kernel32.dll、user32.dll和ntdll.dll。
32位应用程序加载时,WOW64建立32位ntdll.dll所要求的启动环境,将CPU模式切换至32位,并开始执行32位加载器,就如同该进程运行在原生的32位系统之上。
WOW64会对32位ntdll.dll的调用重定向ntdll.dll(64位),而不是发出原生的32位系统调用指令。WOW64转换到原生的64位模式,并捕获与系统调用有关的参数,发出对应的原生64位系统调用。当原生的系统调用返回时,WOW64将任何输出参数在返回至32位模式之前从64位转换成32位格式。
3.3 Windows 消息机制
Windows是一个消息(Message)驱动式系统。当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将输入的消息复制到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每个消息并发送给相应的窗口函数。两种消息队列:
系统消息队列
应用程序消息队列
常用的Windows消息函数列出
(1)SendMessage函数
(2)WM_COMMAND消息
(3)WM_DESTROY消息
3.4 虚拟内存
32位Windows操作系统的地址空间在4GB以内。Win32的平坦内存模式使每个进程拥有自己的虚拟空间。
虚拟内存的实现方法
① 当一个应用程序被启动时,操作系统就创建一个新进程,并给每个进程分配2GB的虚拟地址(不是内存,只是地址)。
② 虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置,并把当前所需要的代码读取到物理地址中(注意:虚拟地址与应用程序代码在物理内存中的位置是没有关系的)。
③ 如果使用动态链接库DLL,DLL也会被映射到进程的虚拟地址空间中,在需要的时候才被读入物理内存中。
④ 其他项目(例如数据、堆栈等)的空间是从物理内存中分配的,并被映射到虚拟地址空间中。
⑤ 应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理位置。
应用程序是不会直接访问物理地址的。
虚拟内存管理器通过虚拟地址的访问请求来控制所有的物理地址访问。
每个应用程序都有相互独立的4GB寻址空间,不同应用程序的地址空间是隔离的。
DLL程序没有自己的“私有”空间,它们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。因为如果它不和其他程序处于同一个地址空间,应用程序就无法调用它。
64位Windows操作系统提供16TB的有效寻址空间,其中有一半可用于用户模式的应用程序。
0-预备知识
1.汇编语言
2.Win32编程
1.2 软件解密技术
建议
1.3静态分析介绍
高级语言
编译成机器语言在CPU上运行。Visual C++,PASCAL,机器语言与汇编语言一一对应。
解释性语言:另一种一边解释一边执行VB,这类语言编译的程序可以被还原为高级语言的原始结构
1.反汇编
指令依赖性强,系统依赖性强,编译后执行效率比解释语言高
机器码转换为汇编语言过程
2.反编译
1.4动态分析介绍
动态跟踪主要是指利用Visual C++自带的调试器,或系统级调试器SoftICE或TRW2000等,一步一步跟踪分析。
原因:
1.静态地分析很难分析出这些中间结果的
2.最初执行的一段程序往往需要对该软件的后面各个模块进行一些初始始化工作,而没有依赖系统的重定位。
3.许多加密程序为了阻止非法跟踪和阅读,对执行代码的大部分内容进行了加密变换,而只有很短的一段程序是明文。加密程序运行时,采用了逐块解密,逐块执行和方法,首先运行最初的一段明文程序,该程序在运行过程中,不仅要完成阻止跟踪的任务,而且还要负责对下一块密码进行解密。显然仅对该软件的密码部分进行反汇编,不对该软件动态跟踪分析,是根本不可能进行解密的。
1.5 逆向工程
“hack”是褒义词,“crack”则是贬义词“
源代码 → 编译器 → 可执行程序”的过程是“顺向工程”的话,“可执行程序 → 反编译器或人工反编译 → 源代码”的过程就是逆向工程。
CRACKING的秘诀就是勤奋+执着!
0 条评论
下一页