我是一个加载在某个进程的内存空间中的DLL。我是此进程中存在的许多 DLL 的一部分,有些是动态加载的,有些是静态加载的。
在这个进程的空间中,有一个“数据 gem ”可供我发现,我们假设它位于“数据”段中(即不在一些奇怪的自修改代码中)。
我需要找到它。我需要搜索内存,例如执行 memcmp() 但我不知道从哪里开始寻找。也许我可以从 0 到多演出进行强力搜索,但这会抛出读取访问或仅执行异常,也许我将能够处理这些异常,这样我就不会降低整个过程。但这听起来很狡猾。
有没有更智能的搜索方式?我突然想到,我可以查看主进程的数据段,因为有一种方法可以以某种方式从 NT header 获取地址范围,而且我确实知道我已加载的进程。然后我可以枚举所有已加载的 DLL 并查看其空间内部。
任何人都可以建议一种方法,甚至告诉我我是否走在正确的道路上吗?
最佳答案
您可以通过 EnumProcessModules
枚举进程中所有已加载的模块使用GetCurrentProcess
作为进程句柄。然后对于每个模块,您可以调用 GetModuleInformation
这将返回给你 MODULEINFO
struct 可以准确地告诉您模块在内存中的加载位置及其大小。或者您可以调用GetModuleFileNameEx
并检查磁盘上的模块。
请注意,读取进程中的任意内存(甚至是您当前正在运行的进程)可能会出现问题。例如,如果另一个线程与您的线程同时运行,那么当您对其进行迭代时,它可能会影响模块表。
关于c++ - 识别Win32/Win64中的数据段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48641422/