【问题标题】:Calculate 64bit jmp for code cave in c#计算c#中代码洞穴的64位jmp
【发布时间】: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.

标签: c# codecave


【解决方案1】:

哇,伙计们!你启发了我,我得到了我的解决方案...... MEM_TOP_DOWN 完成了这项工作!非常感谢!

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 2012-01-02
    • 2011-03-01
    • 2012-06-15
    • 1970-01-01
    • 2010-10-21
    • 2016-09-15
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多