调试dll的时候会有一件事情比较烦人,就是dll加载的地址不会很固定(默认设置下编译的dll基址总是0x10000000,多个同基址的dll加载时,后面的肯定会被重定位),这给前后多次调试时对比分析结果造成了一些麻烦,要解决这个问题,有两种办法。
方法一:直接修改dll文件PE头中的ImageBase为一个不大可能被占用的地址。
但是这个方法有一个小小的局限,就是有些文件是存在校验的,改了文件之后会出一些问题,比如拒绝加载之类的。 这种情况就要用第二种方法了。

方法二:动态修改dll的加载基址

当然,首先要搞清楚是哪里决定了dll的加载基址。
下面是dll的加载过程

kernel32!LoadlibraryA
->kernel32!LoadLibraryExA
->kernel32!LoadLibraryExW
->ntdll!LdrLoadDll
->ntdll!LdrpLoadDll
->ntdll!LdrpMapDll
->ntdll!LdrpCreateDllSection
->ntdll!ZwOpenFile  //打开目标文件
->ntdll!ZwCreateSection //创建映射
->ntdll!ZwMapViewOfSection //映射

关键就在映射这一步~ 函数原型如下:

NTSTATUS ZwMapViewOfSection(IN HANDLE  SectionHandle,IN HANDLE  ProcessHandle,IN OUT PVOID  *BaseAddress,IN ULONG_PTR  ZeroBits,IN SIZE_T  CommitSize,IN OUT PLARGE_INTEGER  SectionOffset  OPTIONAL,IN OUT PSIZE_T  ViewSize,IN SECTION_INHERIT  InheritDisposition,IN ULONG  AllocationType,IN ULONG  Win32Protect);

第三个参数就是要映射的基址了,关于这个参数,MSDN上有这样的说明:
BaseAddress
Pointer to a variable that receives the base address of the view. If the value of this parameter is not NULL, the view is allocated starting at the specified virtual address rounded down to the next 64-kilobyte address boundary.

也就是说,如果这个参数不是NULL的话,就会以这个地址向后对齐后作为基址,而系统加载dll时调用该函数时参数指向的值是0,也就是自行分配空闲地址
我们只需要在这里挂钩该函数,判断是目标dll在加载时,设置该值不为NULL就可以了,使其指向一个未分配的固定地址,比如0x60000000什么的~
这个挂钩可以在ring3进行也可以在ring0进行,但是ring3的话需要保证持钩的dll在目标dll之前加载,所以我干脆ring0了~

if(PreviousMode == UserMode && 是目标dll)
{*BaseAddress = 0x60000000 ;//要固定的基址
} return OriginalZwMapViewOfSection(SectionHandle,ProcessHandle,BaseAddress...);

在ZwMapViewOfSection的Hook函数中要判断是不是目标dll,只有一个SectionHandle参数可以用,但是单从一个SectionHandle不好判断是哪个dll(ring0可以直接取SectionObject.Segment.ControlArea.FilePointer进行判断,比较精确),我用的方法是ZwQuerySection查询这个句柄的SectionImageInformation信息,然后取ImageFileSize进行判断,这个ImageFileSize就是目标dll的真实文件大小,这个方法ring3和ring0都可以用,拿来判断问题不是很大,但是想绝对精确的话还是和ZwCreateSection时的FileHandle结合判断一下比较好~

转载于:https://www.cnblogs.com/achillis/p/5046511.html

