在c中写入跳转指令

时间:2012-11-10 23:15:03

标签: c assembly

前言,是的,这是一个从外部控制可执行文件的项目。不,我对此没有任何恶意意图,这个项目的最终结果无论如何都不会有用。我在cygwin上用32位XP安装程序写这个。

我需要做的是将COM文件的前几位更改为跳转指令,以便在执行时,它将跳转到COM文件的最后。我查看了汇编程序手册,找出该命令的字节是什么,以便我可以在C中硬编码,但没有运气。

第一个问题:我可以在C中这样做吗?在我看来,我可以在任何COM文件的开头插入OpCodes,以便它执行而不是COM文件。

第二个问题:有人知道我在哪里可以找到OpCodes的资源,以便我可以将它们插入我的文件中吗?或者,是否有人知道跳转指令的字节数是什么?

如果您对此的真实性有任何疑问,请随时提出。

3 个答案:

答案 0 :(得分:1)

Intel® 64 and IA-32 Architectures Software Developer Manual Volume 2A Instruction Set Reference解释了JMP指令的编码(实模式是IA-32的子集)。

对于16字节的近似跳转(在当前代码段内),您将使用0xE9,然后使用相对偏移量跳转到。如果你的跳转是COM文件的第一个字节,那么偏移量将相对于地址0x103 - COM文件的第一条指令总是加载到地址0x100,并且跳转是相对于3字节跳转后的指令。

答案 1 :(得分:1)

在XP上应该有debug.exe。只需启动它,开始用' a编写代码 输入jmp ff00,然后用“&u”组合结果' u'如果没有显示相应的十六进制转储。

答案 2 :(得分:0)

首先请注意,您的程序必须是操作系统,ABI和机器指令集。 (例如,它不能在Linux / x86-64或Linux / PowerPC下运行)

您可以将 C 机器指令写为字节序列。您必须编写哪些字节(即适当的跳转指令的编码)留给您!!!!!

当然,这不是可移植的C.但你基本上可以使用一些适当的源字节区域来进行memcpy

也许像asmjitGNU lightning这样的图书馆可能会激励你。

您可能无法直接使用它们,但研究它们的代码可以帮助您。

另请参阅x86维基百科页面以获取更多参考资料。