元始天尊 发表于 2014-7-1 15:06:12

程序调试二三事

如何等待调试器?
android手机就有这种功能,那么c/c++该如何操作呢?

#include <windows.h>
#include <stdio.h>
#define _WIN32_WINNT 0x0400
void main()
{
printf("等待调试器\n");
while(!IsDebuggerPresent())
{
Sleep(1000);
}
printf("调试器已连接\n");
//下面是要执行的代码。。。
getchar();
}


编译成exe,运行,会出现等待调试器的字样,当你随便用某种应用层调试器windbg olldbg,就会显示已连接,
一般来说通过windbg这样的源码级调试很容易解决这个问题,不过如果你用的是非源码级调试器,那么可以这样尝试,
吧要调试的模块加入如上所示代码,就很容易断下来。

如何在加载模块的时候断下程序?
windbg下sxe ld *.dll   

如何使用Windbg调试时在程序入口处(用户入口)断下?
先用x指令查找main中的调试符号,如果发现winmain dllmain类似的记号即可
例如win自带记事本      bp notepad!WinMain

0xAA55 发表于 2014-7-1 19:03:18

事实上很多国产程序的保护程序都是用IsDebuggerPresent来检测调试器,一旦发现调试器就开启反调试模式(比如干掉调试器或者干掉自己。)于是就产生了各种保护与过保护的战争,反调试与反反调试的斗争。
当然TP现在是直接走驱动层干掉调试器了。玩腾讯游戏的时候TP会一直驻留,导致你在VS里按下F5就死。检测调试器有不止一种办法。我听说有一种版本的OD不会让IsDebuggerPresent返回TRUE,于是各种游戏保护就引入了别的机制来反调试……
总之现在游戏外挂的路难走了。不赚钱了。
页: [1]
查看完整版本: 程序调试二三事