上次我严重描述了我的问题。 现在我试着更清楚地解释我的问题。
我试图进行硬盘序列检查以防止程序分发。我没有src,所以我在.code
部分找到了一些空格并在那里注入了代码。
您可以看到模块间通话。例如,call kernel32.GetDriveTypeA
匹配call 75738D98
。但重启后,此地址会发生变化。但是我的代码调用了不正确的75738D98
地址。
我需要修复它(解析新的GetDriveTypeA
地址并将75738D98
替换为正确的地址)
答案 0 :(得分:2)
LoadLibrary
和GetProcAddress
将为您提供DLL函数的地址。接下来的一个自然问题是:如果您不知道他们的地址,您如何致电LoadLibrary
和GetProcAddress
?
所有用户进程都加载了kernel32。您不需要在kernel32中动态加载任何内容。
通常你的链接器& OS加载器通过链接到导入库(例如kernel32.lib)为您完成所有这些操作。这将告诉操作系统您希望kernel32加载您的DLL。你的DLL有一个import address table,它包含一堆真实导入函数的存根。加载模块时,操作系统会修补这些存根以指向实际的功能地址。
你可能也应该这样做。如果你试图过于讨厌,你的应用甚至可以被检测为恶意软件。
你有充分的理由不直接链接到导入库吗?