

但是如何取得该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
