标签: readprocessmemory

你如何直接从物理内存中读取?

在C或C++(windows)中,如何通过提供物理(非虚拟)地址来读取RAM?这意味着无需通过虚拟内存系统(mmu表),并且特定于一个进程.

我已经知道API ReadProcessMemory,它从ram中读取(由大多数培训师使用),但它仅适用于特定的过程.

我在MSDN上搜索并发现Device\PhysicalMemory似乎提供了这种可能性,但我发现没有实际的例子,这个功能似乎已被Windows服务包关闭(以修复某些漏洞).

我知道这是可能的,因为WinHex会这样做(如果你选择"工具">"打开ram">"物理内存").然后它将显示RAM内容从0x00000000到your_ram_size,就像打开传统文件一样.它需要管理员权限,但没有安装驱动程序(这意味着WinHex从用户模式执行).

编辑:添加有关操作系统的信息.

c c++ memory windows readprocessmemory

23
推荐指数
4
解决办法
2万
查看次数

TBBUTTON结构不能与SendMessage一起使用

我正在尝试发送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)

.net vb.net winapi marshalling readprocessmemory

10
推荐指数
1
解决办法
802
查看次数

如何编写Perl,Python或Ruby程序来改变Windows上另一个进程的内存?

我想知道是否可以使用Perl,Python或Ruby来编写程序,以便它在另一个进程的内存中查找0x12345678(可能是堆,对于数据和代码数据)然后如果找到它,则更改它到0x00000000?它类似于Cheat Engine,可以在Windows上执行类似的操作.

ruby python perl winapi readprocessmemory

8
推荐指数
3
解决办法
4288
查看次数

带有ctypes的ReadProcessMemory

我在一个小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)

python winapi ctypes readprocessmemory

8
推荐指数
1
解决办法
1万
查看次数

C#ReadProcessMemory:如何读取64位内存地址?

我正在阅读应用程序内存.我正在使用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)

c# 64-bit readprocessmemory

6
推荐指数
1
解决办法
1万
查看次数

读取所有进程内存以查找字符串变量C#的地址

我有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)

c# readprocessmemory memory-address

6
推荐指数
1
解决办法
245
查看次数

Ruby中的Read/WriteProcessMemory

我一直在尝试在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)

ruby winapi ffi readprocessmemory

5
推荐指数
1
解决办法
992
查看次数

将函数从C++转换为C#

可以将以下代码段转换为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,它具有预定义的参数,当然这些参数不是通用的.

c# c++ generics readprocessmemory

5
推荐指数
1
解决办法
117
查看次数

Android 如何使用 WinAPI 之类的进程和内存

在 WinAPI 中,我可以通过 OpenProcess、VirtualQueryEx、ReadProcessMemory、WriteProcessMemory 轻松地与几乎所有进程交互。它们在 MSDN 中有很好的描述并且易于使用。

请告诉我如何与 Android 中的进程交互...如何获取进程内存映射,即所有区域及其属性和基地址...以及如何正确打开另一个进程/读取另一个进程内存...是否Android SDK 具有所需的功能或任何低级编程...

在 Android 中获取正在运行的进程列表不是问题,但我坚持打开进程......

java android process readprocessmemory

5
推荐指数
0
解决办法
355
查看次数

读进程的进程内存不会返回所有内容

我正在尝试扫描第三方应用程序的内存.我已经找到了地址; 现在是0x0643FB78.关键是,我永远不能爬上去,因为LPMODULEENTRY32->modBaseAddr0x00400000LPMODULEENTRY32->modBaseSize只是0x006FF000,这样我可以扫描此模块的最大地址0x00AFF000.

这是否意味着我寻求的地址确实存在于另一个进程/模块/线程/东西中?我相信我的过程确实包含了地址.那我该如何访问内存呢?谢谢.

c++ memory windows winapi readprocessmemory

4
推荐指数
1
解决办法
4059
查看次数