好的,这很奇怪。这是我第一次看到这样一行代码。 基本上,一旦从程序的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)();
答案 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
上检查这些奇怪的声明