d173220523 发表于 2020-4-28 21:39

用c读取exe文件,出现此文件的版本与正在运行的windows版本不兼容

本帖最后由 d173220523 于 2020-4-29 17:03 编辑

2、将记事本的.exe文件读取到内存,并返回读取后在内存中的地址.
3、将内存中的数据存储到一个文件中,(.exe格式),然后双击打开,看是否能够使用.
#include "iostream"
#include "stdio.h"
#include <stdlib.h>

void pula()
{
      FILE *fp,*fp1;
      int i;
      if ( (fp = fopen("C:\\Windows\\system32\\notepad.exe", "rb")) == NULL )
                puts("Fail to open file!");
      fseek(fp,0,2);
      i=ftell(fp);
      char* date = (char*)malloc(i);
      fseek(fp,0,0);
      if(date == NULL)
                puts("申请失败");
      fscanf(fp, "%c", date);
      printf("写入内存成功\n");
      if ( (fp1 = fopen("C:\\1111.exe", "wb")) == NULL )
                puts("Fail to open file!");
      fprintf(fp1,"%c",*date);
}

int main()
{
      pula();
      
      return 0;
}

该如何解决

无闻无问 发表于 2020-4-28 22:04

读写不对吧,1kb明显不对嘛,怎么能运行呢…

FSA4565 发表于 2020-4-28 22:10

应该使用UE打开看看到底写进去了什么,来看下数据写入到底是出了什么问题。另外,关于这个申请内存的,这样复制文件会导致内存占用过高,在大体积的exe的情况下会导致内存申请失败,所以建议使用循环读取,读一点写一点。

absman1972 发表于 2020-4-28 22:50

fscanf()/fprintf() 要搭配迴圈使用,或是要改成 fread()/fwrite() 一次完成讀寫
原始的寫法只會讀寫一個byte

sam喵喵 发表于 2020-4-29 00:06

改成64位fseek试试

Vjmms 发表于 2020-4-29 10:16

这样只能读出notepad.exe这个文件的第一个字节。如果一个一个字节读,要用循环,不断增加指针,直到文件末尾。
页: [1]
查看完整版本: 用c读取exe文件,出现此文件的版本与正在运行的windows版本不兼容