社区
进程/线程/DLL
帖子详情
如何加载Dll到指定地址?
bacy001
2011-04-12 02:34:46
Dll 中有一个默认载入地址,一般是:0x10000000
如果加载时,从这个地址开始的内存段能够容纳下此 Dll 文件,那么系统会将此 Dll 加载到 0x10000000
否则系统会将 Dll 加载到进程空间中的其他可用位置!
我现在的问题是,有没有办法能够手动指定一个地址用于加载!
通过修改Dll文件可以做到,但是太麻烦了!请教各位高手!
...全文
376
12
打赏
收藏
如何加载Dll到指定地址?
Dll 中有一个默认载入地址,一般是:0x10000000 如果加载时,从这个地址开始的内存段能够容纳下此 Dll 文件,那么系统会将此 Dll 加载到 0x10000000 否则系统会将 Dll 加载到进程空间中的其他可用位置! 我现在的问题是,有没有办法能够手动指定一个地址用于加载! 通过修改Dll文件可以做到,但是太麻烦了!请教各位高手!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bulerain
2011-04-14
打赏
举报
回复
[Quote=引用 6 楼 lactoferrin 的回复:]
引用 5 楼 bulerain 的回复:
有一个很麻烦的实现,以创建线程的方式加载dll,线程在创建是暂停运行的,然后 通过getthreadcontext得到线程的TEB结构,获得dll入口点地址和加载的基地址,然后virtualallocex ,第二个参数指定你要加载的地址,前提是你指定的地址没有其他程序使用,然后把你想要加载的dll的pe结构映射到virtualallocexe分配后的地址……
[/Quote]
通过getthreadcontext 得到context::Ebx,这个指向peb结构
majia2011
2011-04-14
打赏
举报
回复
[Quote=引用 10 楼 lactoferrin 的回复:]
引用 7 楼 bulerain 的回复:
引用 6 楼 lactoferrin 的回复:
引用 5 楼 bulerain 的回复:
有一个很麻烦的实现,以创建线程的方式加载dll,线程在创建是暂停运行的,然后 通过getthreadcontext得到线程的TEB结构,获得dll入口点地址和加载的基地址,然后virtualallocex ,第二个参数指定你要加载的地址,前提是你指定的地址……
[/Quote],
你俩的方法都对,都可以获得,你的方法还要判一下系统,追踪下getthreadcontext其实还是fs
Lactoferrin
2011-04-14
打赏
举报
回复
[Quote=引用 7 楼 bulerain 的回复:]
引用 6 楼 lactoferrin 的回复:
引用 5 楼 bulerain 的回复:
有一个很麻烦的实现,以创建线程的方式加载dll,线程在创建是暂停运行的,然后 通过getthreadcontext得到线程的TEB结构,获得dll入口点地址和加载的基地址,然后virtualallocex ,第二个参数指定你要加载的地址,前提是你指定的地址没有其他程序使用,然后把你想要加载的dll的pe……
[/Quote]
什么意思,要peb直接从fs:[0x30]得到
sunlin7
2011-04-14
打赏
举报
回复
vc6中菜单 projects->settings->link选项卡中下拉选项找到output,里面有Base Address,
vs2008里面projects->properties->Configuration Peroperty->Link->Advanced里面有Base Address,
在Base Address里面填上一个不常用的按dll节对齐大小对齐的地址(建议使用1024整数倍地址),比如0x6000000
也可以直接在Link的命令行选项里面使用/base:"0x6000000"
PS:手工修改PE加载地址,可能需要进行必要的重定向操作,很多情况下很难成功。
另外,也可以用自己手工申请地址,使用RawPeApi加载dll到申请的地址.
哈利路亚1874
2011-04-14
打赏
举报
回复
自己实现加载过程,把dll文件拷贝到你指定的内存地址,然后修正导入表和重定位信息,然后跳转到oep
野男孩
2011-04-14
打赏
举报
回复
连接器中绑定BaseAddress就可以了
bulerain
2011-04-13
打赏
举报
回复
有一个很麻烦的实现,以创建线程的方式加载dll,线程在创建是暂停运行的,然后 通过getthreadcontext得到线程的TEB结构,获得dll入口点地址和加载的基地址,然后virtualallocex ,第二个参数指定你要加载的地址,前提是你指定的地址没有其他程序使用,然后把你想要加载的dll的pe结构映射到virtualallocexe分配后的地址,(实际上就是从内存启动dll),setthreadcontext,设置新的dll入口点地址和virtualallocexe返回的地址,然后恢复线程的执行。
参照PeMemPeLoader0.2的实现
HANDLE hthd = CreateThread(
0,
0,
(LPTHREAD_START_ROUTINE )LoadLibrary("yourdll.dll"),
NULL,
CREATE_SUSPENDED ,/*以线程的方式启动dll,调用ResumeThread 启动dll,默认线程挂起*/
0);
Lactoferrin
2011-04-13
打赏
举报
回复
[Quote=引用 5 楼 bulerain 的回复:]
有一个很麻烦的实现,以创建线程的方式加载dll,线程在创建是暂停运行的,然后 通过getthreadcontext得到线程的TEB结构,获得dll入口点地址和加载的基地址,然后virtualallocex ,第二个参数指定你要加载的地址,前提是你指定的地址没有其他程序使用,然后把你想要加载的dll的pe结构映射到virtualallocexe分配后的地址,(实际上就是从内存启动dll),setth……
[/Quote]
你这样做,LoadLibrary还没执行,怎么得到加载的基地址?
oyljerry
2011-04-12
打赏
举报
回复
DLL工程属性中可以设定加载的地址,当冲突时,系统会再换一个.
Lactoferrin
2011-04-12
打赏
举报
回复
[Quote=引用楼主 bacy001 的回复:]
Dll 中有一个默认载入地址,一般是:0x10000000
如果加载时,从这个地址开始的内存段能够容纳下此 Dll 文件,那么系统会将此 Dll 加载到 0x10000000
否则系统会将 Dll 加载到进程空间中的其他可用位置!
我现在的问题是,有没有办法能够手动指定一个地址用于加载!
通过修改Dll文件可以做到,但是太麻烦了!请教各位高手!
[/Quote]
你为什么要手动定一个地址用于加载?修改Dll文件并不麻烦,只要它有重定位表,就可以直接修改它的IMAGE_OPTIONAL_HEADER中的BaseAddress
无言猪
2011-04-12
打赏
举报
回复
应该是不能的.比如该地址已经被用了.
珍惜生命远离CPP
2011-04-12
打赏
举报
回复
编译的时候有选项可以指定加载dll地址
估计你说的修改dll就是修改这个。
C#下反射动态
加载
dll
后如何卸载?
最近在做项目的时候,遇到一个需求,需要通过选择的文件,先判断是C#
dll
还是C++
dll
,再判断
dll
是否是我们需要的特定
dll
,还是别的随便一个
dll
。 经过研究发现,我们可以通过反射来
加载
dll
,如果用C#的反射机制可以正确
加载
dll
,那么就可以认为该
dll
是C#类型的,如果不能正确
加载
,我们再通过C++的方法来
加载
进行判断。 判断是否特定
dll
的话,只需在判断完
dll
类型后,对
dll
中的特定类进行判断即可。 但是这里,存在一个问题,通过反射
加载
完C#
dll
后,该
dll
即被占用,无法进行修改(比如
无法
加载
DLL
:找不到
指定
模块 问题解决办法
无法
加载
DLL
:找不到
指定
模块 问题解决办法问题描述尝试过的无效方法最终解决办法疑问 问题描述 最近用C#写了一个WinForm应用程序,调用了一个别人写的
DLL
动态库,由于本人的电脑系统是64位的,将来写的程序要用到一个32位Win7的老机器上,所以用VS编译的时候选择了x86目标平台。写好的程序在本人的64位机器上运行没有任何问题,但是拷贝到那个32位机器上的时候,就报出“无法
加载
DLL
:找不...
DLL
错误之——无法
加载
DLL
“***.
dll
“:找不到
指定
的模块(异常来自HRESULT:0x8007007E)问题的终极感悟
1、前奏 最近帮老师用opencv做一个东西,在VS2013中配置了opencv 的经典版本opencv2.4.9,做了一个视频解帧的工作,封装成了C++的
dll
,以供对方公司使用C#语言调用,所以我需要用C#测试我的
dll
C#语言真是难缠,
dll
缺失或者
dll
中内部有错误都只给你一个信息那就是:“无法
加载
DLL
"***.
dll
":找不到
指定
的模块(异常来自HRESU
Windows
Dll
动态
加载
Windows
DLL
动态
加载
1. 起因2. 问题原因3. 解决3.1 C++ 版3.2 C#版 1. 起因 写代码的时候,需要动态
加载
DLL
,这是一个非常非常常规的操作对吧。然而在开发的时候表现的一切正常,但是打包后,在别的机子上死活
加载
不到
dll
。???? 2. 问题原因 对于这个问题常见的原因无非就以下几个:
DLL
生成的有问题
加载
路径写的不对 程序的权限不够 我这里遇到的是权限不够,所以我以管理员权限运行程序,我以为我终于要解决问题的了,but给我返回了个126(无法找到
指定
模块)… 苦思冥
【已解决】无法
加载
DLL
“xxx.
dll
”: 找不到
指定
的模块。 (异常来自 HRESULT:0x8007007E)。
【已解决】无法
加载
DLL
“xxx.
dll
”: 找不到
指定
的模块。 (异常来自 HRESULT:0x8007007E)。
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章