C++ 读取 LPCVOID 指针的值
Posted
技术标签:
【中文标题】C++ 读取 LPCVOID 指针的值【英文标题】:C++ Reading values of LPCVOID pointer 【发布时间】:2017-02-25 01:45:51 【问题描述】:我在 kernel32.dll 的 Writefile 命令上有一个钩子。正在触发钩子,但是,我无法读取缓冲区内容。
目标: Msgbox 显示正在发送到 com 端口的缓冲区内容。
问题: msgbox 正在打印一系列看似随机的数字,我假设这是内存地址,而不是 lpBuffer 的实际内容。
C++ 代码:
void hookedFunc(HANDLE hfile, LPCVOID * lpBuffer, DWORD nNumberBytesToWrite, LPWORD lpNumberofBytesWritten, LPOVERLAPPED lpOverlapped)
char *pString = reinterpret_cast<char *>(lpBuffer);
//Msgbox - arg 1//////////////////////////////////////////////////////////////////////////////
WCHAR szTest[45];
swprintf_s(szTest, 45, L"%d|\n", pString);
MessageBox(NULL, szTest, L"BUFFER CONTENTS", MB_OK);
swprintf_s(szTest, 45, L"%d", nNumberBytesToWrite);
MessageBox(NULL, szTest, L"TEST", MB_OK);
【问题讨论】:
【参考方案1】:LPCVOID 是一个指针(指向一个常量),lpBuffer 是一个指向该指针的指针。我想
const char* pString = reinterpret_cast<const char *>(*lpBuffer);
是你想要的。
【讨论】:
【参考方案2】:在您的示例中,szTest
将包含垃圾,因为
swprintf_s(szTest, 45, L"%d|\n", pString);
表示将pString
解释为整数(感谢%d
)并将该整数转换为ascii 并将其存储在szTest
是的,您正在打印一个地址,但可能只是其中的一部分。
附录:
长颈鹿队长的回答指出了另一个错误:您正在寻找错误的字符串位置。
【讨论】:
将 %d 更改为 %s 会导致程序崩溃 @user1698144 有几个原因。一个是 Giraffe 船长在他们的回答中指出的错误,另一个是_s
函数默认在输入错误时中止程序,而不是在未定义的行为后尝试跛行。你有两个错误,而不是一个。
嗯,这个程序的唯一目的就是找到那个值。实施Griaffe的修复后,msgbox确实输出了,但都是乱码。看起来同一个汉字一遍遍重复
是时候启动调试器,看看到底发生了什么。那个缓冲区里有什么?看到它是指向指针的指针,您确定应该在那里吗?通常当你看到一个指向指针的指针作为参数时,函数应该为其他人提供一个指针。
缓冲区应该包含一个到串口的命令(0x0A,0xA0,0x50,0x05)。查看 VS 调试器中的指针,显示它指向内存地址 0x0c5cdb20。问题似乎出在我的投射和输出到 msgbox 上?以上是关于C++ 读取 LPCVOID 指针的值的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法