如果加载到应用程序中,DLL中的函数地址是否可以更改?

Kos*_*mos 5 c++ dll function memory-address

我反汇编了一个DLL并看到了一些函数.我找到了我需要的功能,它的地址是0x10001340.

如果我将这个dll加载到我的应用程序中,这个地址是否会保持不变?那么我可以通过我的应用程序中的地址调用该函数吗?

我问,因为我不确定:如果加载此dll时,主应用程序中的某些功能已经具有相同的地址?所以也许dll中的函数可以在加载等时更改地址.

Mat*_*lia 8

在Windows上,dll具有优先加载地址,但如果加载器注意到已经使用了虚拟地址空间的这一部分,则加载器能够更改所有这些引用.此过程称为"变基".

"默认"基址是在链接时指定的(/BASE使用Microsoft链接器),如果您计划将dll与另一个具有相同基址的dll一起使用,则将其设置为与默认值不同的内容会很有用.这加快了加载过程,因为加载器不必在每次加载时重新设置其中一个dll.(IIRC还有一些工具能够重新定义现有的dll并将结果保存在磁盘上)

最好记住,从Windows Vista开始,使用指定标志编译的dll总是加载到随机基址,以避免某种漏洞.