CONTEXT_FULL
源码内容:
//获取Context ZeroMemory(&Context,sizeof(CONTEXT)); Context.ContextFlags = CONTEXT_FULL; ------------1 if (!GetThreadContext(hThread,&Context)) { printf("[-] 无法获取线程 %d 的Context!\n",dwTidList[i]); CloseHandle(hThread); continue; }
1 ------ - WinNT.h 中的定义如下 #define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP #define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI #define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS #define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L) // cpu specific extensions #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\ CONTEXT_SEGMENTS) #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \ CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \ CONTEXT_EXTENDED_REGISTERS) #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
https://www.cnblogs.com/zplutor/archive/2011/03/13/1983010.html
获取某个线程的上下文环境需要使用GetThreadContext函数,该函数声明如下:
1 BOOL WINAPI GetThreadContext(
2 HANDLE hThread,
3 LPCONTEXT lpContext
4 );
2 HANDLE hThread,
3 LPCONTEXT lpContext
4 );
第一个参数是线程的句柄,第二个参数是指向CONTEXT结构的指针。要注意,调用该函数之前需要设置CONTEXT结构的ContextFlags字段,指明你想要获取哪部分寄存器的值。该字段的取值如下:
CONTEXT_CONTROL
|
获取EBP,EIP,CS,EFLAGS,ESP和SS寄存器的值。
|
CONTEXT_INTEGER
|
获取EAX,EBX,ECX,EDX,ESI和EDI寄存器的值。
|
CONTEXT_SEGMENTS
|
获取DS,ES,FS和GS寄存器的值。
|
CONTEXT_FLOATING_POINT
|
获取有关浮点数寄存器的值。
|
CONTEXT_DEBUG_REGISTERS
|
获取DR0,DR1,DR2,DR3,DR6,DR7寄存器的值。
|
CONTEXT_FULL
|
等于CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS
|
调用GetThreadContext函数之后,CONTEXT结构相应的字段就会被赋值,此时就可以输出各个寄存器的值了。
对于其它寄存器来说,直接输出它的值就可以了,但是EFLAGS寄存器的输出比较麻烦,因为它的每一位代表不同的含义,我们需要将这些含义也输出来。一般情况下我们只需要了解以下标志:
标志
|
位
|
含义
|
CF
|
0
|
进位标志。无符号数发生溢出时,该标志为1,否则为0。
|
PF
|
2
|
奇偶标志。运算结果的最低字节中包含偶数个1时,该标志为1,否则为0。
|
AF
|
4
|
辅助进位标志。运算结果的最低字节的第三位向高位进位时,该标志为1,否则为0。
|
ZF
|
6
|
0标志。运算结果未0时,该标志为1,否则为0。
|
SF
|
7
|
符号标志。运算结果未负数时,该标志为1,否则为0。
|
DF
|
10
|
方向标志。该标志为1时,字符串指令每次操作后递减ESI和EDI,为0时递增。
|
OF
|
11
|
溢出标志。有符号数发生溢出时,该标志为1,否则为0。
|
没有评论:
发表评论