系统DLL在每个进程中的地址是否一样?

malpower 2009-11-16 01:12:31
我想写个远程线程创建程序,用来跟踪扫雷程序,但是我在我自己的进程中用GetProAddress函数查到的MessageBoxA函数的地址,并且传递给了远程进程函数,但是在调用的时候还是出错了,
我想问下,是不是因为DLL在每个进程中的地址不一样?
但是好象在某本书上看见的是一样的啊。
...全文
377 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjlsmail 2009-11-16
  • 打赏
  • 举报
回复
Mark
tcbhj 2009-11-16
  • 打赏
  • 举报
回复
当然一样,系统dll都是经过rebase.exe的
哈利路亚1874 2009-11-16
  • 打赏
  • 举报
回复
绝对一样!因为所有的系统DLL在内存中只有一份,只是引用计数不同而已!
shenyi0106 2009-11-16
  • 打赏
  • 举报
回复
系统DLL(KERNEL32.DLL,USER32.DLL,GDIPLUS.DLL等DLL)在内存中的地址使一样的
具体可以看看一个技术点,叫过远程线程注入,里面有说明
oyljerry 2009-11-16
  • 打赏
  • 举报
回复
Vista OS等操作系统以后,为了保护,DLL加载地址会做一些偏移...
MoXiaoRab 2009-11-16
  • 打赏
  • 举报
回复
KnownDLLs里面的系统DLL绝对一样,其余的一般情况下不一样
StarsunYzL 2009-11-16
  • 打赏
  • 举报
回复
不一定一样,但是ntdll.dll、kernel32.dll这2个最基本的DLL一般是一样的
yangyang__ 2009-11-16
  • 打赏
  • 举报
回复
按道理来说不一定是一样的。但是kernel32.dll一般是一样的,这个特点常用来实现远程注入DLL。

因为每个PE文件(像EXE、DLL这种文件)都有一个建议装载地址。如果这个建议装载地址及其大小可以使用(没有被别的DLL使用),那么就把这个DLL装入建议地址。如果不能在这个地址正常装载,那再另找其它地址。如果所有加载这个DLL的进程都是按其建议装载地址加载的,那肯定是一样的了。但这没有一点保证。因此不能说肯定一样。
至于kernel32.dll一般是一样的原因我也不是很清楚,可能是每个用户进程都是从CreateProcess而来的,CreateProcess由kernel32.dll导出,所以kernel32.dll是一样的。也可能是kernel32.dll是一个很重要的DLL,里面导出的函数也很重要甚至就是用kernel32.dll里面的函数加载其它DLL,所以加载的时候先加载它,再加载其它DLL。
导出MessageBoxA的user32.dll就不能有这样的保证了。
JonathanS666 2009-11-16
  • 打赏
  • 举报
回复
和宿主程序共用一个地址空间,并非绝对地址,是进程的虚拟地址。
你要在远线程中访问任何的内存,要在远程进程地址空间是有效的,可访问的。
快乐鹦鹉 2009-11-16
  • 打赏
  • 举报
回复
我想应该不一样的吧。

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