我正在用C ++编写并进行练习以熟悉DLL和共享对象(.so)。如何在不导出内部文件的情况下访问内部文件? GetProcAddress在未导出函数的调用上返回null。我写了DLL,所以我知道所有函数和变量名。

#1 楼

如果您知道DLL中函数的地址,则可以通过函数指针以“ C”语言进行调用。让我们举个例子:

假设您有一个函数驻留在名为“ notExportedFunc”的DLL中,签名为就像在下面的主程序中一样:

int notExportedFunc(int a, int b);


在链接器映射中,相关的条目如下所示: <===链接器建议

0001:00000000 __enc $ textbss $开始10001000在这里不相关


0002:00000560?notExportedFunc @@ YAHHH @ Z 10011560 f dllmain.obj

ImageBase地址由“ LoadLibrary(“ mydll.dll”)”调用返回。您应该意识到,由于ASLR(地址空间布局随机化),每次调用LoadLibrary时,该地址通常都会更改。在我们的示例中,偏移量为0x11560,必须将其添加到LoadLibrary返回的地址中。


也许可以进一步自动执行此操作,但是该示例有望显示在DLL中调用私有函数的一般机制。

#2 楼

Windows API GetProcAddr用于检索导出功能的地址。对于未导出的函数,它将始终返回null,因为它无法在PE文件中找到它。如果不导出函数在可执行文件中的位置,则不可用(这不是完全正确的,因为符号可能仍会显示该信息,但GetProcAddr并未使用它们。)。如果您仍然希望要找到指向非导出函数的函数指针,您需要遵循导出的引用链。例如,如果func1使用func2并且导出了func1,则可以获取func1的地址,然后反汇编func1,直到在其中找到对func2的调用。识别正确的电话可能有些棘手,但这绝对是可行的。

评论


在DLL可能更改/更新的情况下,这是一个更好的选择。我在利用DLL调用内部函数的漏洞中也看到了这一点。尽管这将很难实现OP,但是它几乎不会中断(假设函数的调用链是相同的)。

– sudhackar
18年7月5日在6:57