(纠正了书中一些不正确的地方,如P11中2**64bytes等于16TB已修改为16EB)
1.1 什么是加密与解密
1.1.1 软件的加密与解密
略
1.1.2 软件逆向工程
内容:
- 去除使用限制或者添加功能
- 获得源代码
- 硬件的复制和模拟
要求品质:
- 保持好奇,崇尚自由
- 勤奋+毅力
- 精通至少一门编程语言,尤其是编程思想
- 扎实的汇编和系统编程功底
1.1.3 逆向分析技术
分析软件途径:
- 已被公开的使用方法及文档等(理解设计思想和编程思路)
- 静态分析技术
- 动态分析技术
- 粗跟踪(快速猜测函数的功能,而不是每个都跟)
- 细跟踪(对关键函数具体分析)
1.2 文本字符
1.2.1 ASCII和Unicode字符集
ASCII:
7位编码,占用1B
ANSI:
ASCII的扩展,占用1B(ANSI是系统预设)
(还有同样占用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
分为MessageBoxA和MessageBoxW
调用链: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位应用程序:
- 建立ntdll.dll(32位)所需环境
- CPU模式切换到32位
- 执行32位解释器
- 把ntdll.dll(32位)调用重定向到ntdll.dll(64位)
- 转换到原生的64位环境,产生64位系统调用
- 系统调用返回后,把输出参数转化为32位
- 返回32位模式
局限:
- 不支持16位应用程序运行
- 不支持32位内核模式的驱动程序
- 不支持64位dll的加载
(同样,64位下不能加载32位dll)
1.3.3 Windows消息机制
Windows是消息驱动式系统
消息提供程序之间和程序与系统间的通信手段
消息队列:分为系统消息队列和应用程序消息队列两种
Windows监控所有输入设备
事件处理流程:
- Windows取得事件,放入系统消息队列
- 系统消息队列复制该消息到相应的应用程序队列
- 应用程序检索每个消息并发给相应窗口函数
- 窗口函数处理该消息
(上述过程几乎没有例外,消息具有非抢先性)
常用消息和函数简介
- SendMessage(函数)
- 功能:把消息发给某窗口,消息处理完才返回值
- 返回值:取决于具体消息,发送成功返回非零值
- WM_COMMAND(消息)
- 功能:从菜单或按钮中选择命令或控件,或快捷键被释放时发送
- 返回值:若被应用程序处理,则返回0
- WM_DESTROY(消息)
- 功能:窗口被销毁时发送
- 返回值:若被应用程序处理,则返回0
- WM_GETTEXT(消息)
- 功能:把对应窗口的文本复制到呼叫程序提供的缓冲区中
- 返回值:被复制的字符数
- WM_QUIT(消息)
- 功能:调用PostQuitMessage时产生
- 返回值:没有返回值
- WM_LBUTTONDOWN(消息)
- 功能:当光标停留在一个窗口的客户区且按下鼠标左键,则消息被发送。若动作未被捕获,发给光标下的窗口;否则给捕获的窗口。
- 返回值:若被应用程序处理,则返回0
1.3.4 虚拟内存
本质:通过映射,让每个程序看似独享整个内存大小(32位下为4GB)
物理内存中,操作系统和系统DLL时刻被映射,用户程序只在自己的时间片被映射,用户DLL在此基础上被选择性映射。
实现和过程:
- 程序启动,这其实等于系统创建一个进程,并分配一定的空间地址(只是地址,并不是分配这么多空间)
- 把代码映射到虚拟地址的代码段,然后把只把当前需要执行的指令放到物理内存(虚拟地址要经过映射才能得到物理地址,故一般不相等)
- 使用DLL的话,DLL也放到虚拟地址里,要用时才载入物理内存
- 其他项目(数据、堆栈)也从物理内存分配并被映射到虚拟地址
- 程序开始执行,遇到内存访问则映射到物理内存取出,放回虚拟地址。
位置:存放在磁盘中,要用的时候再挪到内存(加速可以通过页表等,但对我们的问题不重要)
好处:简化内存管理,避免多任务环境下应用程序的冲突
64下,虚拟内存理论大小16EB。由于用不了这么大,系统实际支持内存少很多,但完全够用。
标签:加密,Windows,32,解密,基础知识,64,消息,dll,内存 From: https://www.cnblogs.com/Carykd/p/17451859.html