跳至主要內容

调试技巧

chanchaw大约 2 分钟cpp

printf

概述

有些程序会重定向 printf,当向目标程序注入代码时使用该函数调试有可能看不到调试信息以为没有成功注入,应尽量使用函数 TRACE 将调试信息打印到使用 dbgview.exe 中查看

char buf[256];
sprintf_s(buf,"cc:返回值是:%d,行号:%d",护甲,__LINE__);
TRACE(buf);// 使用 dbgview.exe 查看调试信息,在主菜单:Edit > Filter 中设置过滤字符:cc:

注意,要求目标程序以 debug 的形式编译后运行,以 release 版本不会在 debugview 中打印调试信息。例如注入 dll 到目标程序中,那么要求编译该 dlldebug 版本后注入。
上面代码中使用了一种拼接字符串的方法,点我查看更多拼接字符串的方法

重定向

目标进程已重定向了 printf 我们也可以重新重定向回来

AllocConsole();// 显示控制台
freopen("CONOUT$","w+t",stdout);// 重定向 printf 输出到控制台中

重定向到文件

freopen("c:/123.txt","w+t",stdout);// 重定向 printf 输出内容到 c:/123.txt

挂主线程

通过 CE 或者 OD 找到的进程主线程中的地址,使用自己创建的线程读取数据会和主线程中读取同一个内存得到的结果不同,由此引出概念 “挂主线程”,将自己生成的子线程挂到主线程中执行(读取内存数据)读取到的数据才是对的,是有意义的。

控制台

所有程序都有控制台,包括图形界面的客户端软件,通过 AllocConsole(); 可以调出显示,使用代码 FreeConsole() 关闭控制台