第一部分 调试目标程序的函数
.call命令的原理
我们使用.call调试被调试程序的函数。利用.call元命令可以不需要使函数运行到函数调用处,而是类似于进行一次虚拟调用。具体原理如下:
- windbg在栈上创建一小段代码,这段代码用于被调用函数的父函数,函数返回到这段代码,然后中断。
- 在栈上创建一个新的关于被调用函数的栈帧,用于模拟被调用函数
- 修改寄存器,使程序指向模拟被调用的函数的起始地址,保证恢复程序运行就能执行这个函数
代码重定位是把可执行代码从内存的一块区域移动到另外一块地方。但是如果指令中某些操作数没有随着地址的改变而改变,这样势必导致运行出错。如下代码:我们发现全局变量的地址包含在机器码中,而局部变量没有包含绝对地址。
重定位信息是在编译时期由编译器生成,并且保存在应用程序中,在程序执行的时候由操作系统予以修正。如果在装载时该位置已经被别的应用程序使用,操作系统会重新选择一个新的基地址。此时,就需要对所有重定位信息进行纠正,纠正的依据就是PE中的重定位表。