1. 苏葳的备忘录首页
  2. 编程

C#中查询另一进程的装入模块信息

c# api dll 地址做游戏修改器时,需改写游戏进程的代码,以前用代码在4G虚存中的固定志地址来写,有次偶然发现这代码由于位于一个dll中(s2logic.dll)中,而dll在游戏中的装入地址并非每次都是固定的,这样写进去肯定会出问题。而代码相对于此dll的装入地址来说,肯定是固定不变的.因此,取得此dll在该进程内存中的装入地址,再加上这段代码相对该dll的偏移地址,自然就可得到应该写入的地址了。

但是如何取得该dll在该进程中的装入地址呢?惯性思维认为还是要用API来做.有以下几种方法:

一、PEB进程控制块中有装入的所有模块地址,据说在FS:30的位置,但是详情不明.

二、VirtualQueryEx,循环查询目标进程所有内存块,而每内存块的地址实际就是hMoudle,也就是模块的句柄,亦可找到该模块地址.

三、用CreateRemoteProcess创建远程线程,执行GetMoudle API以取得确定模块的地址信息等.由于GetMoudle已处于目标进程地址空间内,所以可以顺利取得各模块地址.

以上都相当繁琐,然而突然找到了被忽视的.net Process对象,查看网上信息,原来取得各进程各模块地址相当容易

Process[] myProcesses = Process.GetProcesses();
try
{
  for (int i = 0; i < myProcesses.Length - 1; i++)
  {
    Console.WriteLine(myProcesses[i].ProcessName + " PID " + myProcesses[i].Id);
    ProcessModuleCollection myModules = myProcesses[i].Modules;
    for (int j = 0; j < myModules.Count; j++)
    {
      Console.WriteLine(myModules[j].ModuleName + "\t" + myModules[j].EntryPointAddress.ToString("X") + "\t" + myModules[i].FileVersionInfo.FileVersion);
    }
  }
}
catch (Exception ee) {
  Console.WriteLine(ee.Message);
}

只需把EntryPointAddress改为BaseAddress即可。用uint.toString(“x”)可直接显示为16进制字符串。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/218.html

发表评论

邮箱地址不会被公开。 必填项已用*标注