至于"哈希数组"的问题,它更加简单 - 只需完全跳过重复检查,直接插入项目,因为我们知道这些值是唯一的.
char __fastcall netcat_insert_dedupe_hooked(uint64_t catalog, uint64_t* key, uint64_t* item) { // 不用费劲逆向结构了 uint64_t not_a_hashmap = catalog + 88; // 不清楚这是干啥的, 把原函数的代码复制过来了 if (!(*(uint8_t(__fastcall**)(uint64_t*))(*item + 48))(item)) return 0; // 直接插入 netcat_insert_direct(not_a_hashmap, key, &item); // 当最后一个哈希命中时移除钩子 // 并且卸载.dll, 我们完活了 :) if (*key == 0x7FFFD6BE) { MH_DisableHook((LPVOID)netcat_insert_dedupe_addr); unload(); } return 1; }可行性验证完整代码在这里.
#结果所以, 好使了吗?
原在线模式加载时间: 大概6分钟 只打了重复检查补丁的时间: 4分30秒 只打了JSON解析器补丁的时间: 2分50秒 两个都打的时间: 1分50秒 (6*60 - (1*60+50)) / (6*60) = 69.4% 加载时间改善(棒!)我去,成功了!