1
私の問題は解決できません。どんな助けもありがたい。 割り当てられたメモリにjmpを作成します。 チートエンジンでメモリを割り当てて計算をチェックしても問題ありません。 原因チートエンジンは、より高い領域にメモリを割り当てます。 割り当てられたメモリは例えば0x870000であり、jmpを作成するアドレスは7FFDE65F5184です。コード洞窟で64bit jmpを計算する#
Console.WriteLine("toWrite: {0:x}", toWrite.ToInt64()); /*toWrite: 7FFDE65F5184*/
IntPtr allocation = VirtualAllocEx(openproc, IntPtr.Zero , 0x1024, AllocationType.Commit | AllocationType.Reserve, MemoryProtection.ExecuteReadWrite);
Console.WriteLine("allocation: {0:x}", allocation.ToInt64()); /* allocation: 870000*/
IntPtr jmp = new IntPtr((toWrite.ToInt64() - (allocation.ToInt64() + 5)));
byte[] bytes1 = BitConverter.GetBytes(jmp.ToInt64());
byte[] bytes2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, };
bytes2[0] = 233;
bytes2[1] = bytes1[0];
bytes2[2] = bytes1[1];
bytes2[3] = bytes1[2];
bytes2[4] = bytes1[3];
/*nops*/
bytes2[5] = 144;
bytes2[6] = 144;
bytes2[7] = 144;
bytes2[8] = 144;
UIntPtr written = new UIntPtr();
WriteProcessMemory(openproc, toWrite, bytes2, 9, out written);
結果の50%が正しいです。誰でも助けることができますか?
これは私の結果である:
7FFDE65F5184 - E9 77AE271A - jmp 7FFE00870000
なぜ7FFE00は私に必要なのjmpアドレスの前にあるのでしょうか? VirtualAllocExでIntPtr.Zero以外の値を選択した場合、戻り値は0です - 理由はわかりません!私はそれがうまくコーディングされていないことを知っているが、まず私は何が私の問題であり、どのように私はこの問題を解決することができますを理解したい。
ありがとうございます!
JMP(E9,233)でない32ビットジャンプに制限されていますか?あなたは必要な距離をジャンプすることはできません。 – xanatos
'VirtualAllocEx'の2番目のパラメータを使うと、特定の"場所 "でのメモリの割り当てを求めることができます...しかし、あなたは試行でそれをしなければなりません(例えば16mbに丸められたアドレスで始まり、あなたのブロックを割り当てることができるまで "無料"のメモリページを検索する16MBの) – xanatos
あなたのコードの場所が高いです。絶対アドレス(xanatosが指摘しているように潜在的に扱いにくい)を要求するのとは別に、MEM_TOP_DOWNを渡してできるだけ高い割り当てを得ることもできます。あるいは、絶対ジャンプのコードを生成することもできますが、オプションではない可能性のある既存のバイトをパッチしている場合は、それでも、[複数の方法があります](http://www.ragestorm.net/blogs/?p=1070)。 –