블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
Technical Article/펌 2005. 10. 13. 11:32

디버그 모드 방지~

아래 어느분이 고생하셧다는 글을 보고.. 생각나 한자 적습니다..



---------------------------------------------------------------------------------------------------

if(IsDebuggerPresent())
{
AfxMessageBox("디버거가 검출되었음.. 크래킹 좀 하지 마.. 이자식아..!!");
// SystemHalt(); - 파란화면 의사코드 ;;;; 또는 Reboot(); or Format("C:");
}

F5 디버깅모드로 실행해보세요..~~

----------------------------------------------------------------------------------------------------


위와 같이 해버리면 IsDebuggerPresent 이놈 break point 걸어 jmp 해버리면 그만입니다.

크래킹은 결국은 할수 있는것이죠..

컴파일 되어봐야 어차피 이진코드로 된 코드이기 때문입니다.



다만 크래커들을 골탕을 먹이거나 복잡해 스스로 포기하게 만들면 어느정도의 효과는 기대해도 좋을 것입니다.



__declspec( naked ) int IsDebuggerRunning(void)
{
__asm
{
mov eax, dword ptr fs:[00000018h];
mov eax, dword ptr [eax+30h];
movzx eax, byte ptr [eax+2];
ret
}
}



실제 IsDebuggerPresent 내용을 그대로 옮긴것임.. 아마 NT계열 일때.. 98은 잘 모르겠습니다. 직접 어셈블리 내부로 트레이싱해보시길;;



fs:[00000018h] 이놈이 고정주소값이라 쓸 수 있는것이죠;;


물론 자신의 코드이기때문에 크래커들은 모릅니다. - 이점을 이용하는것이죠





그리고 메세지박스나 기타 윈도우를 띄울경우 그놈도 break point로 잡을 수 있으니

가급적 그 기회를 주지 말아야 합니다.



타이머를 이용해 아래를 주기적으로 체크하면서..



if(IsDebuggerRunning())

{

PostMessage(.....); // 이렇게 비동기적으로 한번 더 꼬아라..

}



void OnMessageHandler(...)

{

SendLocalInfoToServer(ip, computer_name, etc); // 잡아서 혼내주세요..

Reboot();

}



어떤 안내메세지도 띄우지 마세요.. 그것이 또 크래킹의 도구가 될수 있음..

조용히 컴터를 부팅하거나 꺼버리세요..



크래커들은 당황할것입니다.



여러 응용도 가능할것입니다. 자신만의 Anti-Cracking을 해보는것도...
,
TOTAL TODAY