我想通过更改二进制文件来更改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上运行
答案 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以十六进制形式转储文件