C# 操纵程序内存。(记忆黑客)
嗯,我最近在C#中创建了一个程序,它可以改变程序的内存,它可以工作,但是每次我关闭程序并重新打开它时,我都必须再次查找内存值,有什么方法可以防止程序在关闭后内存发生变化C# 操纵程序内存。(记忆黑客),c#,memory,C#,Memory,嗯,我最近在C#中创建了一个程序,它可以改变程序的内存,它可以工作,但是每次我关闭程序并重新打开它时,我都必须再次查找内存值,有什么方法可以防止程序在关闭后内存发生变化 public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("kernel32.dll")] static extern IntPtr OpenProc
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!";
}
}
}
您无法估计或决定程序运行时将加载到哪里。OS决定了这一点,但我认为您可以在运行时动态找到进程的内存位置,而无需对应用程序进行硬编码
您是否尝试了ReadProcessMemory?您无法估计或决定程序运行时将加载到哪里。OS决定了这一点,但我认为您可以在运行时动态找到进程的内存位置,而无需对应用程序进行硬编码
你试过ReadProcessMemory吗?是的,作弊是很难做到的,而金农更容易作弊。最有可能的情况是,您需要在每次程序重新启动后扫描其他进程,以查找要更新的值/模式,因为内存布局很有可能发生更改,尤其是在Win7上 在过去的好时光里,人们只会更新可执行文件本身。。。在读了印刷杂志上的一些文章之后
如今,使用所有JIT、压缩/编码的可执行文件和脚本,甚至远程加载模块/SWF,难度要大得多。所以,把欺骗归咎于互联网需要付出更多的努力 是的,欺骗是一件很难的事,金农更容易赚钱。最有可能的情况是,您需要在每次程序重新启动后扫描其他进程,以查找要更新的值/模式,因为内存布局很有可能发生更改,尤其是在Win7上 在过去的好时光里,人们只会更新可执行文件本身。。。在读了印刷杂志上的一些文章之后 如今,使用所有JIT、压缩/编码的可执行文件和脚本,甚至远程加载模块/SWF,难度要大得多。所以,把欺骗归咎于互联网需要付出更多的努力