-
-
[原创]【加密与解密(第四版)】第一章笔记
-
发表于: 2022-3-1 20:50 5613
-
第一章《基础知识》
导读:什么是API?什么是Unicode?什么是小端序?只有了解这些基础知识,在加密与解密的过程中才能有的放矢地处理各种问题。本章将系统地解答这些问题。
1.1什么是加密与解密
1.1.1软件的加密与解密
一款优秀的软件,其技术秘密往往成为他人窃取的重点。
如果一种保护技术的强度能达到让解密者在软件的生命周期内都无法将其完全破解的成度,这种保护技术就是成功的。
系统底层知识是大型软件的基础,如果这个基础没有打牢,贸然向高层设计领域进军,那么构造的软件“大厦”将会是何种质量也就可想而知了。
1.1.2软件逆向工程
逆向工程是根据已有的产物和结果,通过分析来推导出具体的实现方法。对软件来说“可执行程序——>反编译——>源代码”的过程就是逆向工程。
逆向工程的内容可以分为三类:软件使用限制的去除或者软件功能的添加;软件源代码的再获得;硬件的复制和模拟。
一个逆向工程大师应该具备的特征:永远保持好奇心,崇尚自由;勤奋与毅力;精通至少一门编程语言;扎实的汇编功底和系统编程知识。
逆向工程是一门优雅的艺术,而不是一些低层次者手中粗陋的工具;逆向工程的目的是学习与再利用;逆向工程的精神就是“自由”。
1.1.3逆向分析技术
通过软件使用说明和操作格式分析软件(使用软件,阅读软件说明书);静待分析技术(IDA)(通过静态分析可以了解各个模块的功能,以及整个软件的编程思路);动态分析技术(OllyDbg、WinDbg、X64/32Dbg)(静态分析很难获得中间结果;软件前一模块可能会对后一模块做一些初始化工作;有的加密程序在运行时会采用逐块解密、逐块执行的方法)
如何有效地进行动态跟踪:对软件进行粗跟踪(跳过CALL、REP、LOOP等指令);对关键部分进行细跟踪(在每次跟踪时把比较关键的中间结果或指令地址记录下来,会对下一次分析有很大的帮助)
IDA和OD的区别:
(1)IDA是静态调试,有结构图,并且可以自动生成伪代码;OD是动态调试。
(2)加载可执行程序时,OD是把整个空间都加载起来,而IDA只是加载了exe文件,它所关联的dll并没有加载
(3)https://blog.csdn.net/feixiaoxing/article/details/105351395
1.2文本字符
1.2.1ASCII与Unicode字符集
现代的ASCII是一个7位的编码标准,编码的取值范围是00h-7Fh,共128个字符。
由于计算机通常用字节这个8位的存储单位来信息交换,因此不同的计算机厂商对ASCII进行了扩充,增加了128个附加字符,他们的值在127以上是不统一的取值范围变成了00h-FFh,例如ANSI、Symbol、OEM等字符集。其中ANSI是系统预设的标准文字存储格式。
扩展ASCII码:扩展ASCII 字符是从128 到255(0x80-0xff)的字符。许多基于x86的系统都支持使用扩展(或“高”)ASCII。它将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。针对扩展的ASCII码,不同的国家有不同的字符集,所以它并不是国际标准。
Unicode是ASCII字符编码的一个扩展,
各种编码:https://www.cnblogs.com/findumars/p/5006175.html
Unicode、UTF-8、UTF-16:https://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html
1.2.2字节存储顺序
大端存储:高位字节存入低地址,低位字节存入高地址(看起来方便)
小端存储:高位字节存入高地址,低位字节存入低地址
一般来说,X86系列CPU都是小端存储,PowerPC通常是大端存储。因为网络协议也都是采用大端存储方式来传输数据的,所以有时也把大端存储方式称为网络字节序
1.3Windows操作系统
1.3.1Win32 API函数
API的英文全称为“Application Programming Interface”(应用程序编程接口)
Windows运转的核心是动态链接。Windows提供了丰富的应用程序可利用的函数调用,这些函数采用动态链接库(DLL)实现
在早期,Windows的主要部分只需要在3个动态链接库中实现,他们分别代表Windows的3个主要子系统,叫作Kernel(操作系统核心功能服务)、User(负责处理用户接口)、GDI(图形设备接口)
虽然Win API是一个基于C语言的接口,但是Win API中的函数可以由用不同语言编写的程序调用。
在Win32 API函数字符集中,“A”表示ANSI(单字节),“W”表示Widechars(即Unicode,宽字节)。每个以字符串为参数的Win32函数在操作系统中都有这两种方式的版本。
Win32 API参考文档:http://www.yfvb.com/help/win32sdk/
常用的Win32函数:https://developer.aliyun.com/article/226746
1.3.2WOW64
WOW64(Windows-On-Windows 64bit)是X64 Windows操作系统的一个子系统,为32位应用程序提供运行环境。类似的还有WOW32子系统,负责在32位Windows系统上运行16位应用程序。
Wow64不支持16位应用程序的执行(32位Windows支持),也不支持加载32位内核模式的设备驱动程序。Wow64进程只能加载32位dll,不能加载原生的64位dll。类似的,原生的64位进程不能加载32位的DLL。唯一列外的是,在跨越体系结构差异时,能够加载仅包含资源或数据的Dll,这是允许的,因为这些Dll只包含数据,不包含代码。
谈谈WOW64:https://www.cnblogs.com/lanrenxinxin/p/4977488.html
1.3.3Windows消息机制
Windows是一个消息驱动式系统。
Windows系统中有两种消息队列:一种是系统消息队列;另一种是应用程序消息队列
深入理解Windows消息机制:https://blog.csdn.net/liulianglin/article/details/14449577
Windows消息机制基础:https://www.bilibili.com/video/BV1CU4y1t7E6
1.3.4虚拟内存
虚拟内存并不是真正的内存,它通过映射的方法使可用虚拟地址达到4GB,每个应用程序可以获得2GB的虚拟内存,剩下的2GB留给操作系统自用。
虚拟内存原理:https://www.bilibili.com/video/BV1yW411S7UL
应用程序不会直接访问物理地址
使用虚拟内存的好处:简化了内存管理,弥补了物理内存的不足,可以防止多任务环境下应用程序之间的冲突。