【发布时间】: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