-1

私は使用しています: ProcessMemoryReaderLib.dll は、それを私のプロジェクトに参照しました。これはform1コードです:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using ProcessMemoryReaderLib;
using System.IO;

namespace ProcessMemory
{
    public partial class Form1 : Form
    {
        ProcessMemoryReader pReader;
        int store;
        IntPtr score_addr;
        byte[] write;

        public Form1()
        {
            InitializeComponent();

            for (int i = 0 ; i < 2; i++)
            {
            store = 0;
            pReader = new ProcessMemoryReader(); //create a new writer - reader
            Process[] hProcessSnap; //create an array containing all running processes
            Process hProcess = null;
            hProcessSnap = Process.GetProcesses(); //Load all processes in the array

            // The address
            score_addr = (IntPtr)00000005;//(IntPtr)0x1007800;
            write = new byte[4];
            write = BitConverter.GetBytes(0);

            for (int n = 0; n < hProcessSnap.Length; n++)
            {
                // ProcessName is not Unique, there could be many matching processes
                //   and this loop will only return the last one.
                if (hProcessSnap[n].ProcessName == "FlashPlayerPlugin_11_8_800_168")
                    hProcess = hProcessSnap[n];

            }

            pReader.ReadProcess = hProcess;
            pReader.OpenProcess();

                }


        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            pReader.WriteProcessMemory(score_addr, write, out store);
        }
    }
}

独自の for ループを追加しました。一般的な考え方は、メモリ内の特定のプロセスで特定の値を見つけることです。例: score_addr = (IntPtr)00000005;
00000005 = 16 進数で 5

今、私はこの値を持つ特定のプロセス メモリ内のメモリ内の多くの場所を見つけました。今、私はプロセスに行きます いくつかの変更を行う内部で何かを変更します プロセスはプログラムであるため、5だった場合は必要な値を変更します 今は4です

だから今、私はプロセスメモリで値4を検索します.5だったので、今は4です。結果は非常に狭いはずです.

ここで、この 3 ~ 4 個のアドレスを取得して、それぞれの値を 8 に変更します。プログラム (プロセス) を見ると、値が 8 に変更されていることがわかります。

  1. プロセス名のメモリをスキャンします。
  2. プロセス メモリ内のすべての場所/アドレスを特定の値 (例: 5) で見つけます。
  3. プロセス/プログラムの変更に移動して、値 5 が 4 になるようにします。
  4. 値 4 のメモリ内の最後の場所から再度スキャンし、値 4 のすべての場所/アドレスを見つけます。
  5. 値 4 のすべての結果を変更すると、各メモリ アドレスの値がたとえば値 8 に変更されます。
  6. 値 4 の結果が 8 に変更された正確な場所に書き戻します。

したがって、今自分のプロセスを見ると、値 8 が表示されます。

どうすればできますか?

4

1 に答える 1

0

私もかつて似たようなことをしていて、その方法を理解しようとしてい2. Search for a valueました。私はまだそれを作っていないので、答えは不完全であることに注意してください。

以下の方法でメモリ(特定のアドレスを指定)にアクセスします。

public int GetInteger(int memoryAddress, uint bytes) {
    int bytesRead;
    byte[] memoryValue;
    if(bytes == 1) {
        #region single byte
        byte[] temp = pReader.ReadProcessMemory((IntPtr)memoryAddress, bytes, out bytesRead);
        memoryValue = new byte[4];
        memoryValue[0] = temp[0];
        memoryValue[1] = memoryValue[2] = memoryValue[3] = 0;
        // little endian
        #endregion
    } else if(bytes == 2) {
        #region two bytes
        byte[] temp = pReader.ReadProcessMemory((IntPtr)memoryAddress, bytes, out bytesRead);
        memoryValue = new byte[4];
        memoryValue[0] = temp[0];
        memoryValue[1] = temp[1];
        memoryValue[2] = memoryValue[3] = 0;
        #endregion
    } else if(bytes == 3) {
        #region three bytes
        byte[] temp = pReader.ReadProcessMemory((IntPtr)memoryAddress, bytes, out bytesRead);
        memoryValue = new byte[4];
        memoryValue[0] = temp[0];
        memoryValue[1] = temp[1];
        memoryValue[2] = temp[2];
        memoryValue[3] = 0;
        #endregion
    } else if(bytes == 4) {
        memoryValue = pReader.ReadProcessMemory((IntPtr)memoryAddress, bytes, out bytesRead);
    } else {
        // do more if you have to deal with values like eight-byte values.
    }
    int result = BitConverter.ToInt32(memoryValue, 0);
    if(result < 0) {
        throw new OverflowException(result + "(possible overflow)");
    }
    return result;
}

public string GetString(int memoryAddress, uint bytes) {
    int bytesRead;
    byte[] memoryValue = pReader.ReadProcessMemory((IntPtr)memoryAddress, bytes, out bytesRead);
    Encoding encoding = Encoding.Default;
    string result = encoding.GetString(memoryValue, 0, (int)bytes);
    result = result.TrimEnd('\0');
    return result;
}

public void SetInteger(int memoryAddress, int value, uint bytes) {
    byte[] temp = new byte[bytes];
    for(int i = 0; i < bytes; i++) {
        temp[i] = 0;
    }
    byte[] byteValue = BitConverter.GetBytes(value);
    pReader.WriteProcessMemory((IntPtr)memoryAddress, byteValue, bytes);
}

public void SetString(int memoryAddress, string value, uint bytes) {
    byte[] byteValue = new byte[bytes];
    for(int i = 0; i < bytes; i++) {
        byteValue[i] = 0;
    }
    Encoding encoding = Encoding.Default;
    byteValue = encoding.GetBytes(value);
    pReader.WriteProcessMemory((IntPtr)memoryAddress, byteValue, bytes);
}

アクセスしたいアドレスがすべてわかっている場合は、これで十分です。

このようなもので値を検索しようとしました

// NEVER DO THAT.
List<int> candidates = new List<int>();
for(int i = 0; i < Int32.MaxValue; i++) {
    //if you don't know the byte size of the searchee, it gets even worse. :s
    //for(int bytes = 1; j < 4; j++)
    if(GetInteger(i, bytes) == THE_VALUE_TO_SEARCH_FOR) {
        candidates.Add(i);
    }
}

そして、私のPCが爆発しました。(いいえ = D)

何か他のものを見つけて、もしあれば共有してください。

于 2014-01-04T02:07:29.373 に答える