RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1183556
Accepted
Barracudach
Barracudach
Asked:2020-09-28 22:30:35 +0000 UTC2020-09-28 22:30:35 +0000 UTC 2020-09-28 22:30:35 +0000 UTC

不同PE中WinApi函数的地址是否匹配?

  • 772

我想制作自己的 dll 加载器,这将允许从字节数组将 dll 加载到进程中,但我找到了一个现成的版本。我不了解一个细节。一切都井井有条..

首先,我们根据对齐方式将所有部分投影到目标进程中。其次,我们在目标进程中创建一个内存区域,在其中写入从内存中运行 dll 所需的数据和一个填充导入表、重定位的函数,然后我们将在单独的线程中运行. 实际上加载器本身:https ://github.com/BenjaminSoelberg/ReflectivePELoader 。我不明白的是,当我们填写结构时loaderdata,我们将加载dll的程序中的函数地址传递到函数指针字段中:

typedef HMODULE(__stdcall* pLoadLibraryA)(LPCSTR);
typedef FARPROC(__stdcall* pGetProcAddress)(HMODULE, LPCSTR);

LoaderParams.fnLoadLibraryA = LoadLibraryA;
LoaderParams.fnGetProcAddress = GetProcAddress;

毕竟,这些函数的加载地址在我们的加载器和目标进程中并不总是相同的。库可以在不同的进程中加载​​到不同的地址。然而,这个加载器就像 x32 程序上的时钟一样工作。

UPD。我决定深入研究调试器,到目前为止,我比较的所有库确实具有相同的加载地址。x32 和 x64(但不是 x64 和 x32)。它们总是一样吗?据我所知,可以在任意地址加载 dll(但在允许的范围内)

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    nick_n_a
    2020-10-01T14:40:45Z2020-10-01T14:40:45Z

    启动程序时,我会说有一个“最小包”的库。尽管您调用LoadLibraryA了 ,系统仍会为您提供已预加载的库的地址。那些。如果你打了两次电话,LoadLibraryA库将被加载到相同的地址。

    我想指出几点:

    • 每个库或模块都有一个“推荐的加载地址”——称为镜像库(在 PE-coff 标头中)。当一个库第一次加载时,如果它没有被另一个库或模块占用,它会准确地加载到这个地址。这就是导致图书馆地址“稳定”的原因。使用相同的库加载顺序,它们最终将位于相同的地址。
    • 有一个用于加载系统库的“顶部区域”。
    • 该库可以在初始化期间加载它需要的更多库(可以动态链接或以编程方式)
    • 一些驱动程序可以将他们的库注入到每个正在运行的进程中
    • 每个进程都有自己的地址空间,称为虚拟内存,地址空间的内存不相交(不冲突,可以相交-但这由操作系统控制,您无法从应用程序级别检查),非系统库可以为不同的程序加载到不同的地址。

    那些。即使你理论上加载了三个或四个重要的库 kernel32.dll user32.dll gdi32.dll ntdll.dll(它们总是在内存中)——它们将 a)根据它们的图像库定位;b)将加载十几个依赖库。由于系统库是先加载的,所以它们会占用自己的稳定地址,而其他人会缺少这些地址。

    进一步..我会推荐这样的算法,首先调用GetModuleHandleA,如果这个函数返回地址-这意味着库已经加载,不能再次加载(下面的例外)。对于系统库(以及可执行模块的导入部分的库) - 该功能将毫无问题地工作。如果您“嵌入” - 那么我建议纯粹调用此函数进行验证。LoadLibraryA与 不同,函数GetModuleHandleA增加了库使用计数器,即 如果您的程序或并行“线程”(线程)进行调用FreeLibrary- 那么在 c 的情况下LoadLibraryA- 库将不会被卸载,因为 将有一个额外的标签,它被使用,因为GetModuleHandleA- 不会有这样的行为。您可以使用一对而不是LoadLibrary一FreeLibrary对GetModuleHandleA/LoadLibraryA如果不需要卸载库。我没有注意到有人卸载了库,我认为这仅适用于插件库。

    PS 地址空间的稳定性充满了病毒通过注入带有指向稳定定位系统函数的链接的原始代码进行渗透的可能性。因此,在 Windows 操作系统中,从 vista 开始(“六”,无需安装额外的包,在早期的有条件的 XP 中可以),已经有ASLR技术允许您随机化加载库的地址空间。我没有深入研究,我不能说它有多有效。到目前为止(2020 年),该技术不适用于 windows 系统库。系统库的地址是专门选择的,以便内核可以有效地适应内存,也许这就是这种行为的原因。通过设置dynamicbase标志为新程序启用 ASLR 。并且在 VS2019 中默认启用。对于较旧的程序,ASLR 被禁用以实现向后兼容性。也许将来 ASLR 会更有效地工作。

    • 7

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5