如何更正WinAPI调用?

如何更正WinAPI调用?,winapi,Winapi,上次我把我的问题描述得很糟糕。 现在我将试着更清楚地解释我的问题 我正在尝试进行HDD串行检查,以防止程序的分发。我没有它的src,所以我在.code部分找到了一些空间,并在那里插入了代码 您可以看到模块间调用。例如,调用kernel32.GetDriveTypeA匹配调用75738D98。但重新启动后,此地址会更改。但是,我的代码调用的地址不正确 我需要修复它(解析新的GetDriveTypeA地址并用正确的地址替换75738D98)LoadLibrary和GetProcAddress将为您

上次我把我的问题描述得很糟糕。 现在我将试着更清楚地解释我的问题

我正在尝试进行HDD串行检查,以防止程序的分发。我没有它的src,所以我在
.code
部分找到了一些空间,并在那里插入了代码

您可以看到模块间调用。例如,
调用kernel32.GetDriveTypeA
匹配
调用75738D98
。但重新启动后,此地址会更改。但是,我的代码调用的地址不正确


我需要修复它(解析新的
GetDriveTypeA
地址并用正确的地址替换
75738D98

LoadLibrary
GetProcAddress
将为您提供DLL函数的地址。下一个自然问题是:如果不知道它们的地址,如何调用
LoadLibrary
GetProcAddress

所有用户进程都加载了内核32。您不需要在kernel32中动态加载任何内容

通常情况下,您的链接器和操作系统加载程序通过链接到导入库(例如kernel32.lib)来为您完成这一切。这将告诉操作系统您希望用DLL加载内核32。您的DLL有一个包含一堆实际导入函数的存根的。加载模块时,操作系统会对这些存根进行修补,以指向实际函数地址

你也应该这样做。如果你试图进行黑客攻击,你的应用甚至会被检测为恶意软件


你有充分的理由不只是链接到导入库吗?

没有,链接器会生成一个存根,当DLL映射到内存时,该存根会被操作系统加载程序代码连接起来。然后继续:如何修改该存根?一个更好的问题是:为什么假设它应该保持不变?它是虚拟地址空间;您不应假定任何模块的位置。这就是LoadLibrary和GetProcAddress存在的原因。磁盘上的代码保持不变。内存中的代码(导入地址表)已修补。见:Thx,tenfour!幸运的是,目标PE的导入表中有
GetProcAddress
!现在我只需要给它们打个电话,并获得正确的ant函数地址。现代版本的Windows将随机分配加载模块的基址,从而更难实施“返回libc”攻击。请看,您应该编辑上一个问题,而不是在新问题中重新表述。现在请删除前面的问题。