intptr_t get_text_range(void
*
base, intptr_t off, uint32_t
*
psize) {
mach_header_t
*
pmh
=
(mach_header_t
*
)base;
load_command
*
plc
=
(load_command
*
)(pmh
+
1
);
for
(
int
i
=
0
; i < pmh
-
>ncmds; i
+
+
) {
if
(plc
-
>cmd !
=
LC_SEGMENT_CURARCH) {
plc
=
(struct load_command
*
)((unsigned char
*
)plc
+
plc
-
>cmdsize);
continue
;
}
segment_command_t
*
psc
=
(segment_command_t
*
)plc;
if
(
0
=
=
strcmp(psc
-
>segname,
"__TEXT"
)) {
if
(psize)
*
psize
=
(uint32_t)psc
-
>vmsize;
return
(intptr_t)(psc
-
>vmaddr
+
off);
}
plc
=
(struct load_command
*
)((unsigned char
*
)plc
+
plc
-
>cmdsize);
}
return
-
1
;
}
static void
*
find_svc() {
for
(
int
i
=
0
; i < _dyld_image_count(); i
+
+
) {
const char
*
path
=
_dyld_get_image_name(i);
void
*
base
=
(void
*
)_dyld_get_image_header(i);
intptr_t slide
=
_dyld_get_image_vmaddr_slide(i);
if
(
0
!
=
strcmp(path,
"/usr/lib/system/libsystem_kernel.dylib"
)) {
continue
;
}
NSLog(@
"%s"
, path);
intptr_t text_base
=
0
;
uint32_t text_size
=
0
;
text_base
=
get_text_range(base, slide, &text_size);
for
(
int
i
=
0
; i < text_size
/
4
; i
+
=
4
) {
uint32_t
*
addr
=
(uint32_t
*
)(text_base
+
i
*
4
);
if
(
*
addr
=
=
0xd4001001
) {
/
/
for
arm64
return
(void
*
)addr;
}
}
}
return
0
;
}
static void
*
svc_addr
=
0
;
naked
int
asm_getpid1() {
__asm(
"mov x16, 0x14 \n"
"mov x8, %[svc_addr] \n"
"br x8 \n"
::[svc_addr]
"r"
(svc_addr):
);
}
finline
int
asm_getpid2() {
int
ret
=
0
;
__asm(
"mov x16, 0x14 \n"
"mov x8, %[svc_addr] \n"
"blr x8 \n"
"mov %[ret], x0 \n"
:[ret]
"=r"
(ret):[svc_addr]
"r"
(svc_addr):
);
return
ret;
}
int
main(
int
argc, char
*
argv[]) {
svc_addr
=
find_svc();
NSLog(@
"asm_pid1=%d, asm_pid2=%d, real_pid=%d"
, asm_getpid1(), asm_getpid2(), getpid());
NSString
*
appDelegateClassName;
@autoreleasepool
{
appDelegateClassName
=
NSStringFromClass([AppDelegate
class
]);
}
return
UIApplicationMain(argc, argv, nil, appDelegateClassName);
}