html tool

2019年1月8日星期二

加密解密4-12注入技术-4SetThreadContext法-P473 ContextFlags 介绍



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 );
第一个参数是线程的句柄,第二个参数是指向CONTEXT结构的指针。要注意,调用该函数之前需要设置CONTEXT结构的ContextFlags字段,指明你想要获取哪部分寄存器的值。该字段的取值如下:
CONTEXT_CONTROL
获取EBPEIPCSEFLAGSESPSS寄存器的值。
CONTEXT_INTEGER
获取EAXEBXECXEDXESIEDI寄存器的值。
CONTEXT_SEGMENTS
获取DSESFSGS寄存器的值。
CONTEXT_FLOATING_POINT
获取有关浮点数寄存器的值。
CONTEXT_DEBUG_REGISTERS
获取DR0DR1DR2DR3DR6DR7寄存器的值。
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时,字符串指令每次操作后递减ESIEDI,为0时递增。
OF
11
溢出标志。有符号数发生溢出时,该标志为1,否则为0

没有评论:

发表评论