From feb8d6dc4b7cddd29fefeffb905e043037897104 Mon Sep 17 00:00:00 2001 From: ChasonTang Date: Thu, 4 Nov 2021 16:28:56 +0800 Subject: [PATCH] fix(iOS): vm_protect() force shared library const data copy memory page (#932) --- DoraemonKit.podspec | 2 +- .../Core/Util/fishhook/doraemon_fishhook.c | 37 +++---------------- iOS/Podfile.lock | 8 ++-- 3 files changed, 11 insertions(+), 36 deletions(-) diff --git a/DoraemonKit.podspec b/DoraemonKit.podspec index d59db73b..1a761004 100644 --- a/DoraemonKit.podspec +++ b/DoraemonKit.podspec @@ -7,7 +7,7 @@ Pod::Spec.new do |s| s.name = 'DoraemonKit' - s.version = '3.1.1' + s.version = '3.1.2' s.summary = 'iOS各式各样的工具集合' s.description = <<-DESC iOS各式各样的工具集合 Desc diff --git a/iOS/DoraemonKit/Src/Core/Util/fishhook/doraemon_fishhook.c b/iOS/DoraemonKit/Src/Core/Util/fishhook/doraemon_fishhook.c index e2dc3a96..e34f9371 100644 --- a/iOS/DoraemonKit/Src/Core/Util/fishhook/doraemon_fishhook.c +++ b/iOS/DoraemonKit/Src/Core/Util/fishhook/doraemon_fishhook.c @@ -97,35 +97,13 @@ static void doraemon_perform_rebinding_with_section(struct doraemon_rebindings_e const bool isDataConst = strcmp(section->segname, "__DATA_CONST") == 0; uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1; void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr); - vm_prot_t oldProtection = VM_PROT_NONE; - vm_address_t vmAddress = (vm_address_t)indirect_symbol_bindings; - // https://opensource.apple.com/source/xnu/xnu-7195.141.2/osfmk/vm/vm_user.c.auto.html - // OUT argument, but init with zero to eliminate `Variable 'vmSize' may be uninitialized when used here` warning - vm_size_t vmSize = 0; if (isDataConst) { - memory_object_name_t object; -#ifdef __LP64__ - mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64; - vm_region_basic_info_data_64_t vmRegionBasicInfoData; - kern_return_t kernelReturn = vm_region_64(mach_task_self(), &vmAddress, &vmSize, VM_REGION_BASIC_INFO_64, (vm_region_info_t)&vmRegionBasicInfoData, &count, &object); -#else - mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT; - vm_region_basic_info_data_t vmRegionBasicInfoData; - kern_return_t kernelReturn = vm_region(mach_task_self(), &vmAddress, &vmSize, VM_REGION_BASIC_INFO, (vm_region_info_t)&vmRegionBasicInfoData, &count, object); -#endif - if (__builtin_expect(kernelReturn == KERN_SUCCESS, true)) { - oldProtection = vmRegionBasicInfoData.protection; - } else { - assert(false && "vm_region() failure."); - - return; - } - kernelReturn = vm_protect(mach_task_self(), vmAddress, vmSize, false, oldProtection | VM_PROT_WRITE); - if (__builtin_expect(kernelReturn != KERN_SUCCESS, false)) { - assert(false && "vm_protect() failure."); + kern_return_t kernelReturn = vm_protect(mach_task_self(), (vm_address_t)indirect_symbol_bindings, section->size, false, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY); + if (__builtin_expect(kernelReturn != KERN_SUCCESS, false)) { + assert(false && "vm_protect() failure."); - return; - } + return; + } } for (uint i = 0; i < section->size / sizeof(void *); i++) { uint32_t symtab_index = indirect_symbol_indices[i]; @@ -147,16 +125,13 @@ static void doraemon_perform_rebinding_with_section(struct doraemon_rebindings_e } indirect_symbol_bindings[i] = cur->rebindings[j].replacement; goto symbol_loop; + } } cur = cur->next; } symbol_loop:; } - if (isDataConst) { - kern_return_t kernelReturn = vm_protect(mach_task_self(), vmAddress, vmSize, false, oldProtection); - assert(kernelReturn == KERN_SUCCESS && "vm_protect() failure."); - } } static void doraemon_rebind_symbols_for_image(struct doraemon_rebindings_entry *rebindings, diff --git a/iOS/Podfile.lock b/iOS/Podfile.lock index 506f0bb2..47072227 100644 --- a/iOS/Podfile.lock +++ b/iOS/Podfile.lock @@ -14,9 +14,9 @@ PODS: - AFNetworking/Serialization (4.0.1) - AFNetworking/UIKit (4.0.1): - AFNetworking/NSURLSession - - DoraemonKit (3.1.0): - - DoraemonKit/Core (= 3.1.0) - - DoraemonKit/Core (3.1.0): + - DoraemonKit (3.1.2): + - DoraemonKit/Core (= 3.1.2) + - DoraemonKit/Core (3.1.2): - AFNetworking - FMDB - GCDWebServer @@ -48,7 +48,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce - DoraemonKit: 6db7868ed839ad6752c2e4ac074f958aab211af2 + DoraemonKit: 0a040ae24386654e2a2d2c8d029f5ff5837de3c3 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 -- GitLab