加密与解密
0x01 基础知识
1.1 什么是加密与解密
软件的加密与解密技术是矛与盾的关系。开发者为了维护自身的商业利益,不断寻求各种方式保护软件的版权,推迟软件被解密的时间;而解密者则受盗版所带来的高额利润的驱使或存粹出于个人兴趣,不断开发新的解密工具。
逆向工程(Reverse Engineering)是根据已有的产物结果,通过分析来推导出具体的实现方法。
逆向分析技术分为静态分析技术和动态分析技术。所谓静态分析是指根据反汇编得到的程序清单进行分析,通过包含提示信息的程序片段,分析得出其上下文实现的功能,从而宏观的了解程序的编程思路;动态分析主要是利用OD或WinDBG等调试工具,一步步的跟踪分析。
1.2 文字字符
ASCII字符较为常见不说明,Unicode字符集是ASCII字符编码的一个扩展,Windows中用2字节对其进行编码,所以也被称为宽字符集(Widechars)。在Unicode中所有字符都是16位其中7位的ASCII码被扩展至16位,高位补充都是0.
小端存储:低位字节在低地址,高位字节在高地址。x86CPU采用这种字节序。
大端存储:高位字节在低地址,低位字节在高地址。PowerPC采用这种字节序。网络协议也是采用这种,所以也把大端存储成为网络字节序。
1.3 Windows操作系统
Windows运转的核心是动态链接。其通过动态链接库(DLL文件,实际上也是PE结构,只不过只具有导出函数并且无法独立运行)实现。
在早期,Windows的主要部分在3个动态链接库中实现。
1. Kernel(由KERNEL32.DLL实现):操作系统核心功能服务,包括进程与线程,内存管理,文件访问等
1. User(由USER32.DLL实现):负责处理用户接口,包括程序键盘输入,窗口和菜单管理等
1. GDI(由GDI32.DLL实现):图形设备接口,允许程序在屏幕和打印机上显示图形和文本。
WinAPI是一个基于C语言的接口,在其函数字符集中,“A”表示ANSI,“W”表示Widechars。前者是通用的单字节方式;后者是宽字节方式。每个以字符串为参数的Win32函数在操作系统中都有着两种版本。如MessageBox函数由MessageBoxA,MessageBoxW两个入口。
在默认情况下,32位操作系统的地址空间在4GB以内,每个程序都有4GB独立的虚拟内存。
当一个程序启动时,操作系统创建一个进程,为进程分配2GB虚拟内存,虚拟内存管理器将PE结构映射到虚拟地址的某个位置,并在需要某些代码的时候将代码映射到物理内存。DLL也是在需要的时候才被映射到物理内存。其他项目(数据,堆栈)等的空间是从物理内存中分配的,并映射到虚拟地址空间中。应用程序通过使用虚拟地址空间的地址开始执行,然后虚拟内存管理器把每次内存方位映射到物理位置。
0x02 动态分析技术
这一部分主要介绍动态分析的调试器,如OD,WinDBG。
实验详见本网站其他页面。
0x03 静态分析技术
这一部分主要介绍静态分析的一些反汇编软件或是分析工具,如WinHex,IDA。
文章评论