应用程序打印调试字符串但未使用 OutputDebugString

逆向工程 视窗 调试器
2021-06-18 17:21:13

我正在逆向的应用程序经常输出调试字符串。其中一些可以帮助我找到我正在寻找的代码,但不知何故,该应用程序似乎根本没有使用 OutputDebugString(我使用了 IDA 的导入窗口、Olly 的对模块间调用的搜索,以及dumpbin /IMPORTS)。该程序仅导入本机 Windows DLL 和一个调用该函数的自定义库,但我已经检查过它并且它的所有调试字符串都是内部内容,我的 exe 没有导出日志功能。

此外,在 exe 中找不到正在打印的调试字符串(再次尝试 Olly 和 IDA)。

是否有可能通过不使用 WinAPI 以某种方式隐藏调用?由于该程序不受任何保护,我发现使用任何此类技术的可能性很小,但这可能是我无法使用“普通”方法找到任何东西的原因吗?

3个回答

数据库

Alt+ O-> 事件 -> 中断时调试字符串上的复选标记中断

点击Alt+K查看调用堆栈

数据库

sx- -c "kc" out

这将在每个 DebugString 上自动打印调用堆栈。

0:000> g

This is from Win32Api
Going deeper now

kernel32!RaiseException
kernel32!OutputDebugStringA
dbgprints!wmain
dbgprints!__tmainCRTStartup
kernel32!BaseProcessStart
hello from ntdll!DbgPrint 


ntdll!vDbgPrintExWithPrefix
ntdll!DbgPrint
dbgprints!wmain
dbgprints!__tmainCRTStartup
kernel32!BaseProcessStart
(5d8.950): Unknown exception - code eaceba5e (first chance)
This String is from RaiseException argument 1

某些调试器可以在打印调试消息时暂停程序。然后你可以向上堆栈跟踪,看看它是从哪里来的。

在此处输入图片说明

在 上设置断点OutputDebugString()当断点命中时,检查调用堆栈以找到调用的来源。

我不能,这就是重点 - 它似乎没有被调用,但字符串是输出。

然后字符串不会被可执行文件输出。将 WinDbg 附加到您的系统并在nt!DbgPrint上设置断点nt!DbgPrintEx当断点命中时,检查调用堆栈以找到调用的来源。