以十六进制覆盖exe的字节

时间:2015-11-05 18:03:19

标签: c io binaryfiles

我想通过更改二进制文件来更改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上运行

2 个答案:

答案 0 :(得分:2)

您必须定义要写入文件的字节值。并且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,除了有时文本编辑器可以留下一个不应该有一个流氓看不见的角色。那里的解决方案是删除并重新键入违规行。

答案 1 :(得分:0)

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

和xxd -p foo以十六进制形式转储文件