Skip to content

Commit feb8d6d

Browse files
author
ChasonTang
authored
fix(iOS): vm_protect() force shared library const data copy memory page (didi#932)
1 parent 9657a5b commit feb8d6d

File tree

3 files changed

+11
-36
lines changed

3 files changed

+11
-36
lines changed

DoraemonKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
Pod::Spec.new do |s|
99
s.name = 'DoraemonKit'
10-
s.version = '3.1.1'
10+
s.version = '3.1.2'
1111
s.summary = 'iOS各式各样的工具集合'
1212
s.description = <<-DESC
1313
iOS各式各样的工具集合 Desc

iOS/DoraemonKit/Src/Core/Util/fishhook/doraemon_fishhook.c

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -97,35 +97,13 @@ static void doraemon_perform_rebinding_with_section(struct doraemon_rebindings_e
9797
const bool isDataConst = strcmp(section->segname, "__DATA_CONST") == 0;
9898
uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1;
9999
void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr);
100-
vm_prot_t oldProtection = VM_PROT_NONE;
101-
vm_address_t vmAddress = (vm_address_t)indirect_symbol_bindings;
102-
// https://opensource.apple.com/source/xnu/xnu-7195.141.2/osfmk/vm/vm_user.c.auto.html
103-
// OUT argument, but init with zero to eliminate `Variable 'vmSize' may be uninitialized when used here` warning
104-
vm_size_t vmSize = 0;
105100
if (isDataConst) {
106-
memory_object_name_t object;
107-
#ifdef __LP64__
108-
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;
109-
vm_region_basic_info_data_64_t vmRegionBasicInfoData;
110-
kern_return_t kernelReturn = vm_region_64(mach_task_self(), &vmAddress, &vmSize, VM_REGION_BASIC_INFO_64, (vm_region_info_t)&vmRegionBasicInfoData, &count, &object);
111-
#else
112-
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT;
113-
vm_region_basic_info_data_t vmRegionBasicInfoData;
114-
kern_return_t kernelReturn = vm_region(mach_task_self(), &vmAddress, &vmSize, VM_REGION_BASIC_INFO, (vm_region_info_t)&vmRegionBasicInfoData, &count, object);
115-
#endif
116-
if (__builtin_expect(kernelReturn == KERN_SUCCESS, true)) {
117-
oldProtection = vmRegionBasicInfoData.protection;
118-
} else {
119-
assert(false && "vm_region() failure.");
120-
121-
return;
122-
}
123-
kernelReturn = vm_protect(mach_task_self(), vmAddress, vmSize, false, oldProtection | VM_PROT_WRITE);
124-
if (__builtin_expect(kernelReturn != KERN_SUCCESS, false)) {
125-
assert(false && "vm_protect() failure.");
101+
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);
102+
if (__builtin_expect(kernelReturn != KERN_SUCCESS, false)) {
103+
assert(false && "vm_protect() failure.");
126104

127-
return;
128-
}
105+
return;
106+
}
129107
}
130108
for (uint i = 0; i < section->size / sizeof(void *); i++) {
131109
uint32_t symtab_index = indirect_symbol_indices[i];
@@ -147,16 +125,13 @@ static void doraemon_perform_rebinding_with_section(struct doraemon_rebindings_e
147125
}
148126
indirect_symbol_bindings[i] = cur->rebindings[j].replacement;
149127
goto symbol_loop;
128+
150129
}
151130
}
152131
cur = cur->next;
153132
}
154133
symbol_loop:;
155134
}
156-
if (isDataConst) {
157-
kern_return_t kernelReturn = vm_protect(mach_task_self(), vmAddress, vmSize, false, oldProtection);
158-
assert(kernelReturn == KERN_SUCCESS && "vm_protect() failure.");
159-
}
160135
}
161136

162137
static void doraemon_rebind_symbols_for_image(struct doraemon_rebindings_entry *rebindings,

iOS/Podfile.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ PODS:
1414
- AFNetworking/Serialization (4.0.1)
1515
- AFNetworking/UIKit (4.0.1):
1616
- AFNetworking/NSURLSession
17-
- DoraemonKit (3.1.0):
18-
- DoraemonKit/Core (= 3.1.0)
19-
- DoraemonKit/Core (3.1.0):
17+
- DoraemonKit (3.1.2):
18+
- DoraemonKit/Core (= 3.1.2)
19+
- DoraemonKit/Core (3.1.2):
2020
- AFNetworking
2121
- FMDB
2222
- GCDWebServer
@@ -48,7 +48,7 @@ EXTERNAL SOURCES:
4848

4949
SPEC CHECKSUMS:
5050
AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
51-
DoraemonKit: 6db7868ed839ad6752c2e4ac074f958aab211af2
51+
DoraemonKit: 0a040ae24386654e2a2d2c8d029f5ff5837de3c3
5252
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
5353
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
5454

0 commit comments

Comments
 (0)