2014-02-20 38 views
1

上次我描述我的问题很糟糕。 现在我会试着解释我的问题更清楚。如何更正WinAPI呼叫?

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

Screenshot

你可以看到intermodular电话。例如,call kernel32.GetDriveTypeA匹配call 75738D98。但重启后这个地址会改变。但是,我的代码调用的地址不正确75738D98

我需要修复它(解决新GetDriveTypeA地址和正确的地址替换75738D98

+2

现代版本的Windows将随机化已加载模块的基址,使其更难实现“返回到libc”攻击。见http://en.wikipedia.org/wiki/Address_space_layout_randomization – Bukes

+0

你应该编辑你以前的问题,而不是重新制定一个新问题。现在请删除前面的问题。 – manuell

回答

2

LoadLibraryGetProcAddress会给你的地址DLL函数。下一个自然的问题是:如果你不知道他们的地址,你怎么能拨打LoadLibraryGetProcAddress

所有用户进程都加载了kernel32。你不需要在kernel32中动态加载任何东西。

通常您连接&操作系统加载器通过链接到导入库(KERNEL32.LIB例如)做这一切为您服务。这将告诉操作系统你需要用你的DLL加载kernel32。您的DLL有一个import address table,其中包含一堆存根到真正的导入函数。当您的模块被加载时,操作系统修补这些存根以指向真实的功能地址。

你也应该这样做。如果您尝试过分唠叨,您的应用程序甚至可能会被检测为恶意软件。

你有没有很好的理由不链接到导入库?

+0

不,链接器生成一个存根,当DLL映射到内存时,该存根由OS加载程序代码连接。 – tenfour

+0

然后继续:*那个*存根如何被修改? – user2864740

+0

更好的问题是:为什么假设它应该保持不变?它是虚拟地址空间;你不应该假定任何模块的位置。这就是LoadLibrary和GetProcAddress存在的原因。 – tenfour