123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- //
- // ViewController.m
- // g0blin
- //
- // Created by Sticktron on 2017-12-26.
- // Copyright © 2017 Sticktron. All rights reserved.
- //
- #import "ViewController.h"
- #import "SettingsController.h"
- #include "v0rtex.h"
- #include "common.h"
- #include "offsets.h"
- #include "kernel.h"
- #include "kpp.h"
- #include "remount.h"
- #include "bootstrap.h"
- #include <sys/utsname.h>
- #import <AVFoundation/AVFoundation.h>
- #import <AVKit/AVKit.h>
- #define GRAPE [UIColor colorWithRed:0.5 green:0 blue:1 alpha:1]
- @interface ViewController ()
- @property (weak, nonatomic) IBOutlet UIImageView *logoView;
- @property (weak, nonatomic) IBOutlet UIButton *goButton;
- @property (weak, nonatomic) IBOutlet UITextView *consoleView;
- @property (weak, nonatomic) IBOutlet UIButton *settingsButton;
- @property (weak, nonatomic) IBOutlet UILabel *reinstallBootstrapLabel;
- @end
- static task_t tfp0;
- static uint64_t kslide;
- static uint64_t kbase;
- static uint64_t kcred;
- BOOL respringNeeded;
- BOOL fun;
- AVPlayer *player;
- AVPlayerViewController *cont;
- @implementation ViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
-
- self.consoleView.layer.cornerRadius = 6;
- self.consoleView.text = nil;
-
- self.goButton.layer.cornerRadius = 16;
-
- self.reinstallBootstrapLabel.hidden = YES;
-
-
- // print kernel version
- struct utsname u;
- uname(&u);
- [self log:[NSString stringWithFormat:@"%s \n", u.version]];
-
- // abort if already jailbroken
- if (strstr(u.version, "MarijuanARM")) {
- self.goButton.enabled = NO;
- self.goButton.backgroundColor = UIColor.darkGrayColor;
- [self.goButton setTitle:@"jailbroke yo!" forState:UIControlStateDisabled];
- }
-
- // try to load offsets for device
- if (init_offsets() == KERN_SUCCESS) {
- [self log:@"Ready. \n"];
- } else {
- self.goButton.enabled = NO;
- self.goButton.backgroundColor = UIColor.darkGrayColor;
- [self.goButton setTitle:@"device not supported" forState:UIControlStateDisabled];
- }
-
- // fun
- UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fun:)];
- doubleTap.delaysTouchesBegan = YES;
- doubleTap.numberOfTapsRequired = 3;
- [self.logoView addGestureRecognizer:doubleTap];
- self.logoView.userInteractionEnabled = YES;
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- - (void)log:(NSString *)text {
- self.consoleView.text = [NSString stringWithFormat:@"%@%@ \n", self.consoleView.text, text];
- }
- - (IBAction)prepareForUnwind:(UIStoryboardSegue *)segue {
- //segue exit marker
-
- SettingsController *settingsController = segue.sourceViewController;
- self.reinstallBootstrapLabel.hidden = !settingsController.reinstallBootstrapSwitch.on;
- }
- - (IBAction)go:(UIButton *)sender {
- if (respringNeeded == YES) {
- [self restart];
- return;
- }
-
- self.goButton.enabled = NO;
- self.goButton.backgroundColor = UIColor.darkGrayColor;
- [self.goButton setTitle:@"jailbreaking" forState:UIControlStateDisabled];
-
- [self log:@"exploiting kernel"];
-
- kern_return_t ret = v0rtex(&tfp0, &kslide, &kcred);
- if (ret != KERN_SUCCESS) {
- self.goButton.enabled = YES;
- self.goButton.backgroundColor = GRAPE;
- [self.goButton setTitle:@"try again" forState:UIControlStateNormal];
-
- [self log:@"ERROR: exploit failed \n"];
-
- return;
- }
- LOG("v0rtex was successful");
-
- LOG("tfp0 -> %x", tfp0);
- LOG("slide -> 0x%llx", kslide);
- kbase = kslide + 0xFFFFFFF007004000;
- LOG("kern base -> 0x%llx", kbase);
- LOG("kern cred -> 0x%llx", kcred);
- [self bypassKPP];
- }
- - (void)bypassKPP {
- [self log:@"pwning kernel"];
-
- if (do_kpp(1, 0, kbase, kslide, tfp0) == KERN_SUCCESS) {
- LOG("you down with kpp? yeah you know me");
- [self remount];
- } else {
- [self log:@"ERROR: kpp bypass failed \n"];
- }
- }
- - (void)remount {
- [self log:@"remounting"];
-
- if (do_remount(kslide) == KERN_SUCCESS) {
- [self bootstrap];
- } else {
- [self log:@"ERROR: failed to remount system partition \n"];
- }
- }
- - (void)bootstrap {
- [self log:@"bootstrapping"];
-
- BOOL force = NO;
- if (self.reinstallBootstrapLabel.hidden == NO) {
- force = YES;
- [self log:@"(forcing reinstall)"];
- }
-
- if (do_bootstrap(force) == KERN_SUCCESS) {
- [self finish];
- } else {
- [self log:@"ERROR: failed to bootstrap \n"];
- }
- }
- - (void)finish {
- [self log:@"device is now jailbroken!"];
- [self log:@""];
- [self log:@"SSH server is ready on port 2222"];
- [self log:@"change your root/mobile passwords"];
- [self log:@""];
- [self log:@"respring to load tweaks"];
- sleep(2);
-
- LOG("reloading daemons...");
- pid_t pid;
- posix_spawn(&pid, "/bin/launchctl", 0, 0, (char**)&(const char*[]){"/bin/launchctl", "load", "/Library/LaunchDaemons/0.reload.plist", NULL}, NULL);
- waitpid(pid, 0, 0);
-
- sleep(2);
-
- respringNeeded = YES;
- [self.goButton setTitle:@"respring" forState:UIControlStateNormal];
- self.goButton.enabled = YES;
- }
- - (void)restart {
- LOG("restarting SpringBoard...");
-
- pid_t pid;
- const char* args[] = { "killall", "backboardd", NULL };
- posix_spawn(&pid, "/usr/bin/killall", NULL, NULL, (char* const*)args, NULL);
- }
- - (IBAction)fun:(UITapGestureRecognizer *)recognizer {
- LOG("got secret tap");
-
- if (!fun) {
- fun = YES;
-
- BOOL hasAudio = [AVAudioSession.sharedInstance setCategory:AVAudioSessionCategoryPlayback error:nil];
- if (!hasAudio) {
- LOG("no audio :/");
- }
-
- NSURL *url = [NSBundle.mainBundle URLForResource:@"y0nkers" withExtension:@"m4v"];
- LOG("url = %@", url);
- if (!url) {
- LOG("filenotfound");
- return;
- }
-
- player = [AVPlayer playerWithURL:url];
- cont = [[AVPlayerViewController alloc] init];
- cont.player = player;
- cont.showsPlaybackControls = NO;
- cont.updatesNowPlayingInfoCenter = NO;
-
- cont.view.frame = self.consoleView.bounds;
- [self.consoleView addSubview:cont.view];
- [player play];
-
- } else {
- [player pause];
- [cont.view removeFromSuperview];
- player = nil;
- cont = nil;
- fun = NO;
- }
- }
- @end
|