O que há de especial no ambiente roothide?
O roothide é um terceiro ambiente de jailbreak, diferente dos ambientes rootful e rootless.
Diferenças em relação aos ambientes rootful e rootless
Ao contrário do jailbreak tradicional, no ambiente roothide o jbroot e o rootfs são isolados um do outro.
O jbroot é montado em um caminho aleatório dentro do rootfs, que também é montado de volta no caminho jbroot/rootfs/.
A raiz do sistema rootfs
No ambiente roothide, o rootfs é o diretório raiz original do sistema iOS, sem modificações e sem caminhos adicionais.
A raiz do jailbreak jbroot
O jbroot é montado em um caminho aleatório sob o rootfs,
normalmente /var/containers/Bundle/Application/.jbroot-XXXXXXXXXXXXXXXX/ (a sequência de X é um valor aleatório).
A função jbroot converte um caminho comum no caminho correspondente dentro do jbroot.
Por exemplo, para acessar /var/mobile/Media/1.txt no jbroot, use jbroot("/var/mobile/Media/1.txt").
Quando o script executa f = io.open(jbroot("/var/mobile/Media/1.txt"), "r"), o arquivo aberto na prática é:
/var/containers/Bundle/Application/.jbroot-XXXXXXXXXXXXXXXX/var/mobile/Media/1.txt
Ambiente do Shell
Como explicado acima, o jbroot é montado em um caminho aleatório dentro do rootfs.
No ambiente do Shell (por exemplo, em um script de instalação deb), não é possível saber antecipadamente sua localização exata no rootfs.
Por isso, o roothide define o jbroot como a raiz de execução dos scripts do Shell.
Isso significa que /Applications/XXTExplorer.app em um deb é instalado, na prática, em:
/var/containers/Bundle/Application/.jbroot-XXXXXXXXXXXXXXXX/Applications/XXTExplorer.app
Isso garante que os plug-ins de jailbreak instalados pelo deb não poluam o rootfs.
Mas também introduz um problema: ao usar os.execute ou io.popen no XXTouch,
essas funções executam scripts do Shell por meio do bash/zsh.
Assim, chamar os.execute("/usr/bin/hidutil list") executa, na prática, o comando:
/var/containers/Bundle/Application/.jbroot-XXXXXXXXXXXXXXXX/usr/bin/hidutil list
Isso impede o acesso direto aos caminhos do rootfs a partir do Shell.
Para resolver isso, o roothide monta o rootfs de volta em jbroot/rootfs/.
Assim, quando o script executa os.execute("/rootfs/usr/bin/hidutil list"), o comando executado é:
/usr/bin/hidutil list
Espelhamento de arquivos e diretórios
Alguns caminhos de arquivos e diretórios no jbroot são links simbólicos para o rootfs original:
| Caminho no jbroot |
|---|
| /dev |
| /private/preboot |
| /var/containers |
| /var/mobile/Containers |
| /usr/share/misc/trace.codes |
| /usr/share/zoneinfo |
| /etc/hosts.equiv |
| /etc/hosts |
| /var/run/utmpx |
| /var/db/timezone |
| /System/Library/CoreServices/SystemVersion.plist |
Além disso, o caminho de scripts do XXTouch, /var/mobile/Media/1ferver, também tem um link simbólico correspondente criado no rootfs.
Todos os caminhos acima podem ser acessados diretamente tanto pelo jbroot quanto pelo rootfs.
Fonte de referência
XXTouch no ambiente Bootstrap
Sem inicialização automática
Em um dispositivo com o jailbreak parcial Bootstrap-Roothide, o serviço em segundo plano do XXTouch não inicia automaticamente depois de reiniciar e reativar o Bootstrap.
Abra manualmente o aplicativo XXTouch; ele fechará automaticamente e exibirá Starting XXTouch Daemon.... O serviço ficará pronto após cerca de 20 segundos.
Sem serviço de injeção na tela inicial
Se o Bootstrap for usado sem ativar o serviço de injeção na tela inicial pelo Serotonin, os recursos de interface dos scripts do XXTouch ficarão indisponíveis:
- recursos que criam interfaces em janelas de nível superior, como
dialogewebview, serão afetados; - o recurso
alerthelperpara lidar com pop-ups da tela inicial não funcionará.
Limpar, com o XXTouch, arquivos que podem ser detectados por aplicativos no ambiente Bootstrap-Roothide
local noexecute = require('no_os_execute')
function remove_sys_app_caches(name)
noexecute.rm_rf('/var/root/Library/WebKit/'..name)
noexecute.rm_rf('/var/root/Library/Caches/'..name)
noexecute.rm_rf('/var/root/Library/HTTPStorages/'..name)
noexecute.rm_rf('/var/root/Library/SplashBoard/Snapshots/'..name)
noexecute.rm_rf('/var/root/Library/Saved Application State/'..name..'.savedState')
noexecute.rm_rf('/var/root/Library/Preferences/'..name..'.plist')
noexecute.rm_rf('/var/root/Library/WebKit/'..name)
noexecute.rm_rf('/var/mobile/Library/Caches/'..name)
noexecute.rm_rf('/var/mobile/Library/HTTPStorages/'..name)
noexecute.rm_rf('/var/mobile/Library/SplashBoard/Snapshots/'..name)
noexecute.rm_rf('/var/mobile/Library/Saved Application State/'..name..'.savedState')
noexecute.rm_rf('/var/mobile/Library/Preferences/'..name..'.plist')
end
remove_sys_app_caches('com.opa334.Dopamine')
remove_sys_app_caches('org.coolstar.SileoStore')
remove_sys_app_caches('ws.hbang.Terminal')
remove_sys_app_caches('pisshill.usprebooter')
remove_sys_app_caches('com.samiiau.loader')
remove_sys_app_caches('kr.xsf1re.vnodebypass')
remove_sys_app_caches('com.serena.Antoine')
remove_sys_app_caches('wiki.qaq.TrollFools')
remove_sys_app_caches('com.tigisoftware.Filza')
remove_sys_app_caches('com.tigisoftware.Filza000')
remove_sys_app_caches('com.tigisoftware.ADManager')
remove_sys_app_caches('com.ichitaso.otadisablerts')
remove_sys_app_caches('chaoge.ChargeLimiter')
remove_sys_app_caches('com.xxtouch.XXTExplorer')
noexecute.rm_rf('/private/var/mobile/Library/Filza')
noexecute.rm_rf('/private/var/mobile/.ssh')
noexecute.rm_rf('/private/var/root/.ssh')
noexecute.rm_rf('/private/var/mobile/offsets.txt')
noexecute.rm_rf('/private/var/mobile/offsets.txt')
noexecute.rm_rf('/private/var/mobile/Serotonin.jp2')
noexecute.rm_rf('/private/var/mobile/Documents/kfund_offsets.plist')
noexecute.rm_rf('/private/var/iomfb_bics_daemon')
Por que esses arquivos existem?
Embora o Roothide instale os aplicativos de jailbreak em caminhos aleatórios, ele não limita o comportamento desses aplicativos durante a execução.
Por isso, caches e outros arquivos criados pelos aplicativos de jailbreak continuam sendo gravados nos locais correspondentes do rootfs.
Além disso, um aplicativo pode verificar a porta SSH. Se necessário, desative o serviço SSH nas configurações do Bootstrap para evitar essa detecção.