0

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

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

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

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

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

4

3 回答 3

1

英特尔® 64 位和 IA-32 架构软件开发人员手册第 2A 卷指令集参考解释了JMP指令的编码(实模式是 IA-32 的子集)。

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

于 2012-11-11T11:22:32.313 回答
1

在 XP 上应该有 debug.exe。简单地启动它,用'a'
type jmp ff00 开始编写代码,如果没有显示相应的十六进制转储,则用'u' dis/[u]nassemble 结果。

于 2012-11-12T17:03:50.890 回答
0

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

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

当然,这不是可移植的 C。但是您基本上可以memcpy使用一些适当的源字节区域来做 a。

也许像asmjitGNU Lightning之类的库可能会激发您的灵感。

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

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

于 2012-11-10T23:19:30.550 回答