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++ 中的另一个线程读取指针

在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

指针总是显示相同的值 C++

C++ 指针 vs 数组

类型转换 c++ 指针和非类型转换指针指向相同的位置,但给出不同的值

通过指针访问结构中的值? (C++)