在C或C++(windows)中,如何通过提供物理(非虚拟)地址来读取RAM?这意味着无需通过虚拟内存系统(mmu表),并且特定于一个进程.
我已经知道API ReadProcessMemory,它从ram中读取(由大多数培训师使用),但它仅适用于特定的过程.
我在MSDN上搜索并发现Device\PhysicalMemory似乎提供了这种可能性,但我发现没有实际的例子,这个功能似乎已被Windows服务包关闭(以修复某些漏洞).
我知道这是可能的,因为WinHex会这样做(如果你选择"工具">"打开ram">"物理内存").然后它将显示RAM内容从0x00000000到your_ram_size,就像打开传统文件一样.它需要管理员权限,但没有安装驱动程序(这意味着WinHex从用户模式执行).
编辑:添加有关操作系统的信息.
我正在尝试发送TB_GETBUTTON消息以获取有关此工具栏控件中用红色标记的按钮的信息:
(系统托盘通知区域)
问题是,当我发送消息时,资源管理器会自我刷新,这非常烦人,因为所有桌面均会刷新,而且我使用的TBBUTTON结构定义没有得到正确的值,因此我测试了三种不同的定义,那些来自pinvoke.net的工会,以及@ David Heffernan 在这里发布的工会。
我正在64位Windows 10中运行以下代码,并在项目属性中设置了x64配置。
我该如何修复结构和更新系统的刷新?
这些是我正在使用的相关定义:
Const WM_USER As Integer = &H400
Const TB_BUTTONCOUNT As Integer = (WM_USER + 24)
Const TB_GETBUTTON As Integer = (WM_USER + 23)
' Toolbar values are defined in "CommCtrl.h" Windows SDK header files.
<StructLayout(LayoutKind.Sequential)>
Public Structure TBBUTTON64
Public iBitmap As Integer
Public idCommand As Integer
Public fsState As Byte
Public fsStyle As Byte
<MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst:=6)> ' 6 on x64 …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以使用Perl,Python或Ruby来编写程序,以便它在另一个进程的内存中查找0x12345678(可能是堆,对于数据和代码数据)然后如果找到它,则更改它到0x00000000?它类似于Cheat Engine,可以在Windows上执行类似的操作.
我在一个小solitär教练工作.我不知道为什么函数ReadProcessMemory不起作用.通常它返回False或True但在这种情况下没有.GetlastError()给了我Errorcode 6.
#-*- coding: cp1252 -*-
import ctypes, win32ui, win32process ,win32api
PROCESS_ALL_ACCESS = 0x1F0FFF
HWND = win32ui.FindWindow(None,"Solitär").GetSafeHwnd()
print(HWND)
PID = win32process.GetWindowThreadProcessId(HWND)[1]
print(PID)
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
rPM = ctypes.windll.kernel32.ReadProcessMemory
wPM = ctypes.windll.kernel32.WriteProcessMemory
ADDRESS1 = 0x00E97074
ADDRESS2 = ctypes.create_string_buffer(64)
pi = ctypes.pointer(ADDRESS2)
rPM(PROCESS,ADDRESS1,ADDRESS2,64,0)
print(ADDRESS2)
x=ctypes.windll.kernel32.GetLastError()
print(x)
Run Code Online (Sandbox Code Playgroud) 我正在阅读应用程序内存.我正在使用CheatEngine获取内存地址,然后尝试返回它的值.但是,CheatEngine似乎返回64位内存地址,所以我的ReadProcessMemory函数不断告诉我,每当我输入地址时它都不能将'long'转换为'int'.我发现的所有教程似乎都基于00AB5678的内存地址,但我得到的更像是D3569227FC.
所以我的问题是,如何将ReadProcessMemory与更大的内存地址一起使用?
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
const int PROCESS_WM_READ = 0x0010;
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess,
int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
static void Main(string[] args)
{
Process process = Process.GetProcessesByName("MyProgram")[0];
IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
int bytesRead = 0;
byte[] buffer = new byte[24]; //To …Run Code Online (Sandbox Code Playgroud) 我有2个用c#编写的程序,第一个程序名为“ ScanMe”,包含一个字符串变量,该字符串变量包含值“ FINDMEEEEEEEEE”,以及一个双精度变量,其值为1546.22915487。而另一个名为“ MemoryScan”的程序将读取第一个程序的所有内存。我想获取该进程的字符串变量的内存地址
当我执行“ MemoryScan”并读取“ ScanMe”进程的所有内存时,然后我尝试在扫描的所有数据中找到字符串的字节数组,但我什么也没得到。如果我尝试找到双精度型,我会得到特定的内存地址,而且我也可以更改其值,但是当我尝试使用字符串变量来做到这一点时,我无法做到,我什至无法获得该字符串变量的地址。
ScanMe和MemoryScan代码:
class Program
{
public static string FindMeString = "FINDMEEEEEEE";
public static double FindMeDouble = 1546.22915487;
static void Main(string[] args)
{
while (FindMeDouble == 1546.22915487)
{
System.Threading.Thread.Sleep(2000);
}
Console.WriteLine(FindMeDouble.ToString());
Console.ReadLine();
}
}
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace MemoryScan
{
class MemoryController
{
// REQUIRED CONSTS
const int PROCESS_QUERY_INFORMATION = 0x0400;
const int MEM_COMMIT = 0x00001000;
const int PAGE_READWRITE = 0x04;
const int PROCESS_WM_READ = 0x0010;
readonly Dictionary<IntPtr, byte[]> Regions = new …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在Ruby中读取和编写进程内存,希望将一些旧的C++程序转换为更动态的语言.但是我一直没有轻松过去.我已经做了一些阅读,但我找不到我的具体问题.我可能在下面有一些非常基本的错误,因为我不太确定指针管理在Ruby-ffi中是如何工作的.
无论如何,我目前已经ffi安装了gem并且已经使用它来获取功能.这就是我所拥有的:
module Memory
PROC_READ = 0x10
PROC_WRITE = 0x20
PROC_RW = PROC_READ | PROC_WRITE
extend FFI::Library
ffi_lib 'kernel32'
# HANDLE WINAPI OpenProcess(DWORD, BOOL, DWORD)
attach_function :open, :OpenProcess, [:uint, :bool, :uint], :pointer
# BOOL WINAPI CloseHandle(HANDLE)
attach_function :close, :CloseHandle, [:pointer], :bool
# BOOL WINAPI ReadProcessMemory(HANDLE, LPCVOID, out LPVOID, SIZE_T, out SIZE_T)
attach_function :read, :ReadProcessMemory, [:pointer, :pointer, :pointer, :int, :int], :bool
# BOOL WINAPI WriteProcessMemory(HANDLE, LPCVOID, LPVOID, SIZE_T, out SIZE_T)
attach_function :write, :WriteProcessMemory, [:pointer, :pointer, :pointer, :int, :int], :bool …Run Code Online (Sandbox Code Playgroud) 可以将以下代码段转换为C#.NET吗?
template <class cData>
cData Read(DWORD dwAddress)
{
cData cRead; //Generic Variable To Store Data
ReadProcessMemory(hProcess, (LPVOID)dwAddress, &cRead, sizeof(cData), NULL); //Win API - Reads Data At Specified Location
return cRead; //Returns Value At Specified dwAddress
}
Run Code Online (Sandbox Code Playgroud)
当你想用C++从内存中读取数据时,这非常有用,因为它是通用的:你可以在一个函数中使用Read<"int">(0x00)"或者Read<"vector">(0x00)全部使用它.
在C#.NET中,它对我不起作用,因为要读取内存,需要DLLImport ReadProcessMemory,它具有预定义的参数,当然这些参数不是通用的.
在 WinAPI 中,我可以通过 OpenProcess、VirtualQueryEx、ReadProcessMemory、WriteProcessMemory 轻松地与几乎所有进程交互。它们在 MSDN 中有很好的描述并且易于使用。
请告诉我如何与 Android 中的进程交互...如何获取进程内存映射,即所有区域及其属性和基地址...以及如何正确打开另一个进程/读取另一个进程内存...是否Android SDK 具有所需的功能或任何低级编程...
在 Android 中获取正在运行的进程列表不是问题,但我坚持打开进程......
我正在尝试扫描第三方应用程序的内存.我已经找到了地址; 现在是0x0643FB78.关键是,我永远不能爬上去,因为LPMODULEENTRY32->modBaseAddr是0x00400000和LPMODULEENTRY32->modBaseSize只是0x006FF000,这样我可以扫描此模块的最大地址0x00AFF000.
这是否意味着我寻求的地址确实存在于另一个进程/模块/线程/东西中?我相信我的过程确实包含了地址.那我该如何访问内存呢?谢谢.