#include <windows.h>
#include <cstdio>
#pragma pack(1)
struct
SFileSig
{
DWORD
murmur_hash;
DWORD
file_size;
DWORD64
time
;
BYTE
level;
BYTE
id;
DWORD
md5[4];
};
#pragma pack()
struct
SMd5Item
{
SMd5Item* p1;
SMd5Item* p2;
DWORD
md5[4];
SFileSig* database;
};
struct
SHashItem
{
SHashItem* p1;
SHashItem* p2;
DWORD
murmur_hash;
DWORD
file_size;
SFileSig* database;
};
struct
STableMd5
{
DWORD
p1;
SMd5Item* list;
};
struct
STableHash
{
DWORD
p1;
SHashItem* list;
};
void
DumpDatabase(
const
SFileSig* sig) {
printf
(
"----------------------------\n"
);
printf
(
"murmur_hash:%08X\n"
, sig->murmur_hash);
printf
(
"file_size:%08X\n"
, sig->file_size);
printf
(
"update-time:%lu\n"
, sig->
time
);
printf
(
"level:%02X\n"
, sig->level);
printf
(
"id:%02x\n"
, sig->id);
printf
(
"md5:%08X%08X%08X%08X\n"
, sig->md5[0], sig->md5[1], sig->md5[2], sig->md5[3]);
printf
(
"-------------------------\n"
);
}
int
__stdcall DllMain(_In_
void
* _DllHandle, _In_ unsigned
long
_Reason, _In_opt_
void
* _Reserved) {
if
(_Reason == DLL_PROCESS_ATTACH) {
const
auto
md5_fast_list =
reinterpret_cast
<STableMd5 *>(0x0C23BC60);
for
(
int
index = 0; index < 0x201; index++) {
if
(md5_fast_list[index].list) {
for
(
auto
iter = md5_fast_list[index].list; ; iter = iter->p1) {
if
(iter->database ==
nullptr
|| iter->md5[0] == 0)
break
;
printf
(
"[FastMd5List]md5:%08X%08X%08X%08X\n"
, iter->md5[0], iter->md5[1], iter->md5[2],
iter->md5[3]);
DumpDatabase(iter->database);
if
(iter->p1 == md5_fast_list[index].list)
break
;
}
}
}
const
auto
hash_fast_list =
reinterpret_cast
<STableHash *>(0x0C23E488);
for
(
int
index = 0; index < 0x201; index++) {
if
(hash_fast_list[index].list) {
for
(
auto
iter = hash_fast_list[index].list; ; iter = iter->p1) {
if
(iter->p1 == hash_fast_list[index].list)
break
;
printf
(
"[FastHashList]hash:%08X ,file size:%08x\n"
, iter->murmur_hash, iter->file_size);
DumpDatabase(iter->database);
}
}
}
}
return
0;
}