【问题标题】:Reading data pointed to by an address读取地址指向的数据
【发布时间】:2020-03-31 03:35:28
【问题描述】:

在这里研究我的倒车技能,我发现了一些我认为我理解的东西,但我设法让自己感到困惑。

主要在 C 中工作

我的函数返回我想要访问的信息的地址。

LRESULT ret = SendMessage(hComboBox, CB_GETITEMDATA, (WPARAM)0 , (LPARAM) 0); 
// the exact function doesn't really matter here.
printf("Address: %p\n", ret); // Output is 09437DF8

转储此地址会导致

09437DF8  A0 55 E8 12

这是我真正想要读取的数据的地址(注意字节顺序)。 12e855A0

12 E8 55 A0 - 30 00 3A 00 30 00 33 00 3A 00 32 00 32 00 00 00 - UNICODE "0:03:22"

现在我相当确定这只是基本的指针/引用/取消引用,但我无法理解我必须做什么才能务实地读取这个值。

wprintf(L"%s\n", <value at address pointed to by ret>);
// Yes its a null terminated string
// Im working via injected dll, so no access violations
// string is unicode

【问题讨论】:

  • 也许this 会有所帮助?
  • 试图跟随,ret 一个指针,指向地址 09437DF8。正如 printf("%p", ret); 所见。 ret 的 %p 应该是我的 12E855A0 (另一个指针),除了它会引发错误:错误:一元''的无效类型参数(有'LRESULT {aka long int}')所以我觉得我必须转换 long int 所以它是一个地址,比如 printf("%s", *(wchar_t *)ret);但只是段错误。
  • 也许发布一个完整的(小)可编译代码示例,演示 seg 错误,会有所帮助吗?
  • 稍后我会处理这个问题。由于涉及的所有部分,我无法提供我正在处理的直接代码。我必须构建一个简化版本,但问题在于我正在通过检查内存并尝试构建代码来反向工作。如果我知道创建我在内存中看到的内容的代码 id 已经有了我的答案......所以,我将不得不尝试一下,看看 C 的哪些行在内存中创建了与我看到的相同的层。好主意。
  • 如果没有代码示例,很难猜到...可能类似于:wprintf(L"%ls \n", *(wchar_t **)ret);

标签: c memory reverse-engineering


【解决方案1】:

也许是这样的?

  #include <stdio.h>
  #include <wchar.h>

  int main()
    {
    wchar_t *name = L"UNICODE String";
    void **ret = (void **)&name;

    wprintf(L"%ls \n", *(wchar_t **)ret);
    return 0;
    }

【讨论】:

  • 这是正确的。 wprintf(L"Value: %p %ls\n", *(wchar_t **)ret, *(wchar_t **)ret)ret 的地址:0028FF04 值:005C3B48 0:03:22
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多