- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
你好我正在使用 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&)
最佳答案
当您调用 Windows API 函数时,您必须自己实现错误检查代码。当出现问题时,它们不会像标准 .NET Framework 函数那样抛出异常。
所需的具体错误检查因功能而异。 (像这样的不一致正是 .NET 使用异常的原因。)检查文档是必不可少的。
WriteProcessMemory
以一种相当常见的方式工作。返回值是 BOOL
(Win32 库将其视为 bool 值的整数,其中 0 = FALSE 和 1 = TRUE)。如果函数失败,则返回值为 0 (FALSE)。如果成功,返回值为 1 (TRUE):
If the function succeeds, the return value is nonzero.
If the function fails, the return value is 0 (zero). To get extended error information, call
GetLastError
. The function fails if the requested write operation crosses into an area of the process that is inaccessible.
当然,这里有趣的部分是我们被告知必须调用 GetLastError
函数才能确定函数失败的原因。部分是真的。 You only call GetLastError
when you're writing unmanaged C++ code .在 .NET 中,您需要做一些其他事情。有两个步骤:
SetLastError = True
标记 P/Invoke 签名,这会导致 CLR 自动调用 GetLastError
并保存其值。Marshal.GetLastWin32Error
检索该值。因此,要对其进行调试,您需要像这样重写代码(使用标准的 P/Invoke 语法,而不是 VB 独有的更受限制的 Declare
关键字。网):
<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
知道错误代码后,您可以在 list of System Error Codes 中查找它看看它是什么意思。
原来错误是编号 299,ERROR_PARTIAL_COPY
,文档说这意味着:
Only part of a ReadProcessMemory or WriteProcessMemory request was completed.
嗯,不是很有帮助...我希望你能得到更好的东西。 C'est la vie。
您将需要掌握一些额外的知识才能解决该问题。文档中再次给出了提示。任何时候它说参数是一个“指针”(在 C++ 语法中用星号 *
表示),这意味着在 VB.NET 中,它需要被传递作为引用,而不是作为值。要指定某些内容作为引用传递,请使用 ByRef
关键字。当然,要按值传递,您需要指定默认的 ByVal
关键字。
此外,请注意,当文档说某物是句柄 或地址 时,您应该在VB.NET 中将其声明为IntPtr
type。 , 而不是整数。 IntPtr
是特殊的,因为它的大小会发生变化,具体取决于底层操作系统是 32 位还是 64 位(不同于整数,整数是固定大小,无论您在什么平台上运行).即使这不会导致您的直接问题,但它会在您编译 64 位代码时导致兼容性问题。
所以事实证明你的声明实际上是错误的。像这样重新声明它:
<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
您可能还认为第三个参数 (lpBuffer
) 应该是一个字节数组 (Byte()
),因为它指定要写入的数据地址空间。
关于.net - vb 2008 WriteProcessMemory() 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001371/
这个问题已经存在: SIGSEV at while loop [closed] 已关闭 7 年前。 我的问题如下。我有 2 个函数,一个调用 WriteProcessMemory 并返回其结果,另一个
只是粘贴了必要的内容,即使我的日志显示 WriteProcessMemory() 成功,内存地址也没有被写入。另外,我已经仔细检查了我是否也有正确的内存地址。谢谢你的帮助。 char* offsets
所以我的程序基本上是在其他进程中搜索“指定的字符串” 内存,然后输出包含这些字符串的内存地址, 但我希望能够做一个 WriteProcessmemory 来替换所有这些 地址。 我只需要拥有所有返回的
我想用 int WriteProcessMemory 并再次执行此操作,使 int 成为负数。我知道如何在 VB.NET 中执行此操作;我试过同样的方法,但在 C++ 中,它不起作用。 WriteP
如何使用 WriteProcessMemory 更改当前弹药地址的弹药?我知道怎么读,只是不知道怎么写。是 SetAmmo 。我以为我做的一切都是正确的? 代码: #include #include
我有一个现有程序需要通过 IPC 进行通信。我可以修改它的一小部分,但不能添加任何花哨的解决方案,如共享内存、管道或套接字。所以我想与直接读取/写入程序地址空间的函数进行通信: process_vm_
我正在尝试使用 Qt 和 QtCreator 来写入进程内存。当我按下按钮时,它不写。如果有人可以提供帮助,这是我正在使用的代码。 #include "mainwindow.h" #include "
我需要一些帮助,我正在编写一个 dll,它可以修改应用程序中的某些值。但如果我卡住值应用程序崩溃(一段时间后停止工作)。 这是我的代码:这里我创建了一个更新地址的线程: CreateThread(ni
在内存中写入,以便在运行时用另一个类 (TEdit) 替换一个类 (TMyEdit) const vmtNewInstance = System.vmtNewInstance; var ACl
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我正在使用“CreateRemoteThread & WriteProcessMemory”技术将我的 dll 注入(inject)另一个进程。我的代码在 Windows 7,8 上运行良好,但是 W
我正在尝试读取另一个进程拥有的 Win32 ListView 中的数据。不幸的是,我的 WriteProcessMemory() 调用失败并出现错误“此系统不支持此功能”。当我在 VirtualAll
我想知道,如果 WriteProcessMemory 或 ReadProcessMemory 函数访问程序代码或数据。谢谢。 最佳答案 它可以访问两者。 程序文本和数据存在于相同的地址空间中,并且对于
我正在尝试写入另一个进程的内存,我以 38h(VM_OPERATION、VM_READ、VM_WRITE)权限打开它,然后我以 4h(PAGE_READWRITE)权限使用 VirtualProtec
标题几乎概括了它。我刚刚发现了这个功能,好吧,它的存在让我很惊讶,因为我立即想到了可能的安全后果。 为什么会有这样的功能?我知道调试这样的东西或多或少是必要的,但允许它用于所有进程似乎是一个很大的安全
由于这些 API,它在用户模式下简单明了。 如何从 Windows 内核模块读取/写入指定进程的用户空间内存? 驱动目标平台是windows xp/2003 最佳答案 使用 NtWriteVirtua
从另一个进程调用WriteProcessMemory时,调用当前进程中的哪个函数? 最佳答案 当前进程中没有处理WriteProcessMemory。它发生在操作系统内部——它将外部进程映射到当前进程
我想写一点 AntiHack,但其中一部分有问题。这个想法是通过从 NTDLL.DLL 中 Hook LdrLoadDll 来防止 dll 注入(inject)。我通过谷歌搜索找到了一个可以执行此操作
我知道有很多关于此的问题,但似乎没有一个能解决我的问题。 我正在研究 WriteProcessMemory 函数。一切看起来都很简单,但我在这里遇到了一个问题,似乎找不到解决方案。 我有什么: 1)“
我正在尝试编写一个简单的代码来使用 WPM 将程序中的字符串替换为另一个字符串,我能够使其工作,但只能部分工作。这是我用来获取结果的代码的一部分。 string strWrite; cin >> st
我是一名优秀的程序员,十分优秀!