Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net vb 2008 WriteProcessMemory()返回0_.net_Windows_Vb.net_Winapi_Process - Fatal编程技术网

.net vb 2008 WriteProcessMemory()返回0

.net vb 2008 WriteProcessMemory()返回0,.net,windows,vb.net,winapi,process,.net,Windows,Vb.net,Winapi,Process,你好 我正在使用vb 2008以下是我的部分代码: Private Declare Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" ( _ ByVal hProcess As Integer, _ ByVal lpBaseAddress As Integer, _ ByVal lpBuffer As Integer, _ ByVal nSize As Int

你好 我正在使用vb 2008以下是我的部分代码:

Private Declare Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" ( _
      ByVal hProcess As Integer, _
      ByVal lpBaseAddress As Integer, _
      ByVal lpBuffer As Integer, _
      ByVal nSize As Integer, _
      ByVal lpNumberOfBytesWritten As Integer _
   ) As Integer

    Dim proc() As Process = Process.GetProcessesByName("process")
    If proc.Length = 0 Then Console.WriteLine("Process Not Found") : Exit Sub
    Dim p = proc(0)
    Dim pH As Integer = OpenProcess(PROCESS_ALL_ACCESS, 0, p.Id)
    Dim address As Integer
    address = &H98544
    Dim memory As IntPtr
    Call ReadProcessMemory(pH, address, memory, 4, 0)
    Console.WriteLine(memory.ToString)
    Dim data As Integer = 2000
    Call WriteProcessMemory(pH, address, data, Len(data), 0&)
但是,WriteProcessMemory()返回0,并且值不变

解决方案:

<DllImport("kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function WriteProcessMemory( _
                                      ByVal hProcess As IntPtr, _
                                      ByVal lpBaseAddress As IntPtr, _
                                      ByVal lpBuffer As Byte(), _
                                      ByVal nSize As UInt32, _
                                      ByRef lpNumberOfBytesWritten As UInt32 _
                                      ) As Boolean
End Function

        Dim proc() As Process = Process.GetProcessesByName("process")
        If proc.Length = 0 Then Console.WriteLine("Process Not Found") : Exit Sub
        Dim p = proc(0)
        Dim pH As Integer = OpenProcess(PROCESS_ALL_ACCESS, 0, p.Id)
        Dim address As Integer
        address = &H98544
        Dim memory As IntPtr
        Call ReadProcessMemory(pH, address, memory, 4, 0)
        Console.WriteLine(memory.ToString)
        Dim data() As Byte = BitConverter.GetBytes(2000)
        Call WriteProcessMemory(pH, address, data, 4, 0&)
_
专用共享函数WriteProcessMemory(_
ByVal HPROSS作为IntPtr_
ByVal lpBaseAddress作为IntPtr_
ByVal lpBuffer作为字节()_
ByVal nSize为UInt32_
ByRef LPNumberOfBytes写入UInt32_
)作为布尔值
端函数
Dim proc()作为Process=Process.getProcessByName(“进程”)
如果进程长度=0,则Console.WriteLine(“未找到进程”):退出子进程
尺寸p=proc(0)
Dim pH作为整数=OpenProcess(进程\u所有\u访问,0,p.Id)
作为整数的Dim地址
地址=&H98544
作为IntPtr的Dim内存
调用ReadProcessMemory(pH、地址、内存、4、0)
Console.WriteLine(memory.ToString)
Dim data()作为字节=位转换器.GetBytes(2000)
调用WriteProcessMemory(pH、地址、数据、4、0&)
国家:

如果函数失败,则返回 值为0(零)。延长 错误信息,请调用GetLastError。 如果所请求的 写入操作穿过一个区域 无法访问的进程的

我建议你照上面说的去做,找出失败的原因

说到这里,失败的原因似乎是您试图写入的地址2000在该过程中不是有效地址


lpBuffer
参数是一个指针,您要传递整数值2000作为该参数。因此,这被解释为内存地址。我怀疑您实际上打算传递
数据的地址

当您调用Windows API函数时,您必须自己实现错误检查代码。当标准.NET Framework函数出现问题时,它们不会抛出异常

所需的特定错误检查因功能而异。(这种不一致性正是.NET使用异常的原因。)检查文档是必不可少的

以一种相当普遍的方式工作。返回值是一个
BOOL
(Win32库将其视为布尔值的整数,其中0=FALSE,1=TRUE)。如果函数失败,则返回值为0(FALSE)。如果成功,则返回值为1(TRUE):

如果函数成功,则返回值为非零

如果函数失败,则返回值为0(零)。要获取扩展错误信息,请调用
GetLastError
。如果请求的写入操作跨入进程中不可访问的区域,该函数将失败

当然,有趣的是,我们被告知必须调用
GetLastError
函数来确定函数失败的原因。有一部分是真的。在.NET中,您需要做一些其他的事情。有两个步骤:

  • SetLastError=True
    标记P/Invoke签名,这会导致CLR自动调用
    GetLastError
    并保存其值
  • 调用以检索该值
  • 因此,要调试它,您需要像这样重新编写代码(使用标准的p/Invoke语法,而不是VB.NET特有的更有限的
    Declare
    关键字):


    您还可以考虑第三个参数(<代码> LP缓冲器< /代码>)应该是一个字节数组(<代码>字节()>代码>),因为它指定要写入地址空间的数据。

    它显示“299”错误(系统错误代码(0~499)),但仍然无法理解问题出在哪里。@John:299是
    错误\u部分\u复制
    :ReadProcessMemory或WriteProcessMemory请求只完成了一部分。结果证明这不是很有帮助。我想它会告诉你更好的事情。让我用修正来编辑我的答案。我用解决方案更新了我的问题,谢谢你的帮助。提前道歉-这本身不是一个答案,但可能更多的是一个提示。我自己也开始使用这个函数&我怀疑我们遇到的问题与令牌特权有关。
    <DllImport("kernel32", CharSet:=CharSet.Auto, SetLastError:=True)>
    Private Shared Function WriteProcessMemory(
                                               ByVal hProcess As Integer, _
                                               ByVal lpBaseAddress As Integer, _
                                               ByVal lpBuffer As Integer, _
                                               ByVal nSize As Integer, _
                                               ByVal lpNumberOfBytesWritten As Integer _
                                              ) As Integer
    End Function
    
    Dim proc() As Process = Process.GetProcessesByName("process")
    If proc.Length = 0 Then Console.WriteLine("Process Not Found") : Exit Sub
    Dim p = proc(0)
    Dim pH As Integer = OpenProcess(PROCESS_ALL_ACCESS, 0, p.Id)
    Dim address As Integer
    address = &H98544
    Dim memory As IntPtr
    Call ReadProcessMemory(pH, address, memory, 4, 0)
    Console.WriteLine(memory.ToString)
    Dim data As Integer = 2000
    If WriteProcessMemory(pH, address, data, Len(data), 0&) = 0 Then
       ' The function failed, so find out what the error was
       MessageBox.Show("WriteProcessMemory failed with error " & Marshal.GetLastWin32Error)
    End If
    
    <DllImport("kernel32", CharSet:=CharSet.Auto, SetLastError:=True)>
    Private Shared Function WriteProcessMemory(
                                               ByVal hProcess As IntPtr, _
                                               ByVal lpBaseAddress As IntPtr, _
                                               ByVal lpBuffer As Integer, _
                                               ByVal nSize As Integer, _
                                               ByRef lpNumberOfBytesWritten As Integer _
                                              ) As Integer
    End Function