【问题标题】:Void pointer void type cast function call?void指针void类型转换函数调用?
【发布时间】:2013-05-11 14:05:13
【问题描述】:

好吧,这很奇怪。这是我第一次看到这样一行代码。 基本上,一旦您从程序的 PE 标头中指定了偏移量(地址),这就会调用应用程序的入口点。

如您所知 - 我最近一直在尝试编写自己的 PE 加载程序。我仍然是一个初学者并试图理解结构 - 但该函数调用究竟是什么意思?

((void(*)(void))EntryPoint)();

//where 0x4484502 is gotten from:

PIMAGE_NT_HEADERS nt_header;
DWORD EntryPoint = nt_header->OptionalHeader.ImageBase + nt_header->OptionalHeader.AddressOfEntryPoint;

((void(*)(void))0x4484502)();

【问题讨论】:

    标签: pointers memory void portable-executable entry-point


    【解决方案1】:

    线

    ((void(*)(void))0x4484502)();
    

    将整数 0x4484502 转换为指向具有 void 参数并返回 void 的函数(从该地址开始)的点。一旦转换,函数指针就会被调用。

    编辑: 只需重新阅读问题......用EntryPoint 替换0x4484502 做完全相同的事情......变量EntryPoint 被转换为指向具有void 参数并返回void 的函数的指针。然后用指针调用函数。

    【讨论】:

    • 哦,我明白了。谢谢你的解释。我很困惑,因为我以前从未见过 void(*)。谷歌也不足智多谋——它只是给了我无效的指针(voidSTAR)。
    • 很高兴它有帮助 :) 通常,函数指针被声明为 return-type (*ptr_name)(..parameters); 例如 int (*f)(int, short) 是一个指针 f,指向一个返回 int 并接受两个参数的函数,一个int 和一个短的。
    【解决方案2】:

    符号

    (some_type)something
    

    它是 C 风格的演员表。它等同于一系列 C++ 类型转换,但没有 dynamic_cast,因此很危险 - 它允许您将指向私有基址的指针转换为指向派生类的指针,而不仅仅是在派生类函数中。

    我们来了

    (void(*)(void))0x4484502
    

    这意味着 0x4484502 被强制转换为 指向函数的指针,该函数接受 void 并返回 void。

    符号func_ptr()

    表示调用func_ptr指向的函数。


    你可以随时在cdecl查看这些奇怪的声明

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 2016-11-23
      • 2011-07-31
      • 2021-09-20
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多