《加密与解密》- 第一章 - 基础知识 - 笔记

发布时间 2023-06-02 15:21:54作者: Carykd

(纠正了书中一些不正确的地方,如P11中2**64bytes等于16TB已修改为16EB)

1.1 什么是加密与解密

1.1.1 软件的加密与解密

1.1.2 软件逆向工程

内容:

  1. 去除使用限制或者添加功能
  2. 获得源代码
  3. 硬件的复制和模拟

要求品质:

  1. 保持好奇,崇尚自由
  2. 勤奋+毅力
  3. 精通至少一门编程语言,尤其是编程思想
  4. 扎实的汇编和系统编程功底

1.1.3 逆向分析技术

分析软件途径:

  1. 已被公开的使用方法及文档等(理解设计思想和编程思路)
  2. 静态分析技术
  3. 动态分析技术
    1. 粗跟踪(快速猜测函数的功能,而不是每个都跟)
    2. 细跟踪(对关键函数具体分析)

1.2 文本字符

1.2.1 ASCII和Unicode字符集

ASCII

7位编码,占用1B

ANSI

ASCII的扩展,占用1BANSI是系统预设

(还有同样占用1B的Symbol、OEM等)

Unicode

一套编码方案,内含多种编码方案

ASCII的拓展,占用不定,取决于编码方案和原始数据大小

常用Utf-8

ASCII到Unicode的转换:高位补0

补充:字符编码总结

1.2.2 字节存储顺序

字节序分为大端序和小端序,这是面向处理器的。

大端序(Little-endian):高位字节存入低地址,低位字节存入高地址

小端序(Big-endian):高位字节存入高地址,低位字节存入低地址

(x86用Little-endian,网络协议和PowerPC用Big-endian)

1.3 Windows操作系统

1.3.1 Win32API

兼容性:

win32 兼容 win16

win64 兼容 win32

但win64 不兼容 win16

主要子系统:

Kernel:操作系统核心功能服务,如进程线程控制,内存管理,文件访问等

User:处理用户接口,如键盘鼠标输入,窗口和菜单管理

GDI图形设备接口,允许在屏幕和打印机显示文本和图形

(还有一些其他的dll在这里没有列出)

函数字符集中,"A" 表示 "ANSI","W"表示"Widechars"(Unicode

例子:Windows 2000 的 MessageBox

分为MessageBoxAMessageBoxW

调用链:MessageBoxA->MessageBoxExA->MessageBoxExW

可以看出,在Windows 2000下,MessageBox最终调用的是Unicode版本的代码

Win32程序大量调用API,通过下API断点可以带来极大方便

1.3.2 WOW64

即Windows-On-Windows 64-bit

功能:为Win32程序在64位OS运行提供环境

位置:C:\Windows\System32

(补充:64位系统文件在 C:\Windows\System32)

运行

64应用程序:

需要加载(64位)

C:\Windows\System32\kernel32.dll

C:\Windows\System32\user32.dll

C:\Windows\System32\ntdll.dll

32应用程序:

  1. 建立ntdll.dll(32位)所需环境
  2. CPU模式切换到32
  3. 执行32位解释器
  4. ntdll.dll(32位)调用重定向ntdll.dll(64位)
  5. 转换到原生的64环境,产生64位系统调用
  6. 系统调用返回后,把输出参数转化32
  7. 返回32模式

局限

  1. 不支持16位应用程序运行
  2. 不支持32位内核模式的驱动程序
  3. 不支持64位dll的加载

(同样,64位下不能加载32位dll)

1.3.3 Windows消息机制

Windows是消息驱动式系统

消息提供程序之间程序与系统间通信手段

消息队列:分为系统消息队列应用程序消息队列两种

Windows监控所有输入设备

事件处理流程:

  1. Windows取得事件,放入系统消息队列
  2. 系统消息队列复制该消息相应的应用程序队列
  3. 应用程序检索每个消息并发给相应窗口函数
  4. 窗口函数处理消息

(上述过程几乎没有例外,消息具有非抢先性)

常用消息和函数简介

  1. SendMessage(函数)
    1. 功能:把消息发给某窗口,消息处理完才返回值
    2. 返回值:取决于具体消息,发送成功返回非零值
  2. WM_COMMAND(消息)
    1. 功能:从菜单或按钮中选择命令或控件,或快捷键被释放时发送
    2. 返回值:若被应用程序处理,则返回0
  3. WM_DESTROY(消息)
    1. 功能:窗口被销毁时发送
    2. 返回值:若被应用程序处理,则返回0
  4. WM_GETTEXT(消息)
    1. 功能:把对应窗口的文本复制到呼叫程序提供的缓冲区中
    2. 返回值:被复制的字符数
  5. WM_QUIT(消息)
    1. 功能:调用PostQuitMessage时产生
    2. 返回值:没有返回值
  6. WM_LBUTTONDOWN(消息)
    1. 功能:当光标停留在一个窗口的客户区且按下鼠标左键,则消息被发送。若动作未被捕获,发给光标下的窗口;否则给捕获的窗口。
    2. 返回值:若被应用程序处理,则返回0

1.3.4 虚拟内存

本质:通过映射,让每个程序看似独享整个内存大小(32位下为4GB)

物理内存中,操作系统和系统DLL时刻被映射,用户程序只在自己的时间片被映射,用户DLL在此基础上被选择性映射。

实现和过程:

  1. 程序启动,这其实等于系统创建一个进程,并分配一定的空间地址(只是地址,并不是分配这么多空间)
  2. 把代码映射到虚拟地址的代码段,然后把只把当前需要执行的指令放到物理内存(虚拟地址要经过映射才能得到物理地址,故一般不相等)
  3. 使用DLL的话,DLL也放到虚拟地址里,要用时才载入物理内存
  4. 其他项目(数据、堆栈)也从物理内存分配并被映射到虚拟地址
  5. 程序开始执行,遇到内存访问则映射到物理内存取出,放回虚拟地址。

位置:存放在磁盘中,要用的时候再挪到内存(加速可以通过页表等,但对我们的问题不重要)

好处:简化内存管理,避免多任务环境下应用程序的冲突

64下,虚拟内存理论大小16EB。由于用不了这么大,系统实际支持内存少很多,但完全够用。