固定dll的加载基址的方法相关推荐

  1. dll注册加载失败解决方法

    当输入命令regsvr32 A.dll注册时,跳出下面错误提示: 模块C:\windows\System32\A.dll加载失败. 请确保该二进制存储在指定的路径中,或者调试它检查该二进制或相关的 . ...

  2. dll注册加载失败解决方法,请确保二进制的解决办法(无数踩坑试出来的)

    两部 现在的win10一般都这么操作 先把dll放在system32中 再复制一份到sysWOW64中 再打开"开始-运行-输入regsvr32 dll",回车即可解决.

  3. 获取指定进程的加载基址

    背景 之前,自己写过一个进程内存分析的小程序,其中,就有一个功能是获取进程在内存中的加载基址.由于现在Windows系统引入了ASLR (Address Space Layout Randomizat ...

  4. mkl_def.dll文件加载失败

    mkl_def.dll文件加载失败 下载 mkl_def.dll文件的下载地址如下:Fix mkl_def.dll related errors in Windows 7, 8 or 10 | DLL ...

  5. 像加载DLL一样加载EXE

    介绍 你可能已经被警告过,不要用LoadLibrary()加载可执行文件,你可能尝试这么做过,然后程序就崩溃了,所以你可能会认为这是不可能的. 但实际上这是可行的,本文就将介绍具体的方法. 声明 这好 ...

  6. 在VC中动态加载ODBC的方法

    在VC中动态加载ODBC的方法     在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较 ...

  7. 逆战d3dx10_43.dll文件加载失败及dll文件缺失损坏修复解决方案

    废话前言:本人对电脑底层了解不太深,因此在前些天因为idea出现一个显示"构建进程终止异常"的bug,尝试网上很多解决方案都没有成功,无奈之下只好重装系统.但重装系统后,逆战又显示 ...

  8. 模块xxxx.dll已加载,但对DllRegisterServer的调用失败,错误代码为 XXXXXXXXX

    WIN7.WIN8  注册 卸载dll  报错: 模块"xxxx.dll"已加载,但对DllRegisterServer的调用失败,错误代码为 XXXXXXXXX 解决方法: 若为 ...

  9. Excel催化剂开源第3波-修复ExcelCom加载项失效问题及WPS可调用Com加载项的方法

    为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,若您觉得此文有用,不妨小范围地分享到真正有需要的人手中 功能概述 修复ExcelCom加载项常见问题,如每次需重新勾选COM加载项或COM加 ...

  10. android Viewpager取消预加载及Fragment方法的学习

    1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载.通过设置setOffscreenPageLimit(int numbe ...

最新文章

  1. 小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向
  2. 10种Git技巧,让你省时省力又省心!
  3. 电影情感分析 NLP实战
  4. 车主无忧:为什么放弃开源Kafka?
  5. SAP Spartacus ConfigInitializerService里的isStable属性
  6. javascript --- 让函数的实例可以链式调用
  7. 大萧条时期什么行业走俏_大流行时期的用户体验
  8. storm apache_Apache Storm的实时情绪分析示例
  9. spring cloud超时时间设置
  10. Windows Mobile开发的一些小技巧(持续更新)
  11. 沫沫金::jqGrid插件-弹窗返回值
  12. “乘风破浪”的芒果超媒,能上岸吗?
  13. java学生签到系统_学生签到系统.pdf
  14. 十进制 二进制 十六进制 八进制
  15. 电子计算机开票属于哪一类,请问计算器开票是什么大类
  16. 2022元宇宙共享大会|何超:“开放与兼容”唤起元宇宙新的思潮
  17. @程序员:连小学生都开始学编程了,你们怕了吗?
  18. AndroidN多窗口支持
  19. php程序员 一万小时定律,科学网—一万小时定律——阅读笔记 - 贾琳的博文
  20. Andriod小项目——在线音乐播放器

热门文章

  1. JProfiler 12 for Mac(Java开发分析工具)
  2. 最新M1芯片的MacBook Pro打开软件闪退解决方法
  3. 云原生生态周报 Vol. 3 | Java 8 ❤️ Docker
  4. Python 代码使用pdb调试技巧
  5. Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型
  6. mac windows蓝牙问题
  7. 【转载】BitSet
  8. 【超清视频】SCCM2012精讲系列课程03:SCCM2012的基础环境初始化(一)
  9. 春节见闻之北京前门步行街
  10. 经典实用数据库新书推荐-关于mysql和oracle【转孟光】