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