如何通过一个程序的进程来获取该程序的可执行文件的路径

来源:百度知道 编辑:UC知道 时间:2024/05/27 04:54:08
因为对于不同电脑,某个程序的可执行文件的路径可能不同,所以我想要用以下方法获取程序的可执行文件的路径
DWORD dwLen = ::GetModuleFileName(hProcess, strModPath, _MAX_PATH);
但是GetModuleFileName的第一个参数是程序的实例句柄,我现在只知道该程序的进程方面的信息,hProcess为进程句柄,所以以上编译错误,请高手帮忙,怎么获取实例句柄,我需要的是从进程方面下手,其他的方法对我不适用,谢谢了啊,我刚申请的帐号没分,呵呵

实例句柄这个东西,MSDN说了,就是加载进程映像的基址,每个进程都是一样的,你得到其他的进程也在你自己的进程里用不了。比如,你建立任何一个进程,GetModuleHandle(NULL)函数返回的就是进程的实例句柄,一般都是0x400000(可能少写或多写了一个0)。所以,要得到一个进程的路径,只有一个方法,把自己的代码注入到目标进程的地址空间中,在被注入的代码中使用GetMoudleFileName(GetModuleHandle(NULL),szModPath,MAX_PATH)来得到这个进程的所在路径。
这就涉及到注入进程这个有意思的东西了。简单而易用的方法,就是用《Windows核心编程》中提到的方法,用创建远程线程来把自己的DLL注入到目标进程的方法来实现。创建远程线程用CreateRemoteThread(),很简单,与CreateThread()使用方法一样,只不过多出的第一个参数是目标进程句柄(记住,要有PROCESS_CREATE_THREAD权限),其他的参数,都要是在目标进程的地址空间中的。
基本的流程应该是:
用OpenProcess()函数打开目标进程,权限要有PROCESS_CREATE_THREAD,PROCESS_VM_READ,PROCESS_VM_WRITE。然后用VirtualAllocEx函数在目标进程中分配一个内存空间,这个空间要保存你的Dll文件的路径,然后用WriteProcessMemory把这个字符串写入,再用GetProcAddress得到LoadLibraryA函数的地址,当然得到的地址是自己进程地址空间中的地址,但一般情况下绝大部分进程的这个地址处都是同样的LoadLibraryA函数。利用得到的在目标进程中分配的内存的地址及LoadLibraryA函数,就可以利用创建远程线程的方法把自己的DLL文件注入进去。
只有把自己的代码注入到目标进程中,你才可能利用GetModuleFileName函数得到目标进程的路径。当然这个工作是由已经注入到目标进程中的DLL来做。