首先从sub_40BFF0这个函数入手。
可以看到有一个格式字符串,这个是拼接文件名用的。
得到文件名之后进入了Gaf004::HashFileName函数,这个函数接受一个字符串参数和一个缓冲区参数。
看看这个函数长啥样。
嗯……看不懂,溜了溜了。
回到sub_40BFF0,已知把文件路径传入Hash_FileName会得到两个返回值。
一个是hash_1,里面是上面那个谜之函数计算出来的字节,一个是hash_1里字节的数量。
接着进入了LoadFileAndIndex函数,把文件路径和hash_1传了进去。
这里直接用CreateFileA打开了封包文件。
接着把文件句柄和hash_1传入sub_40C150函数。
进入sub_40C150后接着把文件句柄和hash_1传入Gaf004Loader__LoadFromHFile函数。
继续跟进。
这里发现它用SetFilePointer取得当前读写位置,因为文件是刚刚打开的,所以它一定会返回0。
具体作用先不管,接着往下看。
把文件句柄存到了类中。
接着把hash_1传入Gaf004Loader::Load函数。跟进。
首先用SetFilePointer设置读写位置,并检查错误。
然后用ReadFile读入了4字节和2字节,用于检查文件类型。
6个字节是固定不变的。
检查完文件类型,接着把hash_1传入Gaf004Loader::Load2函数,继续跟进。
可以看到有一个格式字符串,这个是拼接文件名用的。
得到文件名之后进入了Gaf004::HashFileName函数,这个函数接受一个字符串参数和一个缓冲区参数。
看看这个函数长啥样。
嗯……看不懂,溜了溜了。
回到sub_40BFF0,已知把文件路径传入Hash_FileName会得到两个返回值。
一个是hash_1,里面是上面那个谜之函数计算出来的字节,一个是hash_1里字节的数量。
接着进入了LoadFileAndIndex函数,把文件路径和hash_1传了进去。
这里直接用CreateFileA打开了封包文件。
接着把文件句柄和hash_1传入sub_40C150函数。
进入sub_40C150后接着把文件句柄和hash_1传入Gaf004Loader__LoadFromHFile函数。
继续跟进。
这里发现它用SetFilePointer取得当前读写位置,因为文件是刚刚打开的,所以它一定会返回0。
具体作用先不管,接着往下看。
把文件句柄存到了类中。
接着把hash_1传入Gaf004Loader::Load函数。跟进。
首先用SetFilePointer设置读写位置,并检查错误。
然后用ReadFile读入了4字节和2字节,用于检查文件类型。
6个字节是固定不变的。
检查完文件类型,接着把hash_1传入Gaf004Loader::Load2函数,继续跟进。