为什么我用DLL获取模块地址只能获取到8位数

img


为什么我用DLL获取模块地址只能获取到8位数,超出部分DBG就直接不显示了?是VS哪里的设置问题?
LoadLibraryA用的是这个函数。哪位有缘人可以教一下。例如那个3FFE0000 我用CE查看是13FFE0000 少了1个1
还有FEE70000 这个我用CE查看是 7EEFEE70000 少了三位数。

[9348] ttina:开始获取111 3fd30000,000000013FD30000
看吧 是dbg调试出来的信息,前面是用%11x调试出来的 后面是%p,为何会这样?有没有人懂得教一下,谢谢。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    这个问题涉及到模块地址的差异和显示方式的问题。 模块地址是一个指针,通常用于表示动态链接库(DLL)或可执行文件(EXE)在内存中的起始位置。在32位系统中,地址可以是32位的十六进制数;在64位系统中,地址可以是64位的十六进制数。

    Windows使用LoadLibraryA函数加载动态链接库时,返回的是模块的基址,即模块在内存中的起始地址。这个地址是以32位或64位的十六进制数形式表示的。

    如果你在调试器(如CE)中看到的地址和LoadLibraryA函数返回的地址不一样,这可能是因为显示方式的差异导致的。调试器通常会对地址进行格式化和显示,可能会影响显示的位数。

    对于第一个例子中的3FFE0000变成13FFE0000,少了一个1的情况,这可能是因为调试器在显示时错误地处理了这个地址。你可以尝试使用其他调试器来验证,或者尝试使用其他方法来获取模块地址。

    对于第二个例子中的FEE70000变成7EEFEE70000,少了三位数的情况,这是因为64位系统的地址是64位的,但传统的32位调试器无法完整地显示这个64位地址。你可以尝试使用64位的调试器来查看完整的地址。

    总的来说,LoadLibraryA函数返回的地址是正确的,但在显示时可能受到调试器或其他工具的限制。建议使用合适的工具进行验证和处理。

    如果你需要获取模块的完整地址,可以使用其他方法来获取,如远程线程注入、运行时内存扫描等。具体实现方式取决于你的需求和环境。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

16进制的8位就是32位了。再多就是64bit系统