GetPC技术
GetPC(Get Program Counter 获得程序计数器),在x86下可以理解为GetEip,在很多情况下,由于我们不能确定自己程序所在的位置,程序中的各种跳转、调用以及变量的访问就无法知道确切的地址,因此需要使用GetPC技术获得当前地址。
Call GetPC Type A
- 优点:
不会产生冗余指令 缺点:
有很多0x00产生,在很多输入情况下都不能直接使用,需要编码Call GetPC Type B
跳转到的4118d5是FF,和后面的C3拼接成了FF C3(INC EBX)- 优点:
不会产生0x00,大多数情况下可直接使用,无需编码 缺点:
会产生一条冗余指令”INC EBX“,某些情况下可能产生影响4.2 GetPC技术B-FSTENV方式
X87 浮点单元(FPU)在普通X86架构中提供了一个隔离的执行环境。它包含一个单独的专用寄存器集合,当一个进程正在使用FPU寄存器执行浮点运算时,这些寄存器需要由操作系统在上下文切换时保存。
我们利用FPU的这个特点,通过获取其fpu_instruction_pointer
这个成员的内容,进而得到上一条FPU指令所在的位置。
汇编指令FNSTENV
这条指令可以将FPU的状态值保存到内存中