我想制作 C程序,以便将另一个二进制文件提取到磁盘。
的形式FILE *fp;
fp=fopen("libcurl.dll", "w");
fprintf(fp,"*OKJBJK09lkjhjG(**(G*I*()(KLJ(FG");
fprintf(fp,"fsd3r03rf-0)(-+_)H0F09E00FDS4asa");
......
是的,“w”模式和引号中的ASCII文字让我变得笨拙,但请尽量明白。
char c[129];
fp1=fopen("source.dll", "r");
fp2=fopen("dest.c", "w");
while(!eof(fp1))
{
for(i=0;i<128;c[i]=fgetc(fp1));
fprintf(fp2, "fprintf(fp,\"%s\");", c);
}
此代码也是垃圾......
我想用它来提取 DLL和EXE ,而不是文本文件。问题是,如何从数据中生成相应的字符串,以及如何忠实地将它们写入磁盘?
我想在C中这样做。所以没有自动安装程序。
答案 0 :(得分:1)
如果我理解正确,您希望创建一个C文件,您可以编译该文件以在执行时将二进制数据写入文件。以下是一些代码:
#include <stdio.h>
int main(void)
{
FILE *fp1=fopen("source.dll", "rb");
FILE *fp2=fopen("dest.c", "w");
if ((fp1 == NULL) || (fp2 == NULL))
{
printf("Unable to open file\n");
return 1;
}
fputs("#include <stdio.h>\n", fp2);
fputs("int main(void)\n", fp2);
fputs("{\n", fp2);
fputs(" unsigned char file_data[] = {\n ", fp2);
while(!feof(fp1))
{
int len;
int i;
unsigned char buf[4096];
len = fread(buf, 1, 4096, fp1);
if (len <= 0)
{
break;
}
for (i = 0; i < len; i++)
{
fprintf(fp2, "0x%02x, ", buf[i]);
}
fprintf(fp2, "\n ");
}
fclose(fp1);
fputs(" };\n", fp2);
fputs(" FILE *fh = fopen(\"file.bin\", \"wb\");\n", fp2);
fputs(" if (fh == NULL) { perror(\"fopen\"); return 1; }\n", fp2);
fputs(" if (fwrite(file_data, 1, sizeof(file_data), fh) < 1)\n", fp2);
fputs(" { perror(\"fwrite\"); return 1; }\n", fp2);
fputs(" if (fclose(fh) != 0) { perror(\"fclose\"); return 1; }\n", fp2);
fputs(" return 0;\n", fp2);
fputs("}\n", fp2);
fclose(fp2);
return 0;
}
答案 1 :(得分:0)
这样的事情应该有效:
FILE *fin=fopen("source.dll", "r");
FILE *fout=fopen("source_dll.h", "w");
int size=0;
fprintf(fout,"char *source_dll_bytes={");
while(!feof(fin))
fprintf(fout, "%s%d", size++==0?"":",", fgetc(fin));
fprintf(fout, "};\nint source_dll_size=%d;", size);
fclose(fout);
fclose(fin);
然后你只需#include "source_dll.h"
并使用source_dll_bytes
和source_dll_size
在运行时将其打印出来。
编辑:如果不清楚,fprintf
将无法正常工作将二进制数据写入磁盘上的文件。请改用fwrite
。
答案 2 :(得分:-1)
二进制文件以特定的格式存储。只有加载二进制文件的目标程序才知道格式,相应地解释文件内容。
例如,假设您要在二进制文件中写入两个整数。每个整数将占用4个字节,因此二进制文件的大小为8个字节。比方说,数字是16和32,并假设一切都是小端。
文件内容如下所示:十六进制:
1000000020000000
现在,如果以ASCII模式读取文件(如在记事本中打开它们),文件将如何显示?这些数据看起来很乱。
应该读取二进制文件的目标程序知道那里有两个整数,每个整数有4个字节长。因此程序将从文件中读取前4个字节并将其解释为整数。该程序将对接下来的4个字节执行相同的操作。
DLL和EXE也以特定格式编写,您需要先了解格式是什么。然后,您可以从中提取数据。