#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 APIGetProcAddr
用于检索导出功能的地址。对于未导出的函数,它将始终返回null
,因为它无法在PE文件中找到它。如果不导出函数在可执行文件中的位置,则不可用(这不是完全正确的,因为符号可能仍会显示该信息,但GetProcAddr
并未使用它们。)。如果您仍然希望要找到指向非导出函数的函数指针,您需要遵循导出的引用链。例如,如果func1
使用func2
并且导出了func1
,则可以获取func1
的地址,然后反汇编func1
,直到在其中找到对func2
的调用。识别正确的电话可能有些棘手,但这绝对是可行的。
评论
在DLL可能更改/更新的情况下,这是一个更好的选择。我在利用DLL调用内部函数的漏洞中也看到了这一点。尽管这将很难实现OP,但是它几乎不会中断(假设函数的调用链是相同的)。
– sudhackar
18年7月5日在6:57