2012-04-21 6 views
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!"; 
     } 
    } 
} 

答えて

1

はい、不正行為は金の農家を犠牲にすることは容易です。 Win7ではメモリレイアウトが変更される可能性が高いので、プログラムを再起動するたびに更新する値/パターンの他のプロセスをスキャンする必要があります。ただ、印刷雑誌にいくつかの記事を読んだ後に実行可能ファイル自体を...更新してしまう古き良き時代の人々に

...すべてのJITと

Nowdays、ASLR、圧縮/エンコードexecutatblesやスクリプト、あるいは遠隔ロードされたモジュール/ SWFははるかに難しいです。だから、インターネットを責めることは、より多くの努力をする必要があります。

3

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

ReadProcessMemory WinAPI callを試しましたか?