Рассчитать 64-битную JMP для пещеры кода в C#

Я не могу решить мою проблему. Любая помощь приветствуется. Я хочу создать JMP для моей выделенной памяти. Если я проверю свои расчеты с помощью чит-движка, то это нормально. Причина Cheat Engine выделяет память в более высоком регионе. Моя выделенная память, например: 0x870000, а адрес, где я хочу создать jmp, находится по адресу: 7FFDE65F5184.

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? Если я выберу другое значение, чем IntPtr.Zero в VirtualAllocEx, возвращаемое значение будет 0 - не знаю почему! я знаю, что это не очень хорошо написано, но прежде всего я хочу понять, в чем заключается моя проблема и как я могу решить эту проблему.

Большое спасибо, ребята!

1 ответ

Вау, ребята! Вы вдохновили меня, и я нашел свое решение... MEM_TOP_DOWN сделал свою работу! Спасибо!

Другие вопросы по тегам