c++ - 识别Win32/Win64中的数据段

标签 c++ winapi dll win64 data-segment

我是一个加载在某个进程的内存空间中的DLL。我是此进程中存在的许多 DLL 的一部分,有些是动态加载的,有些是静态加载的。

在这个进程的空间中,有一个“数据 gem ”可供我发现,我们假设它位于“数据”段中(即不在一些奇怪的自修改代码中)。

我需要找到它。我需要搜索内存,例如执行 memcmp() 但我不知道从哪里开始寻找。也许我可以从 0 到多演出进行强力搜索,但这会抛出读取访问或仅执行异常,也许我将能够处理这些异常,这样我就不会降低整个过程。但这听起来很狡猾。

有没有更智能的搜索方式?我突然想到,我可以查看主进程的数据段,因为有一种方法可以以某种方式从 NT header 获取地址范围,而且我确实知道我已加载的进程。然后我可以枚举所有已加载的 DLL 并查看其空间内部。

任何人都可以建议一种方法,甚至告诉我我是否走在正确的道路上吗?

最佳答案

您可以通过 EnumProcessModules 枚举进程中所有已加载的模块使用GetCurrentProcess作为进程句柄。然后对于每个模块,您可以调用 GetModuleInformation这将返回给你 MODULEINFO struct 可以准确地告诉您模块在内存中的加载位置及其大小。或者您可以调用GetModuleFileNameEx 并检查磁盘上的模块。

请注意,读取进程中的任意内存(甚至是您当前正在运行的进程)可能会出现问题。例如,如果另一个线程与您的线程同时运行,那么当您对其进行迭代时,它可能会影响模块表。

关于c++ - 识别Win32/Win64中的数据段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48641422/

相关文章:

c++ - FLTK 框元素在窗口中不可见

c++ - cin.getline() 正在删除我在 C++ 中输入的第一个让步

c++ - 具有相邻位置 View 的 Win32 内存映射文件

c++ - 按住 mouse1 时如何在 Windows Mousehook 中重复我的代码

c++ - 使用 C++11/14 正确定义 DLL 接口(interface)

dll - 如何获取user32.dll中所有入口点的名称?

dll - 如何在共享库中动态调用函数?

C++ while循环添加的问题

c++ - 将文本转换为 HPGL(绘图仪) vector 坐标

c++ - 如何使用 FillRect() 绘制子窗口?