none
[VB6]求助! 讀取記憶體時,無法開啟pid,這是為什麼? RRS feed

  • 問題

  • 模組宣告:

    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

     

    Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

     

    Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

     

    Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

     

    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

     

    ---------------------------------------------------

     

    程式碼:

    Dim str As String

    Private Sub Command1_Click()
    Dim hwnd As Long
    Dim pid As Long
    Dim hThreadID As Long
    Dim pHandle As Long

    Rem 宣告完成,以下為記憶體讀取

     

    hwnd = FindWindow(vbNullString, "Windows 工作管理員")
    If (hwnd = 0) Then
    MsgBox "沒有找到Windows 工作管理員"    '這邊通過了
    Exit Sub
    End If

     

    hThreadID = GetWindowThreadProcessId(hwnd, pid)
    If (hThreadID = 0) Then
    MsgBox "無法取得pid"  'pid也取得了
    Exit Sub
    End If

     

    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
    If (pHandle = 0) Then
    MsgBox "無法開啟pid"  '這邊他就顯示出無法開啟pid了
    Exit Sub
    End If

     

    ReadProcessMemory pHandle, &H3A4B4D74, str, 20, 0&

     

    txtDisplay.Text = str

     

    CloseHandle hProcess
    End Sub

     

    請問上面的程式碼有錯誤嗎?

    這個是我去很多網站比對的範例,我研究了好幾天了,所以想求助,謝謝

    2007年8月5日 上午 02:06

解答

  • HI,

     

    您在OpenProcess的時候必須加上PROCESS_VM_WRITE控制, 呼叫WriteProcessMemory才可以成功.WriteProcessMemory的參數意義如下:

     

    BOOL WINAPI WriteProcessMemory(
      HANDLE hProcess,                                                //記憶體被寫入的Process的Process Handle
      LPVOID lpBaseAddress,                                         //從那一段記憶體開始寫入
      LPCVOID lpBuffer,                                                 //欲寫入的資料陣列
      SIZE_T nSize,                                                       //欲寫入的資料陣列的的位元組數
      SIZE_T* lpNumberOfBytesWritten                          //傳回成功寫入到Process的位元組數
    );

    tihs

    2007年8月8日 上午 02:07

所有回覆

  • HI,

     

    您可以為程式加入On Error Goto錯誤處理機制, 再把錯誤訊息貼上來, 比較好判斷

     

    tihs

    2007年8月5日 上午 06:22
  •  

    不好意思,  "無法開啟pid"  這是我用了判斷式而出現的,並不是錯誤,可能我表達的不清楚

     

    因為pHandle=0所以設定msgbox,

     

    主要想問的事情是 為什麼pHandle=0  ,應該是這樣問吧!

     

    還是我誤會你的意思了,如果要加的話,該怎麼做好呢?

    2007年8月5日 上午 07:35
  •  

    OpenProcess失敗的問題,的確在XP下面會失敗。

    究其原因是PROCESS_ALL_ACCESS這個常量沒有定義

    Const PROCESS_ALL_ACCESS=&H1F0FFF  這樣就可以了,跟我遇到同樣困難的朋友可以試試這方法。

     

    但是過了這關,ReadProcessMemory 才是主要關鍵吧!

     

    這是我後來查到的

     

    WriteProcessMemory (ByVal hProcess As Long,

    ByVal lpBaseAddress As Any,  
    ByVal lpBuffer As Any,

    ByVal nSize As Long,

    lpNumberOfBytesWritten As) 


    hProcess 是目標進程的控制碼,從上面的 OpenProcess 函數中取得的。 
    lpBaseAddress
    是在計算器程式的虛擬記憶體中將要被修改的位址,也就是使用記憶體搜索程式找到的那個位址。

    lpBuffer 是將要寫如上述位址的資料,可以是一個數值、陣列、字串或其他任何資料類型。

    nSize 是希望寫入 lpBaseAddress 的位元組數。

    lpNumberOfBytesWritten 是函數執行返回後,寫入目標位址的實際位元組數。它能被用來確認函數實際的執行情況。

     

     

    2007年8月5日 下午 01:24
  • HI,

     

    您的意思是OpenProcess已經成功, 但是ReadProcessMemory失敗嗎? 如果是的話, 應該是Windows的保護模式的關係, 程式是無法存取其他的程式的記憶體的

     

    tihs

    2007年8月6日 上午 03:28
  •  

    但是我試過 可以寫入可以說明 這兩個函式的參數嗎? 我應該要怎麼寫入資料與讀取?

    把讀取行程記憶體跟寫入行程記憶體的參數說明白= ="

     

    不然我要寫記憶體到遊戲裡面的時候,都怪怪的,

     

    WriteProcessMemory hProcess, &H3A4B4D74, "00", 4, 0&

     

    這行寫入,不管怎麼改變"00"的資料, 我改了大亂鬥的%數 他永遠會出現300% 而且還有問題。

     

     

    ReadProcessMemory hProcess, &H3A4B4D74, h, 4, 0&

     

    而這行讀取,我完全讀不到東西,行程都Open了,而且我用的是最高權限,應該都支援寫入跟讀取

     

    但是卻不會用這兩個函式...交一下 參數該怎麼填吧!

    2007年8月6日 上午 04:54
  • HI,

     

    您在OpenProcess的時候必須加上PROCESS_VM_WRITE控制, 呼叫WriteProcessMemory才可以成功.WriteProcessMemory的參數意義如下:

     

    BOOL WINAPI WriteProcessMemory(
      HANDLE hProcess,                                                //記憶體被寫入的Process的Process Handle
      LPVOID lpBaseAddress,                                         //從那一段記憶體開始寫入
      LPCVOID lpBuffer,                                                 //欲寫入的資料陣列
      SIZE_T nSize,                                                       //欲寫入的資料陣列的的位元組數
      SIZE_T* lpNumberOfBytesWritten                          //傳回成功寫入到Process的位元組數
    );

    tihs

    2007年8月8日 上午 02:07