【问题标题】:C++ Reading values of LPCVOID pointerC++ 读取 LPCVOID 指针的值
【发布时间】: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);

}

【问题讨论】:

    标签: c++ kernel32 detours


    【解决方案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 上?
      猜你喜欢
      • 2021-07-10
      • 2015-08-09
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2013-01-03
      • 2020-10-16
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多