Artikelverzeichnis
-
- Vorwort
- Erkennen Sie Dateien mit Jailbreak
- Erkennung privater Verzeichnisse
- Jailbreak-Software erkennen
- Erkennen Sie, ob das Systemverzeichnis zu einem Link wird
- Dynamische Bibliothekserkennung
- Erkennung von Umgebungsvariablen
- Erkennung von Systemaufrufen
- Erkennung von Befehlssatzaufrufen
- Andere Möglichkeiten zur Erkennung
Vorwort
Im vorherigen Artikel habe ich alle zusammengebracht, um einen Tweak zu erstellen, der die Jailbreak-Erkennung blockiert. In diesem Artikel lernen und klären wir gemeinsam mit allen die Jailbreak-Erkennungspunkte im iOS-System und verbessern gemeinsam unsere Optimierung.
Erkennen Sie Dateien mit Jailbreak
• Prinzip: Nach dem Jailbreak werden zusätzliche Dateien generiert. Sie können feststellen, ob ein Jailbreak durchgeführt werden soll, indem Sie beurteilen, ob diese Dateien vorhanden sind.
• Schlüsselfunktionen: fileExistsAtPath, fopen, access usw.
NSString *path = @"/Applications/Cydia.app";
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDirectory = NO;
if([fileManager fileExistsAtPath:path isDirectory:&isDirectory]){
return 已越狱;
}
Erkennung privater Verzeichnisse
• Prinzip: Die Berechtigungen ändern sich nach dem Jailbreak und Sie können Dateiinformationen im privaten Verzeichnis abrufen oder Dateien im privaten Verzeichnis lesen und schreiben.
• Schlüsselfunktionen: stat, statfs, isWritableFileAtPath, isReadableFileAtPath, isExecutableFileAtPath, isDeletableFileAtPath, writeToFile, removeItemAtPath usw.
struct stat stat_info;
if(stat("/Application/Cydia.app", &stat_info) == 0) {
return 已越狱;
}
NSError* mrror;
NSString *test = @"jailbreak";
NSString *path = @"/private/................./test.txt";
if([test writeToFile:path atomically:YES encoding:NSStringEncodingConversionAllowLossy error:&mrror]) {
return 已越狱;
}
Jailbreak-Software erkennen
• Prinzip: Versuchen Sie, die Jailbreak-Software über das URL-Schema zu öffnen. Wenn sie geöffnet werden kann, bedeutet dies, dass sie einen Jailbreak aufweist.
• Schlüsselfunktion: canOpenURL
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]])
{
return 已越狱;
}
Erkennen Sie, ob das Systemverzeichnis zu einem Link wird
• Prinzip: Nach dem Jailbreak werden einige Dateiverzeichnisse in andere Bereiche verschoben, die ursprünglichen Dateispeicherorte müssen jedoch gültig sein, sodass ein symbolischer Link erstellt wird, der auf den ursprünglichen Pfad verweist.
• Tastenfunktion: lstat
struct stat sym;
if(lstat("/bin/bash", &sym) == 0 || sym.st_mode & S_IFLNK)
{
return 已越狱;
}
Dynamische Bibliothekserkennung
• Prinzip 1: Verwenden Sie _dyld_get_image_name, um die dynamische Bibliothek abzurufen, und durchlaufen Sie die Informationen, um festzustellen, ob eine abnormale dynamische Bibliothek vorhanden ist
• Schlüsselfunktion: _dyld_get_image_name
int dyld_count = _dyld_image_count();
for (int i = 0; i < dyld_count; i++) {
const char * imageName = _dyld_get_image_name(i);
char * substr = "/Library/MobileSubstrate/MobileSubstrate.dylib";
if(strcmp(imageName,substr) == 0){
return 已越狱;
}
}
• Prinzip 2: Einige nach dem Jailbreak installierte Plug-Ins können Systemfunktionen ersetzen, die erkennen können, ob einige Schlüsselfunktionen aus der dynamischen Bibliothek des Systems stammen.
• Tastenfunktion: dladdr
int ret;
Dl_info dylib_info;
int (*func_stat)(const char *,struct stat *) = stat;
if ((ret = dladdr(func_stat, &dylib_info))) {
if (strcmp(dylib_info.dli_fname,"/usr/lib/system/libsystem_kernel.dylib") != 0) {
return 已越狱;
}
}
• Prinzip 3: Im Allgemeinen werden Anti-Jailbreak-Plugins „hook_dyld_get_image_name“ verwenden, was zu keiner Übereinstimmung führt. Sie können den Rückruf verwenden, wenn das Bild geladen wird, um die dynamischen Bibliotheksinformationen aus dem MachO-Header zu erkennen. Es sollte beachtet werden, dass bei Verwendung von dladdr to Erkennen Sie die Bibliotheksinformationen. Möglicherweise wird auch ein Fehler zurückgegeben, und es ist eine weitere Beurteilung erforderlich.
• Tastenfunktion: dladdr
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_dyld_register_func_for_add_image(_check_image);
});
}
static void _check_image(const struct mach_header *header, intptr_t slide) {
char *path = "/usr/lib/substrate";
Dl_info info;
dladdr(header, &info);
if(info.dli_fname != NULL) {
if (strstr(info.dli_fname,path)) {
return 已越狱;
}
}
}
Erkennung von Umgebungsvariablen
• Prinzip: Beim Injizieren dynamischer Bibliotheken werden dynamische Bibliotheken über DYLD_INSERT_LIBRARIES injiziert, und ob der Jailbreak vorliegt, wird durch Erkennen der Umgebungsvariablen des aktuell ausgeführten Programms bestimmt
• Schlüsselfunktion: getenv
if(!(NULL == getenv("DYLD_INSERT_LIBRARIES"))) {
return 已越狱;
}
Erkennung von Systemaufrufen
• Prinzip: Das Prinzip ist dasselbe wie bei anderen Erkennungsmethoden, die aufrufende Methode ist jedoch unterschiedlich
• Schlüsselfunktionen: syscall (SYS_syscall, SYS_access, SYS_stat, SYS_stat64, SYS_open, SYS_lstat, SYS_lstat64 usw.)
if(syscall(SYS_access, "/bin/sh", F_OK) == 0){
return 已越狱;
}
Erkennung von Befehlssatzaufrufen
• Prinzip: Dasselbe wie das Prinzip des Systemaufrufs, mit der Ausnahme, dass nicht die vom System gekapselte Funktion Syscall verwendet wird, sondern direkt die Assembly-Ausführung verwendet wird.
• Schlüsselfunktionen: svc 0x80 (SYS_syscall, SYS_access, SYS_stat, SYS_stat64, SYS_open, SYS_lstat, SYS_lstat64 usw.)
MOV X0, #0
MOV W16, #1 //SYS_exit
SVC 0x80
Andere Möglichkeiten zur Erkennung
• Prinzip 1: Überprüfen Sie, ob es eine Klasse gibt, die Ausnahmen injiziert
• Schlüsselfunktionen: NSClassFromString usw.
• Prinzip 2: Erkennen Sie die Integrität der Sandbox, z. B. können Geräte ohne Jailbreak keine untergeordneten Prozesse usw. forken.
• Schlüsselfunktionen: fork, posix_spawn, popen, system usw.
• Prinzip 3: Überprüfen Sie, ob eine lokale SSH-Verbindung ausgeführt werden kann. Auf den meisten Geräten mit Jailbreak ist normalerweise OpenSSH installiert. Wenn die SSH-Verbindung erfolgreich erkannt werden kann, bedeutet dies, dass die Maschine einen Jailbreak aufweist.