Skip to content

Commit

Permalink
fix(iOS): vm_protect() force shared library const data copy memory pa…
Browse files Browse the repository at this point in the history
…ge (#932)
  • Loading branch information
ChasonTang authored Nov 4, 2021
1 parent 9657a5b commit feb8d6d
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 36 deletions.
2 changes: 1 addition & 1 deletion DoraemonKit.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 6 additions & 31 deletions iOS/DoraemonKit/Src/Core/Util/fishhook/doraemon_fishhook.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions iOS/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -48,7 +48,7 @@ EXTERNAL SOURCES:

SPEC CHECKSUMS:
AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
DoraemonKit: 6db7868ed839ad6752c2e4ac074f958aab211af2
DoraemonKit: 0a040ae24386654e2a2d2c8d029f5ff5837de3c3
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4

Expand Down

0 comments on commit feb8d6d

Please sign in to comment.