作为我的计算机安全课程的一部分,我正在解析一个hiberfil.sys文件,查找PNG文件。我在C中尝试这个。我已经准备好了逻辑,当涉及指针和C时,我完全糊涂了。我无法编译以下代码:
#include<stdio.h>
#include<string.h>
int main(void)
{
FILE* fd = NULL;
FILE* out = NULL;
unsigned char* buff;
unsigned char* chunk[1024];
fd = fopen("hiberfil.sys","r");
out = fopen("a.png","w+");
if(NULL == fd)
{
printf("\n fopen() Error!!!\n");
return 1;
}
fread(buff,2,1,fd);
while(1){
if(*buff==137){
fread(buff,2,1,fd);
if(*buff==80){
fread(buff,2,1,fd);
if(*buff==78){
fread(buff,2,1,fd);
if(*buff==71){
fread(buff,2,1,fd);
if(*buff==13){
fread(buff,2,1,fd);
if(*buff==10){
fread(buff,2,1,fd);
if(*buff==26){
fread(buff,2,1,fd);
if(*buff==10){
int * a,b,c,d,e,f,g,h,i;
*a=137;
*b=80;
*c=78;
*d=71;
*e=13;
*f=10;
*g=26;
*h=10;
fwrite(a,2,1,out);
fwrite(b,2,1,out);
fwrite(c,2,1,out);
fwrite(d,2,1,out);
fwrite(e,2,1,out);
fwrite(f,2,1,out);
fwrite(g,2,1,out);
fwrite(h,2,1,out);
break;
}
else continue;
}
else continue;
}
else continue;
}
else continue;
}
else continue;
}
else continue;
}
else fread(buff,2,1,fd);
}
}
unsigned char type[4]=0;
while(type[0]!=73 || type[1]!=69 || type[2]!=78 || type[3]!=68){
fread(length,sizeof(int),1,fd);
fread(type,4,1,fd);
fread(chunk,length+4,1,fd);
fwrite(length,sizeof(int),1,out);
fwrite(type,4,1,out);
fwrite(chunk,length+8,1,out);
}
fclose(fd);
fclose(out);
return 0;
}
非常感谢!
PS:有人可以帮我解决代码块的格式问题!
编辑错误
错误:一元'*'的无效类型参数(有'int')&lt;&lt;&lt;&lt;参考int *指针
错误:初始化'size_t fwrite(const void *,size_t,size_t,FILE *)'的参数1&lt;&lt;&lt;&lt;参考int length我相信。
他们现在对我来说似乎微不足道,但仍有一小部分解释会对我有所帮助。这些指针是什么?
答案 0 :(得分:1)
一个错误是:
int * a,b,c,d,e,f,g,h,i;
*a=137;
*b=80;
*c=78;
由于只有a
是int*
,其余变量属于int
类型。要纠正在一行上声明(更易读并且不太可能犯这个错误)或在每个变量名之前放置*
。
另一个错误(不是编译器错误)是使用buff
,它是一个使用它时的单位指针:
unsigned char* buff;
/* snip ... */
fread(buff,2,1,fd);
可能的解决方法是:
unsigned char buff[2]; /* As 2 bytes appears to be required size. */
答案 1 :(得分:0)
除了hmjd的答案,你应该考虑一个类型的数组可以被索引。您不必仅取消引用第一项。
因此,您可以说buff[i]
(如果,例如,声明为unsigned char buff[1024];
),i
是size_t
或int
,当您增加时去。
一般来说,更有意义的是 - 正如你最初的想法似乎已经 - 读取数据块然后只有在你仍在检测它是否是PNG时遇到第一个块的末尾才读取下一个块文件与否。
所以基本上你通读了hiberfil.sys
,直到你在一个循环中到达文件的末尾。在此循环中,您可以跟踪单个块以及前面的块。例如,可以作为环形缓冲区完成。然后在该块上运行检测代码(单独的函数,通过引用传递块),并且 - 例如 - 将偏移量从检测函数返回到块中。这样您就可以知道hiberfil.sys
的偏移量,以备不时之需,然后提取PNG文件。
也许还会阅读this。