今天犯了个严重的错误,ReafFile之后没有SetFilePointer,就WriteFile
int main(int argc, char* argv[]) { WSAData wsadata; WSAStartup(MAKEWORD(2,2),&wsadata); char file[MAX_PATH]="c:\\WebGame.dll"; HANDLE hFile=CreateFile(file,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); int filesize=GetFileSize(hFile,0); BYTE *a=(BYTE*)malloc(filesize); BYTE *b=a; DWORD NumberOfBytesRead; ReadFile(hFile,a,filesize,&NumberOfBytesRead,NULL); //这里读取完文件之后文件指针会移动到末尾,如果不把文件指针移动到开头的话,WriteFile会在文件末尾写入数据 //SetFilePointer(hFile,0,0,FILE_BEGIN); Decode((LPVOID)a,filesize,0x07e9); DWORD NumberOfBytesWritten; WriteFile(hFile,b,filesize,&NumberOfBytesWritten,NULL);
这段代码是读取一个加密的WebGame.dll(101kb大小),然后调用Decode函数解密,再把解密后的数据写回到WebGame.dll,跑完之后,发现WebGame.dll的大小是203kb,感觉非常奇怪,调试后发现解密的代码也是对啊,b地址处的代码也是正确的解密结果,为什么写进去就不对了呢?猛地灵光一现,忘记SetFilePiinter了啊,ReadFile之后文件指针已经从0移动到了filesize了,所以WriteFile的时候就会出错了。