심심해서 게임가드 역할을 하는 솔루션을 만들어보고 있는데,
그 기능중에서 당연히 HWBP를 탐지하는 로직도 있어야할것이므로,,,

GetThreadContext를 이용해서 레지스터 정보를 얻어온 뒤, Dr0~Dr3 값을 체크해서
HWBP를 탐지한다는건 전부터 이미 알고있었는데,,,

결과적으로 GetThreadContext 의 사용법을 올바르게 알지 못하고 , 삽질을 해버린꼴이 되었다.


#include <windows.h>
#include <stdio.h>

DWORD __stdcall ThreadFunction(LPVOID lparam)
{
while(1)
__asm rdtsc
return 0;
}
int main(void)
{
HANDLE hThread = CreateThread(NULL,0,ThreadFunction,NULL,0,NULL);

CONTEXT mt;
memset(&mt, 0, sizeof(mt));

mt.ContextFlags = CONTEXT_DEBUG_REGISTERS;
while(1)
{
Sleep(500);
SuspendThread(hThread);
GetThreadContext(hThread,&mt);
if(mt.Dr0 || mt.Dr1 || mt.Dr2 || mt.Dr3)
printf("HWBP detected!\n");
else
printf("HWBP not detected!\n");
ResumeThread(hThread);
}
CloseHandle(hThread);

return 0;
}

망할 저기서 , ContextFlags 라는 값을 지정해줘야 제대로 된 값이 나오는것이었는데,
그것도 모르고 값 지정도 해주지 않은채 ,  왜 컨텍스트가 리턴이 되지가 않는겅미??   하고 있었다.


VS2010  MSDN을 찾아보니 , CONTEXT 관련 정의된 매크로에 관해서는 별 언급이 없고,
그저 Flags 라는 값에 대해서 설명만 주구장창 늘어놓고 있다.
아래는 WinNT.h 파일에  이미 정의된 매크로들을 나열해놓은 것이다.

#define CONTEXT_i386    0x00010000    // this assumes that i386 and
#define CONTEXT_i486    0x00010000    // i486 have identical context records

// end_wx86

#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)


그냥 간단하게 CONTEXT_ALL 매크로를 지정해주면  모든 컨텍스트 정보가 리턴이 된다.
이거 정말 별거 아닌데 ,  Flags 값 하나 때문에 삽질해버린 꼴....
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2010.05.23 13:09
| 1 |

티스토리 툴바