Iva*_*nov 6 c# assembly codecave
让我们假设我已经分配了我的编解码器使用VirtualAllocEx的地址(它返回地址),并使用我的代码将代码写入该地址WriteProcessMemory().
这是问题:
如何写一个跳转到我的编解码器?我知道跳转以" E9" 开头,但是如何将返回的地址VirtualAllocEx转换为正确的UInt32(dword),以便调试器/编译器能够理解指令?
例如:
我在地址00402020(原生应用程序的OEP).我写了一个跳转到004028CF(空地方)" JMP 004028CF".以字节为单位的指令如下所示:
CPU Disasm
Address Hex dump Command Comments
00402020 E9 AA080000 JMP 004028CF
Run Code Online (Sandbox Code Playgroud)
" E9"是我们如何表明JMP.怎么样" AA080000",我该如何生成呢?
我需要做类似的事情,所以我可以将JMP初始化为我的codecave,它将位于返回的地址VirtualAllocEx().
任何帮助将不胜感激!
提前致谢.
E9 是相对跳转,因此后面的 32 位只是当前指令指针的偏移量。有关详细信息,请参阅Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册第 2A 卷:指令集参考,AM 第549ff 页。有关详细信息,请参阅Intel\xc2\xae 64 和 IA-32 架构软件开发人员手册。
\n\n因此从 00402020 跳转到 004028CF 的操作码应该如下。
\n\n\n E9 00 00 08 AA\n\n\n
Offset = DestinationAddress - CurrentInstructionPointer\n000008AA = 004028CF - 00402025\nRun Code Online (Sandbox Code Playgroud)\n\n当执行跳转指令时,指令指针已经指向下一条指令。所以跳转指令的偏移量与当前指令指针值相差5。
\n\nCurrentInstructionPointer = AddressOfJumpInstruction + 5\nRun Code Online (Sandbox Code Playgroud)\n\n更新
\n\n更正了有关当前指令指针值的错误。谢谢jn。
\n| 归档时间: |
|
| 查看次数: |
2760 次 |
| 最近记录: |