好吧,这很奇怪。这是我第一次看到这样的代码行。基本上,一旦您从程序的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)();
((void(*)(void))0x4484502)();
将整数0x4484502强制转换为指向函数(从该地址开始)的点,该函数具有void形参并返回void。转换后,调用函数指针。
编辑:再读一遍问题....用EntryPoint
替换0x4484502做完全相同的事情…变量EntryPoint
被强制转换为指向具有void参数并返回void的函数的指针。
符号
(some_type)something
是c风格的强制转换。它等于一个c++类型转换序列,但是没有dynamic_cast
,所以它是危险的——它允许你将私有基指针转换为派生类的指针,而不仅仅是在派生类函数中。
这里是
(void(*)(void))0x4484502
意味着0x4484502被强制转换为指向函数的指针,该函数接受void并返回void。
符号func_ptr()
表示调用func_ptr
所指向的函数。
你总是可以在cdecl