window下的调试

先介绍几个windows下的调试器:ollydbgPyDbgImmunity debugger

寄存器可以被认为是位于CPU上的小型存储器,CPU获取数据最快的方式就是直接访问寄存器。在x86指令集中,一个CP具有8个通用寄存器:EAX、EDX、ECX、ESI、EDI、EBP、ESP、EBX。

EAX寄存器也被称为累加器,用于协助执行一些常见的运算操作以外用于传递函数调用的返回值。在X86指令集中很多经过优化的指令会优先将数据写入或者独处EAX寄存器,在对数据进行进一步的计算。大多数基本的运算操作如:假发、减法和比较运算都会借助使用EAX寄存器来达到指令优化的效果。还有一些特殊指令如:乘法和除法则必须在EAX寄存器中进行。

若之前所属,函数调用的返回值被储存在EAX寄存器中。牢记这一点很重要,你可以基于存储在EAX中的值来判断一个函数调用所执行的操作是成功还是失败了。除了布尔类型的返回之外,EAX中存数的也可能是一个确切的函数返回值。

EDA是一个数据寄存器,这个寄存器可以被认为是EAX寄存器的延伸部分,用于协助一些更为复杂的运算指令,如:乘法和除法,EDA被用于存储这些指令操作的额外数据结果。EDA也可以用于通用目的的数据存储,但是其最常见的用法是和EAX寄存器联合使用,以协助执行这类更复杂的元算。

ECX寄存器也被称为计数器,用于支持循环操作,存储一个字符串或者进行计算就是典型的循环操作。需要特别注意的是ECX寄存器通常是反向计数的,而非正向计数。我们用以下的Python代码片段来向你说明这个问题。

在x86汇编语言中,那些涉及数据处理的循环操作依赖于ESI和EDI这两个寄存器,以实现高效的数据操作,ESI寄存器也被称为源地址寄存器,这个寄存器存储着输入的数据流的位置信息。EDI寄存器则指向相关数据操作结果的存放位置,我们称之为目的变址寄存器,可以简记为ESI用于“读”,而EDI用于“写”。在数据操作过程中使用源变址索引和目的变址寄存器可以极大提高程序运行的效率。

ESP和EBP寄存器分别被称为栈指针和基址指针,这些寄存器用于控制函数调用和相关的栈操作。当一个函数被调用时,调用参数连同函数的返回的地址将先后被压入函数栈中,ESP寄存器始终指向函数栈的最顶端,有此不难推断出在函数调用过程中的某一时刻,ESP指向了函数的返回地址。EBP寄存器被用于指向函数栈的低端。在某些情况下,编译器为了指令优化的目的可能会避免将EBP寄存器用作栈指针。在这种情况下,被释放出来的EBP寄存器可以向其他任何一个通用的寄存器一样另左它用。

EBX寄存器是惟一一个没有被指定特殊用途的寄存器,它可以被作为额外的存储单元来使用。

另外一个应当被提及的寄存器是EIP寄存器。这个寄存器始终指向当前正在执行的指令,当CPU穿行于二进制代码中时,EIP寄存器中的值随之更新以实时的反映当前代码所执行到的位置。

一个调试器应当能够轻易的读取和修改这些寄存器的内容,每一个操作系统都会提供一个接口做组来使得调试器能够与CPU进行交互,以获取或修改这些寄存器中的值。

感谢看完指鹤文章,希望指鹤的文章对您有所帮助。

闲暇时,指鹤喜欢写一些文章,部分发表在了豆瓣,若是您对此感兴趣,您可以点击下面连接支持下指鹤,指鹤在此表示感谢了

绝命笔记 一封匿名信引发的追寻 迷案追凶 量子危机

Leave a Reply