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