【发布时间】:2017-03-28 12:19:17
【问题描述】:
我无法解决我的问题。任何帮助表示赞赏。 我想为我分配的内存创建一个 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
为什么我需要的 jmp 地址前面有 7FFE00 ? 如果我在 VirtualAllocEx 中选择 IntPtr.Zero 以外的另一个值,则返回值为 0 - 不知道为什么!我知道它的编码不好,但首先我想了解我的问题是什么以及如何解决这个问题。
非常感谢大家!
【问题讨论】:
-
JMP (E9, 233) 不是限制为 32 位跳转吗?你不能跳你需要的距离。
-
通过使用
VirtualAllocEx的第二个参数,您可以要求在特定“地方”分配内存...但是您必须通过试验来完成(从给定地址开始四舍五入到例如 16mb,然后开始添加 16mb 搜索“空闲”内存页面,直到你能够分配你的块) -
您的代码位置很高。除了要求绝对地址(这可能很棘手,正如 xanatos 指出的那样),您还可以尝试传递
MEM_TOP_DOWN以获得尽可能高的分配。或者,您可以为绝对跳转生成代码,但如果您正在修补现有字节,则可能不是一个选项。即便如此,there's multiple ways.