2012-06-25 46 views
0

假设我有一个像这样定义一个函数:函数地址

class Foo() { 
    public: 
     void bar(MyClass* p, int i, int j, CArray<CArray<int,int>,int> &a); 
} 

void Foo::bar(MyClass* p, int i, int j, CArray<CArray<int,int>,int> &a){ 
// Function body 
} 

对于Win32应用程序/ DLL,这个功能是不是“出口”我怎么能找到的bar函数地址,得到导出的函数的函数地址很容易。但是获取非导出函数的函数地址有点难。

+2

指针非静态成员函数(“办法”),实际上可能没有地址,顺便说一句。成员函数如何表示为指针类型取决于实现。 – cdhowie

+2

如果您拥有此代码的控制权,那么只需将其导出即可。否则,可能不适合外部使用。 – crashmstr

+0

你只是想要地址还是能够调用这些函数?处理DLL专用的函数时,需要处理的东西太多了,例如调用约定,名称修改等。您是否尝试创建注入向量? – dirkgently

回答

1

在一般情况下无法做到这一点。

在其他问题中,如果该功能未导出,那么可能不存在。优化器可以在函数调用的每个位置内联该函数。如果发生这种情况,该函数将不会有地址,因为它不会存在于模块中。

+0

我很确定这个函数存在,我有win32 pe的源代码,我试图调用非导出的函数。我可以看到这个功能被使用了很多次。我只有一个场景,因为应用程序已经投入生产,所以我无法重新编译源代码。 – xybrek

+1

如果您只关心已知模块中的某个特定功能,请提前计算其RVA?这一切听起来很可疑,但(更不用说危险了)。最好修改模块来导出函数,或者修复它以做你需要的东西,特别是如果它是一个生产应用程序。 –

+0

即使我修复了该模块,该公司也太大,无法为所有运行该模块的设备修改修改后的可执行文件,而不考虑该过程中涉及的所有管理。所以对我来说,最好的例子就是做一些调用函数,即使它没有被导出。 – xybrek