|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
|
|
|
#import <Foundation/Foundation.h> |
|
|
|
|
|
|
|
|
|
|
|
#define PROG_NAME "lockpick" |
|
|
|
|
|
|
|
|
|
|
|
@interface MCPasscodeManager : NSObject |
|
|
|
|
|
|
|
|
|
|
|
+ (MCPasscodeManager *)sharedManager; |
|
|
|
|
|
|
|
|
|
|
|
+ (BOOL)isDeviceUnlocked; |
|
|
|
|
|
+ (BOOL)isDeviceLocked; |
|
|
|
|
|
- (BOOL)isPasscodeSet; |
|
|
|
|
|
|
|
|
|
|
|
- (void)lockDevice; |
|
|
|
|
|
- (BOOL)unlockDeviceWithPasscode:(id)passcode outError:(out NSError * _Nullable *)error; |
|
|
|
|
|
|
|
|
|
|
|
@end |
|
|
|
|
|
|
|
|
|
|
|
@interface SBLockdownManager : NSObject |
|
|
|
|
|
|
|
|
|
|
|
+ (SBLockdownManager *)sharedInstance; |
|
|
|
|
|
|
|
|
|
|
|
@end |
|
|
|
|
|
|
|
|
|
|
|
void print_usage() { |
|
|
|
|
|
printf("Usage: %s lock\n", PROG_NAME); |
|
|
|
|
|
printf(" %s unlock [passcode]\n", PROG_NAME); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) { |
|
|
|
|
|
if(argc == 1) { |
|
|
|
|
|
print_usage(); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(strcmp(argv[1], "lock") == 0) { |
|
|
|
|
|
if([MCPasscodeManager isDeviceUnlocked]) { |
|
|
|
|
|
[[MCPasscodeManager sharedManager] lockDevice]; |
|
|
|
|
|
} else { |
|
|
|
|
|
fprintf(stderr, "Device is already locked.\n"); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else if(strcmp(argv[1], "unlock") == 0) { |
|
|
|
|
|
NSError *error = nil; |
|
|
|
|
|
|
|
|
|
|
|
if(![MCPasscodeManager isDeviceUnlocked]) { |
|
|
|
|
|
if(![MCPasscodeManager sharedManager].isPasscodeSet) { |
|
|
|
|
|
[[MCPasscodeManager sharedManager] unlockDeviceWithPasscode:nil outError:&error]; |
|
|
|
|
|
if(error) { |
|
|
|
|
|
fprintf(stderr, "Couldn't unlock device.\n"); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
else if(argc < 3) { |
|
|
|
|
|
fprintf(stderr, "This device requires a passcode.\n"); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
NSString *givenPasscode = @(argv[2]); |
|
|
|
|
|
|
|
|
|
|
|
[[MCPasscodeManager sharedManager] unlockDeviceWithPasscode:givenPasscode outError:&error]; |
|
|
|
|
|
if(error) { |
|
|
|
|
|
if(error.code == 5011) { |
|
|
|
|
|
fprintf(stderr, "Wrong passcode.\n"); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
fprintf(stderr, "Unknown error code.\n"); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
fprintf(stderr, "Device is already unlocked.\n"); |
|
|
|
|
|
return 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
} |