『壹』 如何通過一個程序的進程來獲取該程序的可執行文件的路徑
實例句柄這個東西,MSDN說了,就是載入進程映像的基址,每個進程都是一樣的,你得到其他的進程也在你自己的進程里用不了。比如,你建立任何一個進程,GetMoleHandle(NULL)函數返回的就是進程的實例句柄,一般都是0x400000(可能少寫或多寫了一個0)。所以,要得到一個進程的路徑,只有一個方法,把自己的代碼注入到目標進程的地址空間中,在被注入的代碼中使用GetMoudleFileName(GetMoleHandle(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文件注入進去。
只有把自己的代碼注入到目標進程中,你才可能利用GetMoleFileName函數得到目標進程的路徑。當然這個工作是由已經注入到目標進程中的DLL來做。
『貳』 VB如何獲得指定已運行中進程的文件路徑(已知 進程明 和句柄)
原型:
int WINAPI icePub_getProcessPathByName(char *strProcessName,char *strPath)
輸入:strProcessName 進程名
輸出:strPath 進程帶路徑文件名
Private Declare Function icePub_getProcessPathByName Lib "icePubDll.dll" (ByVal strProcessName As String,ByVal strPath As String) As Integer
Dim a2 As Integer
DIm buff As String
buff=space(1024)
a2=icePub_getProcessPathByName("QQ.exe",buff)
MsgBox buff
『叄』 如何根據窗口句柄得到文件路徑
1. 根據窗口句柄找到其進程Id(GetWindowThreadProcessId?
2. 使用CreateToolhelp32Snapshot創建一個梅舉句柄,梅舉模塊
3. 使用Mole32First/Mole32Next查找模塊,其中帶exe擴展名的就是其exe文件全路徑
『肆』 易語言如何拖放文件,識別文件路徑,創建目錄
易語言拖放文件識別信息請參考:
.版本 2
.支持庫 edroptarget
.子程序 __啟動窗口_創建完畢
拖放對象1.接收文件 = 真
拖放對象1.注冊拖放控制項 (取窗口句柄 ())
.子程序 _拖放對象1_得到文件
.參數 接收到的文件路徑, 文本型
拿到文件名然後進行文件名分析再進行文件夾的新建以及文件的拷貝操作即可、、