《加密与解密》笔记一

这次主要是记书里面的基础部分(我之前没有细致的记过的)和OD的使用:

1、字节序:

有两种字节序,因CPU的不同而不同,分别是大端序和小端序:
这里的大小端序和高低地址高低位字节解释:
如:
一个内存段1000,偏移量0~FFFF地址高低由偏移量的增加而增高
一个数据0x12345678位是由高到低下降的,所以高位->低位是:12,34,56,78
所以小端序内存排布为:78,56,34,12
大端序排布相反:12,34,56,78

2、Windows应用程序和操作系统的关系

在Windows平台下开发的应用程序我们都只是调用WinAPI我们几乎不可能接触到系统的底层,所以我们可以认为API是整个Windows框架的基石:
《加密与解密》笔记一
还有一些我们在使用逆向分析时候可能会下断点的几个API:(标注参数是方便加条件记录断点的)
hmemcpy(void ,const void ,long)这三个参数是目标地址,母地址,数据大小。
GetWindowText(HWND,LPSTR,int)
GetDlgItem(HWND,int)空间标识符
GetJDlgItemText(HWND,int,LPSTR,int)(LPSTR为对话框中文本内容)
MessageBox(HWND,LPCTSHR,LPCTSHR,UINT)

句柄:

句柄其实说实话就是在我们看来不需要关心实际数据及其含义的东西,这个就相当于另一种“指针”只不过这个指针只有Windows模块内部才可以引用其代表的对象的,所以这个值我们一般不关心,只要在相关API时使用相应有效句柄,并遵循一些句柄的特殊规定就好了。

3、保护模式

学过汇编,我们知道在80x86(386以后)处理器就有3中工作模式:
实模式,保护模式和虚拟8086模式
实模式工作方式就是一个8086
保护模式就是支持多任务的工作方式
虚拟8086模式就相当于在保护模式下进行实模式工作方式这种方式就可以方便在保护模式下的用户运行一个或多个8086程序,说白了就是相当于在Windows下运行一个DOS下的程序。
现在来看虚拟内存

虚拟内存:

在保护模式下,CPU的寻址方式与实模式不同,实模式下是一个段地址加偏移地址(运用到地址计算器),此时就相当于每个段都有FFFF(偏移的大小是0~FFFF)这就很类似于一个二维的表格。
但是在保护模式下,内存则是线性的,这时段寄存器存放的是段选择子,这个值是不参与寻址的,只是一个全局描述表或者是本地描述符表,所以在一般的反汇编调试下我们的地址一般就是ESP,EBP,EDI,ESI这几个的值。
《加密与解密》笔记一
所以,在虚拟模式下我们的地址是从0到FFFFFFFF,此时这个是一个虚拟的4G的地址空间,所以此时每个程序都有自己的4G的寻址空间互不干扰(这就是上一章分配内存用GlobalAlloc的原因)
而在物理内存中,操作系统和系统的DLL是一值被映射的,用户EXE程序则只在所属的时间片被映射,用户的DLL则是被选择性的映射。
大概就是:
《加密与解密》笔记一
简单来说就是:
启动程序时开启新进程并分配虚拟地址(并不占内存)->
程序代码以及被使用的DLL映射到虚拟地址并读取到物理内存中(并没有关系)->
程序的数据,堆栈分配占用物理内存并被映射到虚拟内存中->
程序运行由自己的虚拟地址起访问内存时由虚拟地址映射到物理地址。

权限级别:

在保护模式下有4等权限级别,其中Ring 0是系统核心,它可以执行所有的指令并访问所有的数据,而绝大部分用户的应用程序是Ring 3级别的,这个权限级别的只可以执行有限的指令访问有限的数据(如Win32子系统等)
《加密与解密》笔记一


以上部分内容(一个笔记系列)来自《加密与解密》如有侵权请联系我及时删除

还有部分我的理解,如有不妥欢迎大家给予斧正。