私は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"
関数には "0x40000" の形式の baseaddress パラメータが必要です。だから私はこれをしました:
string BaseAddress = "0x" + Addr.ToHex(Base); // addr.ToHex is just another function which converts the int to hex.
ここで、変数を2番目のパラメーターに渡したいと思い、ReadPointerInteger's
これを試しました:
int Readpointer = Trainer.ReadPointerInteger("runningprocess", BaseAddress, new int[3] { 0x3, 0x4, 0x10 });
string converted = Readpointer.ToString();
label2.Text = converted;
これは機能するはずですが、問題 (エラー) は、「Trainer」関数の 2 番目のパラメーターが 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;
}