以十六进制覆盖 exe 的字节

Overwriting bytes of an exe in hex

我想通过更改二进制文件来更改 exe 的逻辑。 exe 中的十六进制值之一是 75,我必须将其更改为 74(x86 程序集中的 JNE 到 JE)。我知道它是文件的第 1276 个字节,但我该怎么做呢?

这是我的:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fileH = fopen ("foo", "r+");
    fseek(fileH, 1276, SEEK_SET);
    fwrite("74", 1, 1, fileH);
    fclose(fileH);
    return 0;
}

此外,由于某些原因,我得到了 'fileH' 未声明,即使我包含了 stdio 并且 FILE 全部大写。我找不到其他人遇到这个问题。 运行 这个在 ubuntu

您必须定义一个字节值才能写入文件。 JE 的 8086 操作码是十六进制的 74,而不是十进制。

#include <stdio.h>

int main(void)
{
    unsigned char byt = 0x74;
    FILE *fileH = fopen ("foo.txt", "r+");
    if (fileH == NULL)
        return 1;
    if (fseek(fileH, 3, SEEK_SET))
        return 1;
    if (fwrite(&byt, 1, 1, fileH) != 1)
        return 1;
    if (fclose(fileH))
        return 1;
    printf("File updated\n");
    return 0;
}

作为使用小文本文件的演示,之前的内容:

0123456789

及之后:

012t456789

我不知道你的编译器为什么拒绝 fileH 除了有时文本编辑器会在不应该出现的地方留下一个看不见的流氓字符。那里的解决方案是删除并重新输入有问题的行。

   int main()
    {
        FILE *fileH = fopen ("foo", "r+");
        fseek(fileH, 1276, SEEK_SET);
        putc(0x74,fileH);
    } 

和 xxd -p foo 以十六进制转储您的文件