【发布时间】:2014-10-16 18:32:41
【问题描述】:
我不是代码编写和 C# 编程方面的专家。 我编写了一个简单的应用程序,使用 ZeraPain 脚本 ReadProcessMemory() 从进程内存中读取。 使用 4 字节和 8 字节的值效果很好。 这个应用程序的另一个功能是可以读取字符串,但我真的需要读取 Double 值,我在网上找不到任何东西。 有人可以帮助我吗? 这是应用程序的打印屏幕
这是课程(ZERAPAIN)
class Memory
{
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Boolean bInheritHandle, UInt32 dwProcessId);
[DllImport("kernel32.dll")]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
byte[] lpBuffer, UIntPtr nSize, uint lpNumberOfBytesWritten);
IntPtr Handle;
public Memory(string sprocess)
{
try
{
Process[] Processes = Process.GetProcessesByName(sprocess);
Process nProcess = Processes[0];
Handle = OpenProcess(0x10, false, (uint)nProcess.Id);
}
catch
{
//do nothing
}
}
public string ReadString(uint pointer, Int32 bts)
{
byte[] bytes = new byte[bts];
ReadProcessMemory(Handle, (IntPtr)pointer, bytes, (UIntPtr)24, 0);
return Encoding.UTF8.GetString(bytes);
}
public int ReadPointer(uint pointer, Int32 bts)
{
byte[] bytes = new byte[bts];
ReadProcessMemory(Handle, (IntPtr)pointer, bytes, (UIntPtr)sizeof(int), 0);
return BitConverter.ToInt32(bytes, 0);
}
}
这是脚本
private void timer1_Tick(object sender, EventArgs e)
{
try
{
Memory mem = new Memory(processnameTB.Text);
uint address = Convert.ToUInt32(AddressTB.Text, 16);
if (checkBox1.Checked == true)
{
try
{
int byt = Convert.ToInt32(bytesnumberTB.Text);
string str = mem.ReadString(address, byt);
stringvalue.Text = str;
}
catch
{
timer1.Enabled = false;
}
}
if (checkBox2.Checked == true)
{
try
{
int byt = Convert.ToInt32(bytesnumberTB.Text);
double pointer = mem.ReadPointer(address,byt);
pointervalue.Text = pointer.ToString();
}
catch
{
timer1.Enabled = false;
}
}
}
catch (Exception ex)
{
timer1.Enabled = false;
MessageBox.Show(ex.Message, "Error");
}
}
【问题讨论】:
-
是什么让您认为您的应用程序的打印屏幕对这里的任何人都有用?大声笑
-
好的,我现在发布代码......