无效指针void类型转换函数调用?

时间:2013-05-11 14:05:13

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

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

正如你所知道的那样 - 我最近一直在玩自己的PE装载机。我还是一个初学者,并试图理解结构 - 但这个函数调用究竟是什么意思?

(适用(无效(*)(无效))入口点)();

//where 0x4484502 is gotten from:

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

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

2 个答案:

答案 0 :(得分:2)

该行

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

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

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

答案 1 :(得分:0)

符号

(some_type)something

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

这里我们有

(void(*)(void))0x4484502

这意味着0x4484502被转换为指向函数的指针,该指针取消void并返回void。

符号func_ptr()

表示调用func_ptr指向的函数。


你总是可以在cdecl

上检查这些奇怪的声明