DLL输出调试信息的几种方式

0x00 前言

最近有一些调试DLL的需求

平常经常写的控制台程序、Java、Python之类的都有相应的Print函数来输出一些调试信息

但是DLL比较特殊,而我又习惯了这种通过Print来打印输出调试信息的方式(后期会逐渐过渡到Debug调试):cry:

故搜集了几种相对应的方法

0x01 PrintPrintPrint~

以下三种方案均支持不定参数格式化

关键头文件

1
#include <stdarg.h>

解决报错

对于以下的几种方案,如果编译环境是VS,均会产生报错,可以通过在头部#pragma warning(disable:4996)或者#define _CRT_SECURE_NO_WARNINGS

方案一 MessageBox

1
2
3
4
5
6
7
8
9
10
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...)
{
TCHAR szBuff[MAX_PATH];
va_list args;
va_start(args, szFormat);
vsnprintf(szBuff, sizeof(szBuff) / sizeof(TCHAR), szFormat, args);
//vsprintf(szBuff,szFormat,args);
va_end(args);
return MessageBox(NULL, szBuff, szCaption, 0);
}
1
MessageBoxPrintf((TCHAR*)("Title"), (TCHAR*)("啊哈哈哈哈哈%d %s"), int_num, str);

方案二 文件读写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void ShowDbgInfo(const char* data, ...)
{
char temp[2048];
FILE * logFile = fopen("debug.log", "a+");
if (!logFile)
{
return;
}

SYSTEMTIME st;
GetLocalTime(&st);
sprintf(temp, "[*] DLL_log: %d-%d-%d %02d:%02d:%02d ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
OutputDebugStringA(temp);
fprintf(logFile, "%s", temp);

va_list ap;
va_start(ap, data);
vsprintf(temp, data, ap);
OutputDebugStringA(temp);
va_end(ap);

fprintf(logFile, "%s\n", temp);
fflush(logFile);
fclose(logFile);
}
1
ShowDbgInfo(" [+] %d %s", int_num,str);

方案三 控制台输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int dllPrintf(char* fmt, ...)
{
//不定参数格式化
va_list argptr;
va_start(argptr, fmt);
char buffer[512] = { 0 };
int cnt = vsprintf(buffer, fmt, argptr);
va_end(argptr);

//建立控制台窗口
static HANDLE gHConsole = INVALID_HANDLE_VALUE;
if (INVALID_HANDLE_VALUE == gHConsole) {
AllocConsole();
gHConsole = GetStdHandle(STD_OUTPUT_HANDLE);
}
//打印到指定的控制台窗口
DWORD dw;
WriteConsole(gHConsole, buffer, strlen(buffer), &dw, NULL);

return(cnt);
}
1
dllPrintf(" [+] %d %s", int_num,str);

0x02 参考

DLL_MessageBox

DLL_文件读写

DLL_控制台输出

其中对于文件读写篇,本文修复了一个bug:原文fopen采用了w+参数,而实际上应该采用a+来进行追加写入,并完善了代码:新增fclose来关闭句柄

-------------至此本文结束感谢您的阅读-------------
如果觉得这篇文章对您有用,请随意打赏。 (๑•⌄•๑) 您的支持将鼓励我继续创作!