@@ -649,8 +649,29 @@ void IntegrityCheckBypass::patch_version_hook(safetyhook::Context& context) {
649649 // THEY STORE PATCH VERSION INSIDE SOMEWHERE NOW! And only load until that patch version then dont load no more paks
650650 spdlog::info (" [IntegrityCheckBypass]: patch_version_hook called!" );
651651
652+ uint64_t current_patch_version = 0 ;
653+ switch (s_patch_version_reg_index) {
654+ case NDR_RAX : current_patch_version = context.rax ; break ;
655+ case NDR_RCX : current_patch_version = context.rcx ; break ;
656+ case NDR_RDX : current_patch_version = context.rdx ; break ;
657+ case NDR_RBX : current_patch_version = context.rbx ; break ;
658+ case NDR_RSP : current_patch_version = context.rsp ; break ;
659+ case NDR_RBP : current_patch_version = context.rbp ; break ;
660+ case NDR_RSI : current_patch_version = context.rsi ; break ;
661+ case NDR_RDI : current_patch_version = context.rdi ; break ;
662+ case NDR_R8 : current_patch_version = context.r8 ; break ;
663+ case NDR_R9 : current_patch_version = context.r9 ; break ;
664+ case NDR_R10 : current_patch_version = context.r10 ; break ;
665+ case NDR_R11 : current_patch_version = context.r11 ; break ;
666+ case NDR_R12 : current_patch_version = context.r12 ; break ;
667+ case NDR_R13 : current_patch_version = context.r13 ; break ;
668+ case NDR_R14 : current_patch_version = context.r14 ; break ;
669+ case NDR_R15 : current_patch_version = context.r15 ; break ;
670+ default : current_patch_version = context.rax ; break ; // fallback
671+ }
672+
652673 // Scan for amount of paks. Get exe directory. To be honest set this to 9999 is okay, but i feel like it might take a long time
653- int file_count_result = std::max<int >(scan_patch_files_count (), context. rax );
674+ int file_count_result = std::max<int >(scan_patch_files_count (), current_patch_version );
654675
655676 switch (s_patch_version_reg_index) {
656677 case NDR_RAX :
@@ -854,7 +875,20 @@ void IntegrityCheckBypass::restore_unencrypted_paks() {
854875
855876 // If this breaks... we'll fix it!
856877 const auto game = utility::get_executable ();
857- const auto sha3_code_start = utility::scan (game, " C5 F8 57 C0 C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 44 24 ? 48" );
878+
879+ std::vector<std::string> possible_patterns = {
880+ " C5 F8 57 C0 C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 44 24 ? 48" ,
881+ " C5 F8 57 C0 C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? C5 FC 11 84 24 ? ? ? ? 48 C1 E9 10" , // MHWILDS v1.041
882+ };
883+
884+ std::optional<uintptr_t > sha3_code_start;
885+
886+ for (const auto & pattern : possible_patterns) {
887+ sha3_code_start = utility::scan (game, pattern);
888+ if (sha3_code_start) {
889+ break ;
890+ }
891+ }
858892
859893 if (!sha3_code_start) {
860894 spdlog::error (" [IntegrityCheckBypass]: Could not find sha3_rsa_code_start!" );
@@ -877,7 +911,7 @@ void IntegrityCheckBypass::restore_unencrypted_paks() {
877911
878912 spdlog::info (" [IntegrityCheckBypass]: Created sha3_rsa_code_midhook!" );
879913
880- #ifdef MHWILDS
914+ #if defined( MHWILDS) || defined(MHSTORIES3)
881915 const auto pak_load_check_start = utility::scan (game, " 41 57 41 56 41 55 41 54 56 57 55 53 48 81 EC ? ? ? ? 48 89 CE 48 8B 05 ? ? ? ? 48 31 E0 48 89 84 24 ? ? ? ? 48 8B 81 ? ? ? ? 48 C1 E8 10" );
882916
883917 if (pak_load_check_start) {
0 commit comments