我正在使用一个readprocessmemory
类,并且可以通过多级指针读取并在label2.text中的最终地址显示整数。
这适用于我指定基址的地方(显示为" 0x40000"下面):
private void label2_Click(object sender, EventArgs e)
{
int Readpointer = Trainer.ReadPointerInteger("runningprocess", 0x40000, new int[3] { 0x3, 0x4, 0x10 });
string converted = Readpointer.ToString();
label2.Text = converted;
现在我没有指定基地地址" 40000",而是想使用一个功能来查找'进程的基地址并将其存储在变量中,并将其作为参数传递。这是第一部分:
Process[] test = Process.GetProcessesByName("runningprocess"); //Get process base address
int Base = test[0].MainModule.BaseAddress.ToInt32(); // ""
不幸的是,"Trainer.ReadPointerInteger"
函数需要#ad; 0x40000"形式的baseaddress参数。所以我这样做了:
string BaseAddress = "0x" + Addr.ToHex(Base); // addr.ToHex is just another function which converts the int to hex.
现在,我想将变量传递给ReadPointerInteger's
秒参数,我尝试了这个:
int Readpointer = Trainer.ReadPointerInteger("runningprocess", BaseAddress, new int[3] { 0x3, 0x4, 0x10 });
string converted = Readpointer.ToString();
label2.Text = converted;
看起来这应该有用,但问题(错误)是'培训师'的第二个参数。函数是一个Int,对我的新手来说很奇怪,因为我输入参数包含字母作为Int是不直观的。无论如何,我被困在这里,并想知道是否有人可以指出如何绕过Int / String问题?
仅供参考,ReadPointerInteger
类是:
public static int ReadPointerInteger(string EXENAME, int Pointer, int[] Offset)
{
int Value = 0;
checked
{
try
{
Process[] Proc = Process.GetProcessesByName(EXENAME);
if (Proc.Length != 0)
{
int Bytes = 0;
int Handle = OpenProcess(PROCESS_ALL_ACCESS, 0, Proc[0].Id);
if (Handle != 0)
{
foreach (int i in Offset)
{
ReadProcessMemoryInteger((int)Handle, Pointer, ref Pointer, 4, ref Bytes);
Pointer += i;
}
ReadProcessMemoryInteger((int)Handle, Pointer, ref Value, 4, ref Bytes);
CloseHandle(Handle);
}
}
}
catch
{ }
}
return Value;
}
答案 0 :(得分:2)
0x40000只是整数262144的另一个名称。它不是一个带有“0x”的字符串,它是写整数的替代语法,用于基数16比基数10更具启发性时使用。特别是,以下不能是真的:
“Trainer.ReadPointerInteger”函数需要“0x40000”形式的baseaddress参数。
只是地址通常用十六进制写。