两个字符串应该怎样才能比较成功? 望高人指点
先从TVKOO.EXE提取一段十六进制的代码到数组FileContents,再从TVKOO.TXT取出一段代码(也是从TVKOO.EXE的同一位置提取的)到数组V_Contents,然后对两个数组进行比较.但为什么比较的结果是不一样的呢?是不是跟TVKOO.TXT里面的代码的存储类型或形式有关?? 望高人指点.
#include<stdio.h>
#include "TCHAR.H"
void main()
{
TCHAR FileContents[255];
TCHAR V_Contents[255];
int cmpreturn=0;
FILE *fp;
fp=fopen("TVKoo.exe","rt");
if (fp==NULL)
{
printf("fopen() File open FAIL\n");
fclose(fp);
return ;
}
fseek(fp,0x34100,SEEK_SET); //把文件指针指向特征码在文件的偏移地址处
fread(FileContents,32,1,fp);//读取长度为特征码长度的内容
fclose(fp);
FILE *ff;
ff=fopen("tvkoo.txt","rt");
//tvkoo.txt文件里的内容是从TVKoo.exe 0x34100处取的32字节,如下:
//6867B8A10DD0FF5548587F077A3AFA2A
if (ff==NULL)
{
printf("fopen() File open FAIL\n");
fclose(ff);
return ;
}
fread(V_Contents,32,1,ff);//读取长度为特征码长度的内容
cmpreturn=memcmp(V_Contents,FileContents,sizeof(V_Contents));
if(cmpreturn==0)
printf("yes!\n");
else
printf("Help me!\n");
fclose(ff);
}
[解决办法]
两个fread函数的32和1交换一下位置试试..
[解决办法]
两个txt 文本的排放方式(格式)要一样.
[解决办法]
- C/C++ code
fp=fopen("TVKoo.exe","rt"); 改成fp=fopen("TVKoo.exe","rb"); ff=fopen("tvkoo.txt","rt"); 改成ff=fopen("tvkoo.txt","rb");看看
[解决办法]
问题在于你读取的只有32个字节(fread(V_Contents,32,1,ff);fread(FileContents,32,1,fp);), 但你比较的却是整个数组的长度,在定义数组的时候又没有初始化,他们里面有大量的随机值,所以你这么比较的时候:
memcmp(V_Contents,FileContents,sizeof(V_Contents));是肯定不相等的,改为: memcmp(V_Contents,FileContents,32);
或者在定义数组的时候将两个数组初始化为一致的状态.
[解决办法]
cocoolman说得对,内存比较时传入的sizeof(V_Contents)实参值是V_Contents数组的长度,不是item的长度。
[解决办法]
tvkoo.txt中的"//6867B8A10DD0FF5548587F077A3AFA2A"
是怎么取出来的?从十六进制编辑器中copy出来的?
也就是说,现在的32个字符是不是原来16个字符的十六进制? 例如:'a'='\x61' ,原来的a到tvkoo.txt中变成了61
char tmp[]="\x68\x67\xB8\xA1..."; //原来tvkoo.exe中的16个字符?
另外,4楼兄弟说的也在理。
[解决办法]
如7楼所言,问题出在二个文件的流状态不一致:一个是文本流(十六进制编辑器有一个从二进制流到文本流的转换),一个是二进制流,这么比较是不行的.所以要先进行转换.其实你后来直接用fread从tvkoo.exe读32字节到tvkoo.txt,因为fread和fwrite是以二进制格式进行读写操作的,所以此时tvkoo.txt中还是一种二进制流的格式.故比较就成功了.
如果你想对从十六进制编辑器中读取的数据和从exe中读取的数据进行比较,那你需要把这个十六进制编辑器的文本流转为再转为二进制流,或者将从exe中读取的数据转换为文本流,再进行比较.
我在这里用后者,既将从exe中读取的数据转换为文本流:
#include <stdio.h>
#include "TCHAR.H"
void main()
{
TCHAR FileContents[255];
TCHAR V_Contents[255];
int cmpreturn=0;
FILE *fp;
fp=fopen("TVKoo.exe","rt");
if (fp==NULL)
{
printf("fopen() File open FAIL\n");
fclose(fp);
return ;
}
fseek(fp,0x34100,SEEK_SET); //把文件指针指向特征码在文件的偏移地址处
fread(FileContents,32,1,fp);//读取长度为特征码长度的内容
//转换为与十六进制编辑器中取出的数据相同的文本流格式
TCHAR FileContentsAscii[64 + 2] = "";
for(int i = 0; i < 32; ++i)
{
sprintf((FileContentsAscii + strlen(FileContentsAscii)), "%02X", FileContents[i]);
}
fclose(fp);
FILE *ff;
ff=fopen("tvkoo.txt","rt");
//tvkoo.txt文件里的内容是从TVKoo.exe 0x34100处取的32字节,如下:
//6867B8A10DD0FF5548587F077A3AFA2A
if (ff==NULL)
{
printf("fopen() File open FAIL\n");
fclose(ff);
return ;
}
fread(V_Contents,64,1,ff);//读取长度为特征码长度的内容
//要考虑到2个字符表示了exe中一个字节的值
[del][/del]cmpreturn=memcmp(V_Contents,FileContents,sizeof(V_Contents));
cmpreturn=memcmp(V_Contents,FileContentsAscii,64);
if(cmpreturn==0)
printf("yes!\n");
else
printf("Help me!\n");
fclose(ff);
}
程序我没有调试过.
将十六进制编辑器的文本流转为再转为二进制流稍微麻烦一些,但原理是相通的.