如何在MessageBox中以0xXXXXXX格式打印十六进制基地址而非字符
解决内存地址显示乱码问题
你的代码问题在于直接将内存地址(HMODULE类型)强制转换为字符串指针LPCSTR,MessageBoxA会把该地址指向的内存内容当作ASCII字符串解析,而非显示地址本身的数值,因此出现乱码。要显示0xABC345FF格式的十六进制地址,需要先把地址数值格式化为对应的字符串,再传递给弹窗。
修改后的代码
#include <cstdio> // 用于snprintf void PrintBaseAddr() { while (true) { if (GetAsyncKeyState(VK_F6) & 0x80000) { // 获取模块基址并计算偏移,用uintptr_t适配32/64位程序 uintptr_t BaseAddr = reinterpret_cast<uintptr_t>(GetModuleHandleA(NULL)); BaseAddr += 0x351333; // 定义缓冲区存储格式化后的地址字符串 char addrStr[32]; // 格式化为0x开头的十六进制字符串,%llX对应64位地址,32位可用%X snprintf(addrStr, sizeof(addrStr), "0x%llX", BaseAddr); // 显示格式化后的可读地址 MessageBoxA(NULL, addrStr, "Base Address", MB_OK); } } }
关键说明
uintptr_t类型:这是与指针宽度匹配的整数类型,能同时兼容32位和64位程序,避免地址数值被截断。snprintf格式化:将地址数值转换成0x开头的十六进制字符串,确保弹窗显示的是地址的数值而非内存内容。- 缓冲区大小:
32字节足够容纳最长的64位十六进制地址格式(0x+ 16位十六进制字符 + 字符串终止符)。
内容的提问来源于stack exchange,提问作者end41r
相关产品推荐
相关产品推荐

