답변:
그것은 탈옥의 의미에 달려 있습니다. 간단한 경우 Cydia가 설치되어 있는지 확인할 수 있어야합니다.
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// do something useful
}
해킹 된 커널의 경우 좀 더 복잡합니다.
fileExistsAtPath:
하고 반환하도록 할 NO
수 있습니다.
이것은이 필요에 대해 찾은 답변을 결합한 코드이며 훨씬 높은 성공률을 제공합니다.
BOOL isJailbroken()
{
#if !(TARGET_IPHONE_SIMULATOR)
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"] ||
[[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/MobileSubstrate.dylib"] ||
[[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"] ||
[[NSFileManager defaultManager] fileExistsAtPath:@"/usr/sbin/sshd"] ||
[[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"] ||
[[NSFileManager defaultManager] fileExistsAtPath:@"/private/var/lib/apt/"] ||
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]) {
return YES;
}
FILE *f = NULL ;
if ((f = fopen("/bin/bash", "r")) ||
(f = fopen("/Applications/Cydia.app", "r")) ||
(f = fopen("/Library/MobileSubstrate/MobileSubstrate.dylib", "r")) ||
(f = fopen("/usr/sbin/sshd", "r")) ||
(f = fopen("/etc/apt", "r"))) {
fclose(f);
return YES;
}
fclose(f);
NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];
[[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
if(error == nil)
{
return YES;
}
#endif
return NO;
}
isJailbroken
+(BOOL)isJailbroken {
NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
return [[UIApplication sharedApplication] canOpenURL:url];
}
/Applications/Cydia.app
일반 전화 에서 파일 경로 를 확인할 수 없습니까? 애플이이를 감지하여 앱을 거부한다는 이야기를 들어 본 적이 없지만 애플은 예측할 수 없습니다. Cydia에는 UIApplication으로 합법적으로 확인할 수 있는 URL 체계 cydia : // 가 있습니다.canOpenURL:
커널이 망가 졌는지 확인하는 것은 그리 복잡하지 않습니다.
탈옥은 서명 된 코드에 대한 커널의 서명 검사가 항상 코드가 올바르게 서명되었다고보고하게하며, 손상되지 않은 전화기는 서명이 잘못된 코드를 실행할 수 없습니다.
따라서 서명이 잘못된 앱에 별도의 실행 파일을 포함시킵니다. main () 및 반환 값이있는 3 줄 프로그램 일 수 있습니다. 코드 서명없이 실행 파일을 컴파일하고 (프로젝트 설정-> 빌드에서 끄십시오) "codesign"명령 줄 유틸리티를 사용하여 다른 키로 서명하십시오.
앱이 별도의 실행 파일을 실행하도록합니다. 나쁜 sig로 별도의 실행 파일을 실행할 때 프로그램이 반환 값을 얻을 수 없으면 확실히 감옥에 있습니다. 별도의 실행 파일이 A-OK를 반환하면 전화가 확실히 탈옥 된 것입니다.
BOOL isJailbroken()
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
FILE *f = fopen("/bin/bash", "r");
if (errno == ENOENT)
{
// device is NOT jailbroken
fclose(f);
return NO;
}
else {
// device IS jailbroken
fclose(f);
return YES;
}
#endif
}
다음을 확인하여 장치가 JailBroken인지 여부를 감지 할 수 있습니다.
다양한 기사와 책에서 만든 오픈 소스 라이브러리가 있습니다. GitHub에서 사용해보십시오 !
Swift 2.3에서 @Yossi가 제공 한 솔루션을 재 작업했습니다.
public static func jailbroken(application: UIApplication) -> Bool {
guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return isJailbroken() }
return application.canOpenURL(cydiaUrlScheme) || isJailbroken()
}
static func isJailbroken() -> Bool {
if isSimulator {
return false
}
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath("/Applications/Cydia.app") ||
fileManager.fileExistsAtPath("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
fileManager.fileExistsAtPath("/bin/bash") ||
fileManager.fileExistsAtPath("/usr/sbin/sshd") ||
fileManager.fileExistsAtPath("/etc/apt") ||
fileManager.fileExistsAtPath("/usr/bin/ssh") {
return true
}
if canOpen("/Applications/Cydia.app") ||
canOpen("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
canOpen("/bin/bash") ||
canOpen("/usr/sbin/sshd") ||
canOpen("/etc/apt") ||
canOpen("/usr/bin/ssh") {
return true
}
let path = "/private/" + NSUUID().UUIDString
do {
try "anyString".writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
try fileManager.removeItemAtPath(path)
return true
} catch {
return false
}
}
static func canOpen(path: String) -> Bool {
let file = fopen(path, "r")
guard file != nil else { return false }
fclose(file)
return true
}
내가 아는 가장 정교한 방법은 objc_copyImageNames()
기능을 사용하는 것입니다. 현재로드 된 라이브러리 목록을 반환하며 대부분의 사람들이 탈옥 된 장치에 MobileSubstrate가 있고 대부분의 iAP 균열 도구가 의존하기 때문에 적어도 일부 MobileSubstrate 라이브러리가 표시됩니다.
deb
MobileSubstrate 의 파일을 찾아서 압축을 풀고 블랙리스트 (거의) 모두 .dylib
포장합니다.
이에 대한 "API"를 알고 있지 않습니다. 만약 있다면, 탈옥 마스킹 제품은 그것들을 빨리 덮을 것입니다.
많은 사람들이 지적했듯이, 그것은 고양이와 마우스 게임입니다. 그리고 두 선수 모두 전문가가 된 후에는 첫 번째 움직임을 얻는 사람이 모두 결정됩니다. (장치를 보유한 사람)
Zdziarski의 새로운 저서 "iOS 앱 해킹 및 보안"에서 탈옥을 감지하기위한 많은 좋은 제안을 찾았습니다. (개인적으로 O'Reilly eBook은 복사하여 붙여 넣기를 허용하므로 더 많은 비용을 지불했습니다.)
아니요, 게시자와 제휴하지 않았습니다. 그러나 나는 그것이 좋은 책이라고 생각했다. 해커의 실수를 고치기 만해도 문제를 해결할 수 있기 때문에 책을 가리킬 것이라고 생각했습니다.
응용 프로그램을 통해 서명되지 않은 코드를 실행하십시오.
탈옥 된 장치는 일반적으로 다음과 같은 특징이 있습니다.
탈옥 탐지를 위해 파일 존재를 확인하는 것만으로는 실패 할 것입니다. 이러한 검사는 우회하기 쉽습니다.
"vanilla"iPhone에없는 파일을 찾는 것이 좋습니다. 내가 본 모든 탈옥 키트는 ssh를 설치합니다. 그것은 탈옥 된 전화의 좋은 지표 일 수 있습니다.
우리가 한 일은 이미 사용자와 통신하기위한 RSS 피드가 있고 ( Stocks Live ), 다음과 같은 뉴스 항목이 있습니다.
일부 탈옥 장치에는 문제가 있습니다. 이러한 문제를 해결하기 위해 해킹을했지만이 탈옥 장치인지 여부를 알아야합니다. 여기를 누르면 앱이 문제를 해결합니다. 예를 들어 탈옥을 제거하고 정상으로 돌아온 경우 여기를 누르십시오.
그런 다음 사용자 상호 작용을 처리하고 다른 동작 등의 적절한 작업을 수행하십시오.
cydia 또는 jailbroken 장치가 생성하는 파일을 찾으십시오. 또는 앱의 블랙 박스 외부에 파일을 쓰십시오. 그렇게하면 장치가 손상 / 감옥됩니다. :)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
Swift 4 이상에는 다음 코드를 사용하십시오. appdelegate에 다음 코드를 추가하십시오.
private func getJailbrokenStatus() -> Bool {
if TARGET_IPHONE_SIMULATOR != 1 {
// Check 1 : existence of files that are common for jailbroken devices
if FileManager.default.fileExists(atPath: "/Applications/Cydia.app")
|| FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib")
|| FileManager.default.fileExists(atPath: "/bin/bash")
|| FileManager.default.fileExists(atPath: "/usr/sbin/sshd")
|| FileManager.default.fileExists(atPath: "/etc/apt")
|| FileManager.default.fileExists(atPath: "/private/var/lib/apt/")
|| UIApplication.shared.canOpenURL(URL(string:"cydia://package/com.example.package")!) {
return true
}
// Check 2 : Reading and writing in system directories (sandbox violation)
let stringToWrite = "Jailbreak Test"
do {
try stringToWrite.write(toFile:"/private/JailbreakTest.txt", atomically:true, encoding:String.Encoding.utf8)
//Device is jailbroken
return true
} catch {
return false
}
}
else {
return false
}
}
func applicationDidBecomeActive (_ application : UIApplication) {
if getJailbrokenStatus() {
let alert = UIAlertController(title: LocalizedKeys.Errors.jailbreakError, message: LocalizedKeys.Errors.jailbreakErrorMessage, preferredStyle: UIAlertController.Style.alert)
let jailBrokenView = UIViewController()
jailBrokenView.view.frame = UIScreen.main.bounds
jailBrokenView.view.backgroundColor = .white
self.window?.rootViewController = jailBrokenView
jailBrokenView.present(alert, animated: true, completion: nil)
}
if #available(iOS 11.0, *) {
if !UIScreen.main.isCaptured {
DispatchQueue.main.async {
self.blockImageView.removeFromSuperview()
}
}
}
}
여기 내 해결책이 있습니다 : 1 단계
extension UIDevice {
func isJailBroken() -> Bool {
let cydiaPath = "/Applications/Cydia.app"
let aptPath = "/private/var/lib/apt/"
if FileManager.default.fileExists(atPath: cydiaPath) || FileManager.default.fileExists(atPath: aptPath) {
return true
}
return false
}
}
2 단계 : viewDidLoad()
시작 화면보기 컨트롤러 (또는 처음 호출하는 VC) 내에서 호출합니다.
// show a blank screen or some other view controller
let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
self.navigationController?.present(viewController, animated: true, completion:nil)
/Application/Preferences.app/General.plist에 액세스 해보십시오. jailbroken iPhone에서 액세스 할 수 있어야합니다. Jb가 아닌 전화에서는 액세스 할 수 없습니다.