Pular para o conteúdo principal

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 dialog e webview, serão afetados;
  • o recurso alerthelper para 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.