0

最近、プログラムのメモリを変更するプログラムを C# で作成しましたが、動作しますが、プログラムを閉じて再度開くたびに、もう一度メモリ値を見つけなければなりません。できる方法はありますか?プログラムを閉じた後、プログラムのメモリが変更されないようにしますか?

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);

    [DllImport("kernel32.dll")]
    public static extern Int32 CloseHandle(IntPtr hProcess);

    [Flags]
    public enum ProcessAccessFlags : uint
    {
        All = 0x001F0FFF,
        Terminate = 0x00000001,
        CreateThread = 0x00000002,
        VMOperation = 0x00000008,
        VMRead = 0x00000010,
        VMWrite = 0x00000020,
        DupHandle = 0x00000040,
        SetInformation = 0x00000200,
        QueryInformation = 0x00000400,
        Synchronize = 0x00100000
    }

    public static void WriteMem(Process p, int address, long v)
    {
        var hProc = OpenProcess(ProcessAccessFlags.All, false, (int)p.Id);
        var val = new byte[] { (byte)v };

        int wtf = 0;
        WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32)val.LongLength, out wtf);

        CloseHandle(hProc);
    }

    private void notify(string not)
    {
        if (textBox1.Text != "")
        {
            textBox1.Text += Environment.NewLine;
        }

        textBox1.Text += not;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var p = Process.GetProcessesByName("SAFlashPlayer").FirstOrDefault();
        WriteMem(p, 0x07A6A0C1, 1000);
        notify("A lot of Ability Points added.");
    }
    private void button2_Click(object sender, EventArgs e)
    {
        var p = Process.GetProcessesByName("SAFlashPlayer").FirstOrDefault();
        //WriteMem(p, 0x008373CC, 0);
        notify("Power set to 0.");
    }

    private void Checker_Tick(object sender, EventArgs e)
    {
        Process[] pname = Process.GetProcessesByName("SAFlashPlayer");

        if (pname.Length == 0)
        {
            button1.Enabled = false;
            button2.Enabled = false;
            status.ForeColor = System.Drawing.Color.Red;
            status.Text = "Flash Player not running!";
        }
        else
        {
            button1.Enabled = true;
            button2.Enabled = true;
            status.ForeColor = System.Drawing.Color.Green;
            status.Text = "Flash Player running!";
        }
    }
}

4

2 に答える 2

3

実行時にプログラムがロードされる場所を見積もったり、決定したりすることはできません。OSはそれを決定しますが、アプリケーションにハードコーディングしなくても、実行時にプロセスのメモリ位置を動的に見つけることができると思います。

ReadProcessMemory WinAPI 呼び出しを試しましたか?

于 2012-04-21T06:17:01.050 に答える
1

はい、不正行為は難しいです-金の農民に支払う方が簡単です. 特にWin7では、メモリレイアウトが変更される可能性が高いため、プログラムを再起動するたびに更新する値/パターンについて他のプロセスをスキャンする必要がある可能性が最も高くなります。

古き良き時代、人々は実行可能ファイル自体を更新するだけでした...印刷された雑誌の記事を読んだ後...

今日では、すべての JIT、ASLR、圧縮/エンコードされた実行可能ファイルとスクリプト、またはリモートでロードされたモジュール/SWF でさえ、はるかに困難です。したがって、チートするときにもっと努力する必要があるとインターネットを非難してください。

于 2012-04-21T06:36:57.687 に答える