void RuntimeCheckDebugger(){
static unsigned long previous_time = 0;
unsigned long pbDebuggerPresent = 0;
unsigned long runtime = GetTickCount();
if
( runtime > (previous_time + 0xEA60)){
if
( IsDebuggerPresent() ||
(CheckRemoteDebuggerPresent(GetCurrentProcess(),reinterpret_cast<PBOOL>(&pbDebuggerPresent)) == 1) &&
pbDebuggerPresent == 1 ){
GetExitCodeProcess(GetCurrentProcess(),&pbDebuggerPresent);
TerminateProcess(GetCurrentProcess(),pbDebuggerPresent);
}
previous_time = runtime;
}
}
DWORD __stdcall CheckDebuggerThread(LPVOID arg){
for
(;;){
RuntimeCheckDebugger();
Sleep(100);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){
DisableThreadLibraryCalls(hModule);
if
(ul_reason_for_call==DLL_PROCESS_ATTACH){
CloseHandle(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CheckDebuggerThread,NULL,0,NULL));
}
return
TRUE;
}