문제

현재 VB.net을 통해 G15 키보드의 게임에서 건강 정보를 표시하기 위해 작은 취미 프로젝트를 개발하고 있습니다.

API 호출을 통해 readProcessMemory를 사용하면 0이 계속 반환됩니다. MSDN 문서는 마샬.getLastWin32error () 호출을 사용하여 무엇이 잘못되었는지 확인하고 1400 : 유효하지 않은 창 핸들을 반환하도록 언급했습니다.

이제 함수의 첫 번째 인수가 창 핸들 또는 프로세스 ID를 원하는지 여부에 대해 혼란스러워합니다. 그럼에도 불구하고, 나는 FindWindow와 함께 시도하고 응용 프로그램이 실행되는 동안 프로세스 ID를 하드 코딩했습니다 (작업 관리자로부터 가져 오기).

나는 세 가지 다른 게임, 도시 테러, 그랜드 도난 자동차 : SA 및 3D 핀볼을 시도하여 치트 엔진이라는 응용 프로그램에서 메모리 주소를 얻었습니다. 그들은 모두 실패하는 것 같습니다.

다음은 내가 사용하는 코드입니다.

API 호출 :

Private Declare Function ReadProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByRef lpBuffer As Single, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer _
) As Integer

방법:

Dim address As Integer
address = &HA90C62&
Dim valueinmemory As Integer

Dim proc As Process = Process.GetCurrentProcess
For Each proc In Process.GetProcesses
    If proc.MainWindowTitle = "3D Pinball for Windows - Space Cadet" Then
        If ReadProcessMemory(proc.Handle.ToInt32, address, valueinmemory, 4, 0) = 0 Then
            MsgBox("aww")
        Else
            MsgBox(CStr(valueinmemory))
        End If
    End If
Next

Dim lastError As Integer
lastError = Marshal.GetLastWin32Error()
MessageBox.Show(CStr(lastError))

왜 그것이 작동하지 않는지 설명해 주시겠습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

첫째, 메소드 서명이 잘못되었고 단일 = float가 잘못되었고 원래 매개 변수는 lpbuf 유형입니다.

이 메소드 서명을 사용하십시오.

<DllImport("kernel32.dll", SetLastError=true)> _
Public Shared Function ReadProcessMemory( _
ByVal hProcess As IntPtr, _
ByVal lpBaseAddress As IntPtr, _
<Out()>ByVal lpBuffer() As Byte, _
ByVal dwSize as Integer, _
ByRef lpNumberOfBytesRead as Integer
) As Boolean
End Function

둘째, HPROCESS 핸들은 창 손잡이가 아닌 OpenProcess 기능으로 열린 핸들을 기대한다고 생각합니다.

다른 팁

감사합니다. Arul, 나는 일종의 문제를 해결했습니다.

Dim address As Integer
address = &HA90C62&
Dim floatvalueinmemory() As Byte

Dim proc As Process = Process.GetCurrentProcess
For Each proc In Process.GetProcesses
    If proc.MainWindowTitle = "3D Pinball for Windows - Space Cadet" Then
        Dim winhandle As IntPtr = OpenProcess(PROCESS_ACCESS.PROCESS_VM_READ, True, proc.Id)

        If ReadProcessMemory(winhandle, address, floatvalueinmemory, 4, 0) = 0 Then
            Dim lastError As Integer
            lastError = Marshal.GetLastWin32Error()
            MessageBox.Show(CStr(lastError))
            MsgBox("aww")
        Else
            MsgBox("woo")
        End If

        CloseHandle(winhandle)
    End If
Next

이제 핸들이 유효하고 프로세스 메모리를 읽으려고 시도하지만 오류 메시지가 표시됩니다.

이 문제를 해결하기 위해 어떻게 진행 해야하는지에 대한 아이디어가 있습니까?

메시지 299 : ReadProcessMemory 또는 WriteProcessMemory 요청의 일부만 완료되면 읽은 메모리가 보호되었음을 의미합니다.

모든 도움에 감사드립니다. Arul의 답변을 답으로 표시하겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top