Skip to content

Instantly share code, notes, and snippets.

@ttwj
Last active February 16, 2022 01:09
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save ttwj/8771034 to your computer and use it in GitHub Desktop.
Save ttwj/8771034 to your computer and use it in GitHub Desktop.
RastiClutch v2.0.3 - Rasticrac on steroids
#!/bin/sh
#
# RastiClutch v2.0.3 (Jan 2016)
#
# http://github.com/KJCracks/Clutch
# Based on
# Rasticrac v3.3.0 (december 2015)
#
# Rapid Advanced Secure Thorough Intelligent Gaulish Nuclear Acclaimed Cracker
# Rapide Avancé Securisé Tout-terrain Intelligent Gaulois Nucléaire Approfondi Craqueur
#
# Home/Help/Donate: https://twitter.com/iRastignac
#
RC_VERSION="2.0.3"
if [ "$UID" -ne 0 ]; then
echo "Please run RastiClutch as root"
exit 1
fi
# ======
# Please, customize the script first!
# Choices are:
# - Default language (US:english, FR:french, ES:spanish, DE:german, IT:italian, VN:vietnamese, KU:kurdish)
RClang="US"
#RClang="FR1"
#RClang="FR2"
#RClang="ES1"
#RClang="ES2"
#RClang="DE1"
#RClang="DE2"
#RClang="IT1"
#RClang="IT2"
#RClang="VN1"
#RClang="VN2"
#RClang="KU1"
#RClang="KU2"
# - Default CrackerName (or "Anonymous").
RCcracker="Anonymous"
# - Should "extra details" appear in ipa's filename? (ie: "iPad / 3GS / etc") (You can hate them)
RCextras="YES"
# - Display graphical progress bars? (based on number and/or size of apps) ("by size" is a bit slower)
RCbarNum="YES"
RCbarSize="YES"
# - Should display be verbose? (verbose is messier and a bit slower)
RCverbose="NO"
# - Should script talk to you? (only with iOS4/5/6, only with "speak" tool from Cydia)
RCspeak="YES"
# - Should artist's name be used in ipa's filename?
RCartistfrommeta="YES"
# - Should itemId be used in filename?
RCitemId="NO"
# - Should menu display 'real name' of apps? (slower, slower, and strange sort order)
RCrealnamemenu="NO"
# - Default compression level is blank (aka "-6"), and is the best speed/size ratio.
# - Recommended. Upload/download/storage will be good.
RCcompression=""
# - Maximum compression ("-9") (also "-8" or "-7") is slower, but size is the best.
# - If your iDevice is fast, if you're not in a hurry, if size matters. Best upload/download/storage.
#RCcompression="-9"
# - Minimum compression ("-2") (also "-3" to "-5") is way faster, but size is way worse.
# - Upload/download/storage will be worse. (other tools like CrackTM or Clutch or Crackulous use "-2").
# - With "-2", RC will be as fast as the others.
#RCcompression="-2"
# - Don't use "-1" (sloppy) or "-0" (store), as size will be horrible, and all will suffer. Avoid.
# - Should I generate fake MetaData or not?
# (Some people hate them, some love them, some protections check them; you should really keep them)
RCmetadata="YES"
# - Should I try LamestPatchest on the executable?
# (It won't work 100%, but sometimes it really helps) (and now it's very very fast) (you should keep it)
RClamestpatchest="YES"
# - Which menu dots do you prefer?
RCdots=".............................."
#RCdots="------------------------------"
#RCdots=" "
#RCdots="______________________________"
# Progress bar display
RCxxx="====="
RCsss="-----"
# Various
readonly RCversion="2.0"
readonly cami="/var/mobile/Library/Caches/com.apple.mobile.installation.plist"
readonly cali="/private/var/db/lsd/com.apple.lsdidentifiers.plist"
readonly lsd="/tmp/lsd.tmp"
readonly RooRoo="/var/root/RCtemp"
# DEBUG ONLY: - Force the "this script is running inside a GUI" check?
RCinaGUI="NEVER"
# DEBUG ONLY: - Check only (all tested but Ipa not created)
RCcheck="NEVER"
# Thanks you for testing.
# ======
# ======
function SelectLanguage
{
# Language US
if [ $RClang = "US" ]; then
MsgAnaAppl="Analyzing application"
MsgAppLoca="Locating"
MsgBadChoi="Bad choice"
MsgBldMenu="Building menu..."
MsgBrzMode="Berzerk mode: cracking ALL"
MsgBrzNoth="nothing"
MsgCntFind="Cannot find"
MsgCopArtw="Copying Artwork"
MsgCopExec="and copying executable"
MsgCreDire="Creating directories"
MsgDskFull="Disk full"
MsgEraMemo="Erasing memory file"
MsgErrrors="Errors"
MsgFakMeta="and faking MetaData"
MsgFoundIt="Found"
MsgInsCydi="Install from Cydia"
MsgIpaDone="Done as"
MsgIpaInco="Incomplete .ipa"
MsgMarDone="Marking all apps done"
MsgMnuEmpt="empty"
MsgNotMeta="and no MetaData"
MsgRemTemp="Removing temporary files"
MsgSgnAppl="Signing the application"
MsgSizUnit="B"
MsgUnaLoca="Unable to locate"
MsgWarning="Warning"
MsgWasAskd="Asked"
MsgWrgChoi="Wrong choice"
MsgWrnMeta="iTunesMetadata format changed"
MsgYouChoi="Your choices"
MsgZipStep="Compressing the .ipa (step"
MsgMrkDone="Mark all done "
MskZroDone="Reset done list "
fi
# Language FR1 or FR2
if [ $RClang = "FR1" -o $RClang = "FR2" ]; then
MsgAnaAppl="Analyse d'application"
MsgAppLoca="Recherche"
MsgBldMenu="Construction du menu..."
MsgBrzMode="Mode Berzerk: on craque TOUT"
MsgCntFind="Introuvable:"
MsgDskFull="Disque plein"
MsgInsCydi="Installer avec Cydia"
MsgMnuEmpt="vide"
MsgRemTemp="Effacement fichiers temporaires"
MsgSizUnit="o"
MsgUnaLoca="Impossible de trouver"
MsgWrgChoi="Mauvais choix"
MsgWarning="Attention"
MsgWrnMeta="nouveau format d'iTunesMetadata"
MsgYouChoi="Votre choix"
MsgSgnAppl="Signature de l'application"
MsgCopArtw="Copie de l'Artwork"
MsgFakMeta="et fausses MetaData"
MsgNotMeta="et pas de MetaData"
MsgWasAskd="Voulu"
MsgErrrors="Erreurs"
MsgBrzNoth="rien"
MsgMrkDone="Tout marquer fait "
MskZroDone="Effacer liste fait "
fi
# Language FR1 (ascii)
if [ $RClang = "FR1" ]; then
MsgBadChoi="$( echo -ne "Choix erron\0351" )"
MsgCopExec="$( echo -ne "& copie de l'ex\0351cutable" )"
MsgCreDire="$( echo -ne "Cr\0351ation r\0351pertoires" )"
MsgIpaInco="$( echo -ne "Ipa incompl\0350te" )"
MsgEraMemo="$( echo -ne "Effacement fichier m\0351moire" )"
MsgIpaDone="$( echo -ne "R\0351sultat:" )"
MsgMarDone="$( echo -ne "Toutes les apps sont marqu\0351es comme trait\0351es" )"
MsgZipStep="$( echo -ne "Compression de l'ipa (\0351tape" )"
MsgFoundIt="$( echo -ne "Trouv\0351" )"
fi
# Language FR2 (utf8)
if [ $RClang = "FR2" ]; then
MsgBadChoi="$( echo -ne "Choix erron\0303\0251" )"
MsgCopExec="$( echo -ne "& copie de l'ex\0303\0251cutable" )"
MsgCreDire="$( echo -ne "Cr\0303\0251ation r\0303\0251pertoires" )"
MsgIpaInco="$( echo -ne "Ipa incompl\0303\0250te" )"
MsgEraMemo="$( echo -ne "Effacement fichier m\0303\0251moire" )"
MsgIpaDone="$( echo -ne "R\0303\0251sultat:" )"
MsgMarDone="$( echo -ne "Toutes les apps sont marqu\0303\0251es comme trait\0303\0251es" )"
MsgZipStep="$( echo -ne "Compression de l'ipa (\0303\0251tape" )"
MsgFoundIt="$( echo -ne "Trouv\0303\0251" )"
fi
# Language ES1 or ES2
if [ $RClang = "ES1" -o $RClang = "ES2" ]; then
MsgBrzMode="Modo Berzerk: crackando TODO"
MsgCntFind="No encontro"
MsgCopExec="y copiando ejecutable"
MsgCreDire="Creando directorios"
MsgEraMemo="Borrado memoria archivo"
MsgInsCydi="Instalarlo desde Cydia"
MsgIpaDone="Done as"
MsgMarDone="Marcando todas aplicaciones como 'hecho'"
MsgRemTemp="Borrando archivos temporales"
MsgSizUnit="B"
MsgUnaLoca="Incapaz de ubicar"
MsgWarning="Warning"
MsgWrnMeta="iTunesMetadata formato cambiado"
MsgCopArtw="Copiando Artwork"
MsgFakMeta="y fingiendo MetaData"
MsgNotMeta="y no MetaData"
MsgFoundIt="Found"
MsgWasAskd="Asked"
MsgErrrors="Errores"
MsgBrzNoth="nada"
MsgMrkDone="Marcar todas hechas "
MskZroDone="Vaciar lista hechas "
fi
# Language ES1 (ascii)
if [ $RClang = "ES1" ]; then
MsgAnaAppl="$( echo -ne "Analizando aplicaci\0363n" )"
MsgAppLoca="$( echo -ne "Ubicaci\0363n" )"
MsgBadChoi="$( echo -ne "Mala elecci\0363n" )"
MsgBldMenu="$( echo -ne "Construyendo men\0372..." )"
MsgIpaInco="$( echo -ne "\0241 Incompleta .ipa" )"
MsgDskFull="$( echo -ne "\0277 Disco lleno" )"
MsgMnuEmpt="$( echo -ne "vac\0355o" )"
MsgWrgChoi="$( echo -ne "Opci\0363n incorrecta" )"
MsgYouChoi="$( echo -ne "\0277 Su elecci\0363" )"
MsgZipStep="$( echo -ne "Compresi\0363n de .ipa (paso" )"
MsgSgnAppl="$( echo -ne "Firma de la aplicaci\0363n" )"
fi
# Language ES2 (utf8)
if [ $RClang = "ES2" ]; then
MsgAnaAppl="$( echo -ne "Analizando aplicaci\0303\0263n" )"
MsgAppLoca="$( echo -ne "Ubicaci\0303\0263n" )"
MsgBadChoi="$( echo -ne "Mala elecci\0303\0263n" )"
MsgBldMenu="$( echo -ne "Construyendo men\0303\0272..." )"
MsgIpaInco="$( echo -ne "\0302\0241 Incompleta .ipa" )"
MsgDskFull="$( echo -ne "\0302\0277 Disco lleno" )"
MsgMnuEmpt="$( echo -ne "vac\0303\0255o" )"
MsgWrgChoi="$( echo -ne "Opci\0303\0263n incorrecta" )"
MsgYouChoi="$( echo -ne "\0302\0277 Su elecci\0303\0263" )"
MsgZipStep="$( echo -ne "Compresi\0303\0263n de .ipa (paso" )"
MsgSgnAppl="$( echo -ne "Firma de la aplicaci\0303\0263n" )"
fi
# Language DE1 or DE2. Translation by Ushnak.
if [ $RClang = "DE1" -o $RClang = "DE2" ]; then
MsgAnaAppl="Analyse der App"
MsgAppLoca="Suche"
MsgBrzMode="Berzerker Modus: ALLES wird gecrackt"
MsgCntFind="Nicht aufzufinden:"
MsgCopExec="Kopieren der Executable"
MsgCreDire="Erstellen der Ordner"
MsgDskFull="Kein Speicher mehr"
MsgInsCydi="Installieren mit Cydia"
MsgIpaDone="Fertig"
MsgMnuEmpt="leer"
MsgMarDone="Alle Apps als gecrackt markieren"
MsgSizUnit="B"
MsgWrgChoi="Schlechte Wahl"
MsgWarning="Warnung"
MsgYouChoi="Ihre Wahl"
MsgZipStep="Kompression der .ipa (Schritt"
MsgSgnAppl="Signieren der App"
MsgCopArtw="Kopieren des Artworks"
MsgFakMeta="und der falschen MetaData"
MsgNotMeta="und keine MetaData"
MsgFoundIt="Gefunden"
MsgWasAskd="Angefragt"
MsgErrrors="Fehler"
MsgBrzNoth="Nichts"
fi
# Language DE1 (ascii). Translation by Ushnak.
if [ $RClang = "DE1" ]; then
MsgBadChoi="$( echo -ne "Ung\0374ltige Wahl" )"
MsgBldMenu="$( echo -ne "Aufbau des Men\0374s..." )"
MsgIpaInco="$( echo -ne "Unvollst\0344ndige .ipa" )"
MsgEraMemo="$( echo -ne "L\0366schen des Zwischenspeichers" )"
MsgRemTemp="$( echo -ne "L\0366schen des Speichers" )"
MsgUnaLoca="$( echo -ne "Unm\0366glich zu Finden" )"
MsgWrnMeta="$( echo -ne "Das Format der iTunesMetaData wurde ge\0344ndert" )"
MsgMrkDone="$( echo -ne "Alles als angew\0344hlt " )"
MskZroDone="$( echo -ne "Liste der angew\0344hlten l\0366schen " )"
fi
# Language DE2 (utf8). Translation by Ushnak.
if [ $RClang = "DE2" ]; then
MsgBadChoi="$( echo -ne "Ung\0303\0274ltige Wahl" )"
MsgBldMenu="$( echo -ne "Aufbau des Men\0303\0274s..." )"
MsgIpaInco="$( echo -ne "Unvollst\0303\0244ndige .ipa" )"
MsgEraMemo="$( echo -ne "L\0303\0266schen des Zwischenspeichers" )"
MsgRemTemp="$( echo -ne "L\0303\0266schen des Speichers" )"
MsgUnaLoca="$( echo -ne "Unm\0303\0266glich zu Finden" )"
MsgWrnMeta="$( echo -ne "Das Format der iTunesMetaData wurde ge\0303\0244ndert" )"
MsgMrkDone="$( echo -ne "Alles als angew\0303\0244hlt " )"
MskZroDone="$( echo -ne "Liste der angew\0303\0244hlten l\0303\0266schen " )"
fi
# Language IT1 and IT2. Translation by Wfede21.
if [ $RClang = "IT1" -o $RClang = "IT2" ]; then
MsgAnaAppl="Analisi applicazione"
MsgAppLoca="Localizzo"
MsgBadChoi="Scelta sbagliata"
MsgBldMenu="Costruisco il menu..."
MsgCntFind="Impossibile trovare"
MsgCopExec="e copio l'eseguibile"
MsgCreDire="Creo le cartelle"
MsgIpaInco=".ipa non completa"
MsgDskFull="Memoria piena"
MsgEraMemo="Cancellando file di memoria"
MsgInsCydi="Installa da Cydia"
MsgIpaDone="Fatto come"
MsgMnuEmpt="vuoto"
MsgMarDone="Tutte le app craccate"
MsgRemTemp="Rimozione file temporanei"
MsgSizUnit="B"
MsgUnaLoca="Impossibile trovare"
MsgWrgChoi="Scelta sbagliata"
MsgWarning="Attenzione"
MsgWrnMeta="formato iTunesMetadata cambiato"
MsgYouChoi="La tua scelta"
MsgZipStep="Compressione .ipa (passo"
MsgSgnAppl="Signing the application"
MsgCopArtw="Copia di Artwork"
MsgFakMeta="e falsifico MetaData"
MsgNotMeta="e niente MetaData"
MsgFoundIt="Trovato"
MsgWasAskd="Chiesto"
MsgErrrors="Errore"
MsgBrzNoth="niente"
MsgMrkDone="Segna come tutte craccate "
MskZroDone="Azzera lista app craccate "
fi
# Language IT1 (ascii). Translation by Wfede21.
if [ $RClang = "IT1" ]; then
MsgBrzMode="$( echo -ne "Modalit\0340 Berzerk: crack di tutte le app" )"
fi
# Language IT2 (utf8). Translation by Wfede21.
if [ $RClang = "IT2" ]; then
MsgBrzMode="$( echo -ne "Modalit\0303\0240 Berzerk: crack di tutte le app" )"
fi
# Language VN. Translation by Lamapple.
if [ $RClang = "VN1" ]; then
MsgAnaAppl="$( echo -ne "\020\01ang Ph\0342n t\0355ch \0350\036ng d\0345\036ng" )"
MsgAppLoca="$( echo -ne "\020\01ang \021\01\0313\036nh v\0313\036" )"
MsgBadChoi="$( echo -ne "L\0361\036a ch\0315\036n t\0307\036" )"
MsgBldMenu="$( echo -ne "\020\01ang t\0241\036o menu..." )"
MsgBrzMode="$( echo -ne "Ch\0277\036 \021\01\0331\036 Berzerk: \020\01ang crack t\0245\036t c\0243\036" )"
MsgBrzNoth="$( echo -ne "Kh\0364ng c\0363 g\0354" )"
MsgCntFind="$( echo -ne "Kh\0364ng t\0354m th\0245\036y" )"
MsgCopArtw="$( echo -ne "\020\01ang sao ch\0351p \0242\036nh minh h\0315\036a" )"
MsgCopExec="$( echo -ne "v\0340 \021\01ang sao ch\0351p th\0361\036c thi" )"
MsgCreDire="$( echo -ne "\020\01ang t\0241\036o th\0260\01 m\0345\036c" )"
MsgDskFull="$( echo -ne "B\0331\036 nh\0333\036 \021\01\0247\036y" )"
MsgEraMemo="$( echo -ne "\020\01ang xo\0341 t\0255\036p tin b\0331\036 nh\0333\036" )"
MsgErrrors="$( echo -ne "L\0327\036i" )"
MsgFakMeta="$( echo -ne "v\0340 \021\01ang gi\0243\036 m\0241\036o MetaData" )"
MsgFoundIt="$( echo -ne "T\0354m th\0245\036y" )"
MsgInsCydi="$( echo -ne "C\0340i\021\01\0267\036t t\0353\036 Cydia" )"
MsgIpaDone="$( echo -ne "Th\0361\036c hi\0307\036n nh\0260\01" )"
MsgIpaInco="$( echo -ne "Ch\0260\01a ho\0340n th\0340nh .ipa" )"
MsgMarDone="$( echo -ne "\020\01\0341nh d\0245\036u t\0245\036t c\0243\036 c\0341c \0351\036ng d\0345\036ng \021\01\0260\01\0343\036c th\0361\036c hi\0307\036n" )"
MsgMnuEmpt="$( echo -ne "Tr\0321\036ng" )"
MsgNotMeta="$( echo -ne "v\0340 kh\0364ng c\0363 MetaData" )"
MsgRemTemp="$( echo -ne "\020\01ang lo\0241\036i b\0317\036 c\0341c t\0255\036p tin t\0241\036m th\0335\036i" )"
MsgSgnAppl="$( echo -ne "\020\01ang Sign c\0341c \0351\036ng d\0345\036ng" )"
MsgSizUnit="B"
MsgUnaLoca="$( echo -ne "Kh\0364ng th\0245\036y \021\01\0260\01\0335\036ng d\0253\036n" )"
MsgWarning="$( echo -ne "C\0243\036nh b\0341o" )"
MsgWasAskd="$( echo -ne "H\0317\036i" )"
MsgWrgChoi="$( echo -ne "L\0361\036a ch\0315\036n sai" )"
MsgWrnMeta="$( echo -ne "\020\01\0313\036nh d\0241\036ng iTunesMetadata \021\01\0343 thay \021\01\0325\036i" )"
MsgYouChoi="$( echo -ne "L\0361\036a ch\0315\036n c\0347\036a b\0241\036n" )"
MsgZipStep="$( echo -ne "\020\01ang n\0351n c\0341c .ipa (b\0260\01\0333\036c" )"
MsgMrkDone="$( echo -ne "\020\01\0341nh d\0245\036u t\0245\036t c\0243\036 \021\01\0260\01\0343\036c th\0361\036c hi\0307\036n " )"
MskZroDone="$( echo -ne "\020\01\0267\036t l\0241\036i danh s\0341ch \021\01\0260\01\0343\036c th\0361\036c hi\0307\036n " )"
fi
if [ $RClang = "VN2" ]; then
MsgAnaAppl="$( echo -ne "\0304\0220ang Ph\0303\0242n t\0303\0255ch \0341\0273\0250ng d\0341\0273\0245ng" )"
MsgAppLoca="$( echo -ne "\0304\0220ang \0304\0221\0341\0273\0213nh v\0341\0273\0213" )"
MsgBadChoi="$( echo -ne "L\0341\0273\0261a ch\0341\0273\0215n t\0341\0273\0207" )"
MsgBldMenu="$( echo -ne "\0304\0220ang t\0341\0272\0241o menu..." )"
MsgBrzMode="$( echo -ne "Ch\0341\0272\0277 \0304\0221\0341\0273\0231 Berzerk: \0304\0220ang crack t\0341\0272\0245t c\0341\0272\0243" )"
MsgBrzNoth="$( echo -ne "Kh\0303\0264ng c\0303\0263 g\0303\0254" )"
MsgCntFind="$( echo -ne "Kh\0303\0264ng t\0303\0254m th\0341\0272\0245y" )"
MsgCopArtw="$( echo -ne "\0304\0220ang sao ch\0303\0251p \0341\0272\0242nh minh h\0341\0273\0215a" )"
MsgCopExec="$( echo -ne "v\0303\0240 \0304\0221ang sao ch\0303\0251p th\0341\0273\0261c thi" )"
MsgCreDire="$( echo -ne "\0304\0220ang t\0341\0272\0241o th\0306\0260 m\0341\0273\0245c" )"
MsgDskFull="$( echo -ne "B\0341\0273\0231 nh\0341\0273\0233 \0304\0221\0341\0272\0247y" )"
MsgEraMemo="$( echo -ne "\0304\0220ang xo\0303\0241 t\0341\0272\0255p tin b\0341\0273\0231 nh\0341\0273\0233" )"
MsgErrrors="$( echo -ne "L\0341\0273\0227i" )"
MsgFakMeta="$( echo -ne "v\0303\0240 \0304\0221ang gi\0341\0272\0243 m\0341\0272\0241o MetaData" )"
MsgFoundIt="$( echo -ne "T\0303\0254m th\0341\0272\0245y" )"
MsgInsCydi="$( echo -ne "C\0303\0240i\0304\0221\0341\0272\0267t t\0341\0273\0253 Cydia" )"
MsgIpaDone="$( echo -ne "Th\0341\0273\0261c hi\0341\0273\0207n nh\0306\0260" )"
MsgIpaInco="$( echo -ne "Ch\0306\0260a ho\0303\0240n th\0303\0240nh .ipa" )"
MsgMarDone="$( echo -ne "\0304\0220\0303\0241nh d\0341\0272\0245u t\0341\0272\0245t c\0341\0272\0243 c\0303\0241c \0341\0273\0251ng d\0341\0273\0245ng \0304\0221\0306\0260\0341\0273\0243c th\0341\0273\0261c hi\0341\0273\0207n" )"
MsgMnuEmpt="$( echo -ne "Tr\0341\0273\0221ng" )"
MsgNotMeta="$( echo -ne "v\0303\0240 kh\0303\0264ng c\0303\0263 MetaData" )"
MsgRemTemp="$( echo -ne "\0304\0220ang lo\0341\0272\0241i b\0341\0273\0217 c\0303\0241c t\0341\0272\0255p tin t\0341\0272\0241m th\0341\0273\0235i" )"
MsgSgnAppl="$( echo -ne "\0304\0220ang Sign c\0303\0241c \0341\0273\0251ng d\0341\0273\0245ng" )"
MsgSizUnit="B"
MsgUnaLoca="$( echo -ne "Kh\0303\0264ng th\0341\0272\0245y \0304\0221\0306\0260\0341\0273\0235ng d\0341\0272\0253n" )"
MsgWarning="$( echo -ne "C\0341\0272\0243nh b\0303\0241o" )"
MsgWasAskd="$( echo -ne "H\0341\0273\0217i" )"
MsgWrgChoi="$( echo -ne "L\0341\0273\0261a ch\0341\0273\0215n sai" )"
MsgWrnMeta="$( echo -ne "\0304\0220\0341\0273\0213nh d\0341\0272\0241ng iTunesMetadata \0304\0221\0303\0243 thay \0304\0221\0341\0273\0225i" )"
MsgYouChoi="$( echo -ne "L\0341\0273\0261a ch\0341\0273\0215n c\0341\0273\0247a b\0341\0272\0241n" )"
MsgZipStep="$( echo -ne "\0304\0220ang n\0303\0251n c\0303\0241c .ipa (b\0306\0260\0341\0273\0233c" )"
MsgMrkDone="$( echo -ne "\0304\0220\0303\0241nh d\0341\0272\0245u t\0341\0272\0245t c\0341\0272\0243 \0304\0221\0306\0260\0341\0273\0243c th\0341\0273\0261c hi\0341\0273\0207n " )"
MskZroDone="$( echo -ne "\0304\0220\0341\0272\0267t l\0341\0272\0241i danh s\0303\0241ch \0304\0221\0306\0260\0341\0273\0243c th\0341\0273\0261c hi\0341\0273\0207n " )"
fi
# Language KU. Translation by Ak0-Sardashti.
if [ $RClang = "KU1" ]; then
MsgAnaAppl="$( echo -ne "/\06'\06H\06'\06\0251\061\06/\06F\06 (\06\0306\06 4\06\0314\06\0251\061\06/\06F\06\0325\06H\06\0325\06" )"
MsgAppLoca="$( echo -ne "4\06H\06J\06F\06 /\06J\06'\061\06I\06 C\061\06/\06F\06" )"
MsgBadChoi="$( echo -ne "G\06\0325\06\0265\06(\06\0230\06'\061\06/\06\0325\06\0314\06 .\061\06'\06~\06" )"
MsgBldMenu="$( echo -ne "D\06\0314\063\06*\06\0314\06 (\06F\06\0314\06'\06*\06 F\06'\06F\06..." )"
MsgBrzMode="$( echo -ne "Berzerk \0206\06\0306\06F\06*\06\0314\06\0325\06*\06\0314\06: \0251\06\0225\06'\06\0251\06 \0251\061\06/\06F\06\0314\06 G\06\0325\06E\06H\06H\06*\06" )"
MsgBrzNoth="$( echo -ne "G\06\0314\06\0206\06" )"
MsgCntFind="$( echo -ne "F\06\0325\06*\06H\06'\06F\061\06'\06 (\06/\06\0306\062\061\06\0316\06*\06\0325\06H\06\0325\06" )"
MsgCopArtw="$( echo -ne "D\06\0325\06(\06\0325\061\06\0257\061\06*\06F\06\0325\06H\06\0325\06\0314\06 \0251\06'\061\06\0325\06\0251\06\0325\06*\06" )"
MsgCopExec="$( echo -ne "H\06\0325\06 D\06\0325\06(\06\0325\061\06\0257\061\06*\06F\06\0325\06H\06\0325\06\0314\06 executable" )"
MsgCreDire="$( echo -ne "\0225\06\0316\06(\06\0325\061\06 /\061\06H\063\06*\06 /\06\0325\06\0251\06'\06*\06" )"
MsgDskFull="$( echo -ne "/\06J\063\06C\06 ~\06\0225\06" )"
MsgEraMemo="$( echo -ne "3\06\0225\06\0314\06F\06\0325\06H\06\0325\06\0314\06 A\06'\06\0314\06D\06\0314\06 E\06\0314\06E\06\0306\061\06\0314\06" )"
MsgErrrors="$( echo -ne "G\06\0325\06\0265\06\0325\06" )"
MsgFakMeta="$( echo -ne "H\06 2\06'\06F\06J\06'\061\06I\06 /\06\0325\061\06(\06'\061\06\0325\06I\06 2\06'\06F\06J\06'\061\06I\06 A\06\0316\06\0265\06(\06'\062\06 /\06'\06*\06" )"
MsgFoundIt="$( echo -ne "/\06\0306\062\06J\06J\06\0325\06H\06\0325\06" )"
MsgInsCydi="$( echo -ne "/\06'\06E\06\0325\062\06 1\06'\06F\06/\06F\06 D\06\0325\063\06\0314\06/\06\0314\06'\06" )"
MsgIpaDone="$( echo -ne "*\06\0325\06H\06'\06H\06 (\06H\06H\06 D\06\0325\06" )"
MsgIpaInco="$( echo -ne "F\06'\06*\06\0325\06H\06'\06H\06 .ipa" )"
MsgMarDone="$( echo -ne "F\06J\064\06'\06F\06 /\06\0325\06C\06'\06*\06 G\06\0325\06E\06H\06H\06 (\06\0325\061\06F\06'\06E\06\0325\06 *\06\0325\06H\06'\06H\06 (\06H\06H\06" )"
MsgMnuEmpt="$( echo -ne "(\06\0325\06*\06'\06\0265\06" )"
MsgNotMeta="$( echo -ne "H\06 F\06\0325\06.\06\0316\061\06 2\06'\06F\06J\06'\061\06I\06 /\06\0325\061\06 (\06'\061\06\0325\06I\06 2\06'\06F\06J\06'\061\06I\06" )"
MsgRemTemp="$( echo -ne "A\06'\06J\06D\06I\06 C\06'\06*\06I\06 D\06'\06 /\06\0325\06(\06'\06*\06" )"
MsgSgnAppl="$( echo -ne "/\06'\06H\06'\06 C\061\06/\06F\06\0325\06C\06\0325\06 &\06J\06E\062\06'\06 /\06\0325\06C\06'\06*\06" )"
MsgSizUnit="B"
MsgUnaLoca="$( echo -ne "F\06\0325\06*\06H\06'\06F\061\06'\06 4\06H\06\0316\06F\06\0325\06\0251\06\0325\06 /\06\0314\06'\061\06\0314\06 (\06\0251\061\06\0316\06*\06" )"
MsgWarning="$( echo -ne "G\06\0306\064\06/\06'\061\06I\06 /\06\0325\06/\06'\06*\06" )"
MsgWasAskd="$( echo -ne "/\06'\06H\06'\06 /\06\0325\06C\06'\06*\06" )"
MsgWrgChoi="$( echo -ne "G\06\0325\06\0265\06(\06\0230\06'\061\06/\06\0325\06\0314\06 G\06\0325\06\0265\06\0325\06" )"
MsgWrnMeta="$( echo -ne "iTunesMetadata 4\06\0316\06H\06\0325\06 \0257\06H\06\0225\06'\06I\06" )"
MsgYouChoi="$( echo -ne "G\06\0325\06\0265\06(\06\0230\06'\061\06/\06\0325\06\0314\06 *\06\0306\06" )"
MsgZipStep="$( echo -ne "/\06\0325\06~\06\0325\063\06*\06\0316\06*\06 .ipa (step" )"
MsgMrkDone="$( echo -ne "/\06\0314\06'\061\06\0314\06 \0251\061\06/\06F\06\0325\06\0251\06'\06F\06 *\06\0325\06H\06'\06H\06 \0251\061\06'\06 " )"
MskZroDone="$( echo -ne "D\06J\063\06*\06\0325\06I\06 *\06\0325\06H\06'\06H\06 (\06H\06H\06 \0225\06\0316\06C\06 /\06\0325\06.\06'\06*\06\0325\06H\06\0325\06 (\06\0325\06 " )"
fi
if [ $RClang = "KU2" ]; then
MsgAnaAppl="$( echo -ne "\0330\0257\0330\0247\0331\0210\0330\0247\0332\0251\0330\0261\0330\0257\0331\0206 \0330\0250\0333\0206 \0330\0264\0333\0214\0332\0251\0330\0261\0330\0257\0331\0206\0333\0225\0331\0210\0333\0225" )"
MsgAppLoca="$( echo -ne "\0330\0264\0331\0210\0331\0212\0331\0206 \0330\0257\0331\0212\0330\0247\0330\0261\0331\0211 \0331\0203\0330\0261\0330\0257\0331\0206" )"
MsgBadChoi="$( echo -ne "\0331\0207\0333\0225\0332\0265\0330\0250\0332\0230\0330\0247\0330\0261\0330\0257\0333\0225\0333\0214 \0330\0256\0330\0261\0330\0247\0331\0276" )"
MsgBldMenu="$( echo -ne "\0331\0204\0333\0214\0330\0263\0330\0252\0333\0214 \0330\0250\0331\0206\0333\0214\0330\0247\0330\0252 \0331\0206\0330\0247\0331\0206..." )"
MsgBrzMode="$( echo -ne "Berzerk \0332\0206\0333\0206\0331\0206\0330\0252\0333\0214\0333\0225\0330\0252\0333\0214: \0332\0251\0332\0225\0330\0247\0332\0251 \0332\0251\0330\0261\0330\0257\0331\0206\0333\0214 \0331\0207\0333\0225\0331\0205\0331\0210\0331\0210\0330\0252" )"
MsgBrzNoth="$( echo -ne "\0331\0207\0333\0214\0332\0206" )"
MsgCntFind="$( echo -ne "\0331\0206\0333\0225\0330\0252\0331\0210\0330\0247\0331\0206\0330\0261\0330\0247 \0330\0250\0330\0257\0333\0206\0330\0262\0330\0261\0333\0216\0330\0252\0333\0225\0331\0210\0333\0225" )"
MsgCopArtw="$( echo -ne "\0331\0204\0333\0225\0330\0250\0333\0225\0330\0261\0332\0257\0330\0261\0330\0252\0331\0206\0333\0225\0331\0210\0333\0225\0333\0214 \0332\0251\0330\0247\0330\0261\0333\0225\0332\0251\0333\0225\0330\0252" )"
MsgCopExec="$( echo -ne "\0331\0210\0333\0225 \0331\0204\0333\0225\0330\0250\0333\0225\0330\0261\0332\0257\0330\0261\0330\0252\0331\0206\0333\0225\0331\0210\0333\0225\0333\0214 executable" )"
MsgCreDire="$( echo -ne "\0332\0225\0333\0216\0330\0250\0333\0225\0330\0261 \0330\0257\0330\0261\0331\0210\0330\0263\0330\0252 \0330\0257\0333\0225\0332\0251\0330\0247\0330\0252" )"
MsgDskFull="$( echo -ne "\0330\0257\0331\0212\0330\0263\0331\0203 \0331\0276\0332\0225" )"
MsgEraMemo="$( echo -ne "\0330\0263\0332\0225\0333\0214\0331\0206\0333\0225\0331\0210\0333\0225\0333\0214 \0331\0201\0330\0247\0333\0214\0331\0204\0333\0214 \0331\0205\0333\0214\0331\0205\0333\0206\0330\0261\0333\0214" )"
MsgErrrors="$( echo -ne "\0331\0207\0333\0225\0332\0265\0333\0225" )"
MsgFakMeta="$( echo -ne "\0331\0210 \0330\0262\0330\0247\0331\0206\0331\0212\0330\0247\0330\0261\0331\0211 \0330\0257\0333\0225\0330\0261\0330\0250\0330\0247\0330\0261\0333\0225\0331\0211 \0330\0262\0330\0247\0331\0206\0331\0212\0330\0247\0330\0261\0331\0211 \0331\0201\0333\0216\0332\0265\0330\0250\0330\0247\0330\0262 \0330\0257\0330\0247\0330\0252" )"
MsgFoundIt="$( echo -ne "\0330\0257\0333\0206\0330\0262\0331\0212\0331\0212\0333\0225\0331\0210\0333\0225" )"
MsgInsCydi="$( echo -ne "\0330\0257\0330\0247\0331\0205\0333\0225\0330\0262 \0330\0261\0330\0247\0331\0206\0330\0257\0331\0206 \0331\0204\0333\0225\0330\0263\0333\0214\0330\0257\0333\0214\0330\0247" )"
MsgIpaDone="$( echo -ne "\0330\0252\0333\0225\0331\0210\0330\0247\0331\0210 \0330\0250\0331\0210\0331\0210 \0331\0204\0333\0225" )"
MsgIpaInco="$( echo -ne "\0331\0206\0330\0247\0330\0252\0333\0225\0331\0210\0330\0247\0331\0210 .ipa" )"
MsgMarDone="$( echo -ne "\0331\0206\0331\0212\0330\0264\0330\0247\0331\0206 \0330\0257\0333\0225\0331\0203\0330\0247\0330\0252 \0331\0207\0333\0225\0331\0205\0331\0210\0331\0210 \0330\0250\0333\0225\0330\0261\0331\0206\0330\0247\0331\0205\0333\0225 \0330\0252\0333\0225\0331\0210\0330\0247\0331\0210 \0330\0250\0331\0210\0331\0210" )"
MsgMnuEmpt="$( echo -ne "\0330\0250\0333\0225\0330\0252\0330\0247\0332\0265" )"
MsgNotMeta="$( echo -ne "\0331\0210 \0331\0206\0333\0225\0330\0256\0333\0216\0330\0261 \0330\0262\0330\0247\0331\0206\0331\0212\0330\0247\0330\0261\0331\0211 \0330\0257\0333\0225\0330\0261 \0330\0250\0330\0247\0330\0261\0333\0225\0331\0211 \0330\0262\0330\0247\0331\0206\0331\0212\0330\0247\0330\0261\0331\0211" )"
MsgRemTemp="$( echo -ne "\0331\0201\0330\0247\0331\0212\0331\0204\0331\0211 \0331\0203\0330\0247\0330\0252\0331\0211 \0331\0204\0330\0247 \0330\0257\0333\0225\0330\0250\0330\0247\0330\0252" )"
MsgSgnAppl="$( echo -ne "\0330\0257\0330\0247\0331\0210\0330\0247 \0331\0203\0330\0261\0330\0257\0331\0206\0333\0225\0331\0203\0333\0225 \0330\0246\0331\0212\0331\0205\0330\0262\0330\0247 \0330\0257\0333\0225\0331\0203\0330\0247\0330\0252" )"
MsgSizUnit="$( echo -ne "\0330\0250" )"
MsgUnaLoca="$( echo -ne "\0331\0206\0333\0225\0330\0252\0331\0210\0330\0247\0331\0206\0330\0261\0330\0247 \0330\0264\0331\0210\0333\0216\0331\0206\0333\0225\0332\0251\0333\0225 \0330\0257\0333\0214\0330\0247\0330\0261\0333\0214 \0330\0250\0332\0251\0330\0261\0333\0216\0330\0252" )"
MsgWarning="$( echo -ne "\0331\0207\0333\0206\0330\0264\0330\0257\0330\0247\0330\0261\0331\0211 \0330\0257\0333\0225\0330\0257\0330\0247\0330\0252" )"
MsgWasAskd="$( echo -ne "\0330\0257\0330\0247\0331\0210\0330\0247 \0330\0257\0333\0225\0331\0203\0330\0247\0330\0252" )"
MsgWrgChoi="$( echo -ne "\0331\0207\0333\0225\0332\0265\0330\0250\0332\0230\0330\0247\0330\0261\0330\0257\0333\0225\0333\0214 \0331\0207\0333\0225\0332\0265\0333\0225" )"
MsgWrnMeta="$( echo -ne "iTunesMetadata \0330\0264\0333\0216\0331\0210\0333\0225 \0332\0257\0331\0210\0332\0225\0330\0247\0331\0211" )"
MsgYouChoi="$( echo -ne "\0331\0207\0333\0225\0332\0265\0330\0250\0332\0230\0330\0247\0330\0261\0330\0257\0333\0225\0333\0214 \0330\0252\0333\0206" )"
MsgZipStep="$( echo -ne "\0330\0257\0333\0225\0331\0276\0333\0225\0330\0263\0330\0252\0333\0216\0330\0252 .ipa (step" )"
MsgMrkDone="$( echo -ne "\0330\0257\0333\0214\0330\0247\0330\0261\0333\0214 \0332\0251\0330\0261\0330\0257\0331\0206\0333\0225\0332\0251\0330\0247\0331\0206 \0330\0252\0333\0225\0331\0210\0330\0247\0331\0210 \0332\0251\0330\0261\0330\0247 " )"
MskZroDone="$( echo -ne "\0331\0204\0331\0212\0330\0263\0330\0252\0333\0225\0331\0211 \0330\0252\0333\0225\0331\0210\0330\0247\0331\0210 \0330\0250\0331\0210\0331\0210 \0332\0225\0333\0216\0331\0203 \0330\0257\0333\0225\0330\0256\0330\0247\0330\0252\0333\0225\0331\0210\0333\0225 \0330\0250\0333\0225 " )"
fi
}
# ======
function UnicodeToHuman
{
# Convert from unicode to human, and remove unwanted chars
human=$(echo -n "$unicode" | sed -e "s: :_:g" | od -c -A n -v --width=999 | sed \
-e 's:+:Plus:g' \
-e 's:302.240:_:g' \
-e 's:302.251:_:g' \
-e 's:302.256:_:g' \
-e 's:302.260:Degree:g' \
-e "s:302.264:':g" \
-e 's:303.201:A:g' \
-e 's:303.207:C:g' \
-e 's:303.211:E:g' \
-e 's:303.216:I:g' \
-e 's:303.224:O:g' \
-e 's:303.234:U:g' \
-e 's:303.237:B:g' \
-e 's:303.240:a:g' \
-e 's:303.241:a:g' \
-e 's:303.242:a:g' \
-e 's:303.245:a:g' \
-e 's:303.247:c:g' \
-e 's:303.250:e:g' \
-e 's:303.251:e:g' \
-e 's:303.252:e:g' \
-e 's:303.253:e:g' \
-e 's:303.255:i:g' \
-e 's:303.256:i:g' \
-e 's:303.257:i:g' \
-e 's:303.263:o:g' \
-e 's:303.264:o:g' \
-e 's:303.266:o:g' \
-e 's:303.270:o:g' \
-e 's:303.271:u:g' \
-e 's:303.273:u:g' \
-e 's:303.274:u:g' \
-e 's:304.237:g:g' \
-e 's:304.261:i:g' \
-e 's:305.215:o:g' \
-e 's:305.223:oe:g' \
-e 's:312.236:k:g' \
-e 's:316.251:Omega:g' \
-e 's:342.200.223:-:g' \
-e 's:342.200.224:-:g' \
-e "s:342.200.230:':g" \
-e "s:342.200.231:':g" \
-e 's:342.200.242:-:g' \
-e 's:342.200.246:...:g' \
-e 's:342.202.254:EUR:g' \
-e 's:342.204.242:_:g' \
-e 's:342.210.236:Infinity:g' \
-e 's:342.213.205:.:g' \
-e 's:342.226.272:_:g' \
-e 's:342.227.217:-:g' \
-e 's:342.230.205:_:g' \
-e 's:342.231.253:_:g' \
-e 's:342.235.222:_:g' \
-e 's:347.246.205:_:g' \
| tr -cd "[:alnum:][_'.][-]" | sed -e "s:_: :g" | sed -e "s: : :g" )
# Todo: future enhancements
# Help wanted for unknown or other unicodes
}
# ======
function DisplayBars
{
ProgressPct=""
if [ $RCbarNum = "YES" ]; then
ProgressXXX=$(( $BarCols * $ProgressDone / $ProgressTarget ))
ProgressSSS=$(( $BarCols - $ProgressXXX ))
ProgressPct=$(( 100 * $ProgressDone / $ProgressTarget ))
echo "[${escGreen}${RCxxx:0:$ProgressXXX}${escBlue}${RCsss:0:$ProgressSSS}${escReset}] $ProgressPct%"
fi
if [ $RCbarSize = "YES" ]; then
ProgressXXX=$(( $BarCols * $ProgressDoneSize / $ProgressTargetSize ))
ProgressSSS=$(( $BarCols - $ProgressXXX ))
ProgressPct=$(( 100 * $ProgressDoneSize / $ProgressTargetSize ))
echo "[${escCyan}${RCxxx:0:$ProgressXXX}${escBlue}${RCsss:0:$ProgressSSS}${escReset}] $ProgressPct%"
fi
if [ ! -z "$ProgressPct" -a $RCspeak = "YES" ]; then
su mobile -c "speak $ProgressPct %" &
fi
}
# ======
# Begin Dyldo Function
#µ#function DyldoFunction
#µ#{
#µ# # String to find: name of the dyld to patch
#µ# DyldoName="$1"
#µ# # Offset, from found string, of value to patch
#µ# DyldoOffset="$2"
#µ# # Offset of current part in the executable
#µ# DyldoCurOff="$3"
#µ#
#µ# # Does this app have this dyld inside its headers?
#µ# if [ ! -z "$(grep "$DyldoName" "$DeepWorkDir/$DeepAppName/Dyldo.Head")" ]; then
#µ# # Locate the position of this dyld
#µ# cat "$DeepWorkDir/$DeepAppName/Dyldo.Head" | tr '\n' ' ' | tr '\0' ' ' | sed -e "s:$DyldoName.*:$DyldoName:g" > "$DeepWorkDir/$DeepAppName/Dyldo.tmp"
#µ# DyldoLong=$(stat -c%s "$DeepWorkDir/$DeepAppName/Dyldo.tmp")
#µ# rm -f "$DeepWorkDir/$DeepAppName/Dyldo.tmp"
#µ# # Which value is there?
#µ# DyldoWeak=$(dd bs=1 count=1 skip=$(($DyldoLong - $DyldoOffset)) if="$DeepWorkDir/$DeepAppName/Dyldo.Head" 2> /dev/null | od -A n -t u -v )
#µ#
#µ# # 12 (LC_LOAD_DYLIB = 0xc) or 24 (LC_LOAD_WEAK_DYLIB = 0x18)
#µ# if [ $DyldoWeak != 24 ]; then
#µ# if [ $DyldoWeak != 12 ]; then
#µ# echo "${Meter36}${escRed}Error:${escReset} dyldo not 12 and not 24! ($DyldoWeak)"
#µ# else
#µ# echo "${Meter36}${escYellow}Note:${escReset} deeply dyldoing!"
#µ# foo=$(echo 24 | awk '{ printf("%c",$0); }' | dd bs=1 seek=$(($DyldoCurOff + $DyldoLong - $DyldoOffset)) conv=notrunc status=noxfer of="$DeepWorkDir/$DeepAppName/$RandRand$DeepAppExec" 2>&1> /dev/null)
#µ# # (LC_REQ_DYLD = 0x80000000)
#µ# foo=$(echo 128 | awk '{ printf("%c",$0); }' | dd bs=1 seek=$(($DyldoCurOff + $DyldoLong - $DyldoOffset + 3)) conv=notrunc status=noxfer of="$DeepWorkDir/$DeepAppName/$RandRand$DeepAppExec" 2>&1> /dev/null)
#µ# ##Fixed=" DYLD"
#µ# fi
#µ# fi
#µ# fi
#µ#}
# ======
# Begin Core Function
function CoreFunction
{
# App to process
AppInput=$1
# Cracker's name and credits
CrackerName=$2
CreditFile=$3
if [ ! "$CrackerName" ]; then
CrackerName="$RCcracker"
fi
if [ ! "$CreditFile" ]; then
CreditFile="$CrackerName"
fi
# Script has app's full directory path as input (ie: called from GUI)
if [ -d "$AppInput" ]; then
tempLoc=$AppInput
# Script is called by RemoteRasticrac from "/tmp/"
if [ "${AppInput:0:5}" = "/tmp/" ]; then
RCremote="YES"
# Compression must be "low" on the iDevice; "high" recompression will be done later by the Computer/PC
RCcompression="-2"
fi
else
# Script has app's name as input
echo "$MsgAppLoca '$AppInput'"
# Escape the "*" as ".*"
AppGrep=$(echo "/$AppInput\.app" | sed "s:\*:\.\*:g")
if [ -e $lsd ]; then
tempLoc=$(grep -i "$AppGrep" $lsd)
else
tempLoc=""
fi
if [ -z "$tempLoc" ]; then
echo "$MsgUnaLoca '$AppInput'"
rm -f $lsd
return 1
fi
AppCount=$(echo "$tempLoc" | wc -l)
if [ $AppCount -gt 1 ]; then
echo "$MsgFoundIt $AppCount installation directories:"
echo "$tempLoc"
rm -f $lsd
return 1
fi
fi
# The app has been found
MenuFound=$(($MenuFound + 1))
AppPath=$(dirname "$tempLoc")
AppName=$(basename "$tempLoc")
echo -n "${Meter4}${escCyan}$MsgFoundIt ${escReset}'$(echo $AppName | sed "s:\\.app::")': "
if [ ! -d "$AppPath" ]; then
echo "$MsgUnaLoca original installation directory"
return 1
fi
if [ ! -d "$AppPath/$AppName" ]; then
echo "$MsgUnaLoca .app directory"
return 1
fi
AppExec=$(plutil -key CFBundleExecutable "$tempLoc/Info.plist" 2> /dev/null)
AppIdentifier=$(plutil -key CFBundleIdentifier "$tempLoc/Info.plist" 2> /dev/null)
if [ ! -e "$AppPath/$AppName/$AppExec" ]; then
echo "$MsgUnaLoca executable"
return 1
fi
# Get the name from MetaData
AppDisplayName=$(plutil -key itemName "$AppPath/iTunesMetadata.plist" 2> /dev/null)
# No alphanum characters at all?
AppDisplayNameAlpha=$(echo -n "$AppDisplayName" | tr -cd "[:alnum:]")
if [ "$AppDisplayNameAlpha" = "" ]; then
#echo "${Meter5}$MsgWarning: non-alpha name!"
AppDisplayName=""
fi
# Get the name from InfoPlist or from executable name
if [ "$AppDisplayName" = "" ]; then
AppDisplayName=$(plutil -key CFBundleDisplayName "$tempLoc/Info.plist" 2> /dev/null)
AppDisplayNameAlpha=$(echo -n "$AppDisplayName" | tr -cd "[:alnum:]")
if [ "$AppDisplayNameAlpha" = "" ]; then
AppDisplayName=$(plutil -key CFBundleName "$tempLoc/Info.plist" 2> /dev/null)
AppDisplayNameAlpha=$(echo -n "$AppDisplayName" | tr -cd "[:alnum:]")
if [ "$AppDisplayNameAlpha" = "" ]; then
AppDisplayName=$AppExec
#AppDisplayNameAlpha=$(echo -n "$AppDisplayName" | tr -cd "[:alnum:]")
#if [ "$AppDisplayNameAlpha" = "" ]; then
# echo "${Meter5}$MsgWarning: too exotic name!"
#fi
fi
fi
fi
# Convert AppName from unicode to human
unicode=$AppDisplayName
UnicodeToHuman
AppDisplayName=$human
# Get the artist name from MetaData
if [ $RCartistfrommeta = "YES" ]; then
artistName=$(plutil -key artistName "$AppPath/iTunesMetadata.plist" 2> /dev/null)
artistNameAlpha=$(echo -n "$artistName" | tr -cd "[:alnum:]")
# At least some alphanum inside?
if [ "$artistNameAlpha" != "" ]; then
# Convert from unicode to human
unicode=$artistName
UnicodeToHuman
AppDisplayName="$AppDisplayName [$human]"
fi
fi
# Show the real human name of the app
echo "${Meter6}$AppDisplayName"
# Is it an AppSliced/AppThined app?
appSliced=$(plutil -key variantID "$AppPath/iTunesMetadata.plist" 2> /dev/null)
if [ "$appSliced" != "" ]; then
echo "${escRed}DANGER!${escReset} This app is AppSliced!!"
echo "${escRed}DANGER!${escReset} AppSlicing kills baby seals!!"
return 1
fi
# Dealing with version numbers
AppVer=$(plutil -key CFBundleVersion "$tempLoc/Info.plist" 2> /dev/null | tr -d "\n\r")
AppShortVer=$(plutil -key CFBundleShortVersionString "$tempLoc/Info.plist" 2> /dev/null | tr -d "\n\r")
if [ ! "$AppShortVer" = "" ]; then
if [ ! "$AppShortVer" = "$AppVer" ]; then
AppVer="$AppShortVer v$AppVer"
fi
fi
MinOS=$(plutil -key MinimumOSVersion "$tempLoc/Info.plist" 2> /dev/null | tr -d ".")
if [ "$MinOS" = "" ]; then
echo "${Meter7}${escYellow}$MsgWarning:${escReset} unable to get MinOS"
MinOS="000"
fi
# Flags in ipa's name
Patched=""
Extras=""
ExtrasMatos=""
ExtrasAslr=""
AppleWatchSuccess="perhaps"
# List of files to exclude from second zip
tempexcl=$(mktemp)
# Don't know why, but we will always exclude this one
echo "Payload/GeoJSON" >> $tempexcl
echo "*SC_Info/*" >> $tempexcl
echo "Payload/iTunesMetadata.plist" >> $tempexcl
echo "Payload/iTunesArtwork" >> $tempexcl
# Does it need at least an iPhone3GS?
Required=$(plutil -key 'UIRequiredDeviceCapabilities' "$tempLoc/Info.plist" 2> /dev/null)
if [ ! -z "$(echo "$Required" | grep -e "armv7" -e "opengles-2")" ]; then
ExtrasMatos=" 3GS"
fi
# Does it need at least an iPhone4?
if [ ! -z "$(echo "$Required" | grep -e "front-facing-camera" -e "gyroscope")" ]; then
ExtrasMatos=" iPhone4"
fi
# Does it need at least an iPhone4S?
if [ ! -z "$(echo "$Required" | grep -e "bluetooth-le")" ]; then
ExtrasMatos=" iPhone4S"
fi
# Does it need at least an iPhone5S?
if [ ! -z "$(echo "$Required" | grep -e "opengles-3")" ]; then
ExtrasMatos=" iPhone5S"
fi
# "metal"
# "peer-peer"
# Is it iPad compatible only? Or universal?
iPad=$(plutil -key 'UIDeviceFamily' "$tempLoc/Info.plist" 2> /dev/null)
if [ ! -z "$iPad" ]; then
if [ -z "$(echo "$iPad" | grep -e "1")" ]; then
ExtrasMatos=" iPad"
# Does it need at least an iPad2?
if [ ! -z "$(echo "$Required" | grep -e "video-camera")" ]; then
ExtrasMatos=" iPad2"
fi
else
if [ ! -z "$(echo "$iPad" | grep -e "2")" ]; then
ExtrasMatos="$ExtrasMatos Univ"
fi
fi
fi
# Creating temporary directory
if [ $RCverbose = "YES" ]; then
echo -n "${Meter10}$MsgCreDire "
fi
# Old iOS structure
if [ "$vma" = "$vmd" ]; then
WorkDir="/tmp/RC-$(date +%Y%m%d-%H%M%S)"
# New iOS structure
else
# Temporary temp-directory with root rights
# Clean it if it exists
if [ -e "$RooRoo" ]; then
rm -fr "$RooRoo"
fi
# It still exists? Problem
if [ -e "$RooRoo" ]; then
echo "${escRed}FAIL!${escReset} You must be 'root' (?)"
return 1
fi
# Creating clean empty directory
mkdir "$RooRoo" 2> /dev/null
# It doesn't exist? Problem
if [ ! -e "$RooRoo" ]; then
echo "${escRed}FAIL!${escReset} You must be 'root' (?)"
return 1
fi
chmod 777 "$RooRoo"
WorkDir="$RooRoo/RC-$(date +%Y%m%d-%H%M%S)"
fi
NewAppDir="$HOME/Documents/Cracked"
if [ -e "$WorkDir" ]; then
rm -rf "$WorkDir"
fi
mkdir -p "$WorkDir"
if [ ! -e "$NewAppDir" ]; then
mkdir -p "$NewAppDir"
fi
mkdir -p "$WorkDir/$AppName"
if [ ! -d "$WorkDir" -o ! -d "$NewAppDir" -o ! -d "$WorkDir/$AppName" ]; then
echo "failed! Directories not created"
return 1
fi
# Adding date
DayToday="$( date +%Y-%m-%d )"
# Adding credits file
if [ ! "$CrackerName" = "Anonymous" ]; then
if [ $RCverbose = "YES" ]; then
echo "${Meter65}Adding Credits"
fi
echo "Cracked by $CrackerName ($DayToday)" > "$WorkDir/$AppName/$CreditFile"
if [ ! -e "$AppPath/$AppName/$AppExec.crc" ]; then
echo "CheckSum=$(echo -n "$CrackerName" | od -A n -t x1 -v | tr -d ' ','\n')" > "$WorkDir/$AppName/$AppExec.crc"
touch -r "$AppPath/$AppName/$AppExec" "$WorkDir/$AppName/$AppExec.crc"
fi
fi
# Building .ipa (step 1)
mkdir -p "$WorkDir/Payload"
if [ ! -e "$WorkDir/Payload" ]; then
echo "Failed to create Payload directory"
rm -fr "$WorkDir"
return 1
fi
echo "${escGreen}Preparing to dump..${escReset}"
# Do actual cracking
/usr/bin/Clutch -b "$AppIdentifier" > /tmp/clutch_output
if [ "$?" -ne 0 ]; then
cat /tmp/clutch_output
echo "${escRed}Uh oh Clutch error, goodbye :(${escReset}"
rm -r "$WorkDir"
return 1
fi
#cat /tmp/clutch_output
output_folder=$(cat /tmp/clutch_output | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | awk '{print $NF}' | tr -d '\040\011\012\015')
echo "Output folder: $output_folder"
cd "$output_folder"
for d in */ ; do
if [ ! -e "$d/filesToAdd.plist" ]; then
echo "${escRed}Could not find replacement binary directory!?!?!${escReset}"
rm -rf "$WorkDir"
return 1
fi
plutil -keys "$d/filesToAdd.plist" > /tmp/clutch_output
while read entry; do
final_path=$(plutil -key "$entry" "$d/filesToAdd.plist")
final_path_folder=$(dirname "$final_path")
mkdir -p "$WorkDir/$final_path_folder"
mv "$entry" "$WorkDir/$final_path"
done < /tmp/clutch_output
done
if [ $RCverbose = "YES" ]; then
echo -n "${Meter66}$MsgCopArtw "
fi
if [ -e "$AppPath/iTunesArtwork" ]; then
cp -a "$AppPath/iTunesArtwork" "$WorkDir/"
# Timestamp ArtWork to protect cracker
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/iTunesArtwork"
else
echo "${Meter66}failed!"
fi
cp -r "$AppPath/$AppName/_CodeSignature/" "$WorkDir/Payload/$AppName/_CodeSignature/"
# Faking MetaData
if [ $RCverbose = "YES" ]; then
if [ $RCmetadata = "YES" ]; then
echo "${Meter69}$MsgFakMeta"
else
echo "${Meter69}$MsgNotMeta"
fi
fi
if [ "$CrackerName" = "Anonymous" ]; then
CrackedBy="Pommes.Pont.Neuf@apple.com"
else
CrackedBy="$CrackerName@cracked.by"
echo "${Patched}RC$CrackerName" | tr -cd "[:alnum:]" | tr "[A-Z][a-z][1-9]" "[1-9][a-z][A-Z]" > "$WorkDir/Payload/$AppName/_CodeSignature/ResourceRules"
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/Payload/$AppName/_CodeSignature/ResourceRules"
fi
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/Payload/$AppName/_CodeSignature/"
if [ -e "$AppPath/iTunesMetadata.plist" ]; then
cp "$AppPath/iTunesMetadata.plist" "$WorkDir/iTunesMetadataSource.plist"
else
echo "${Meter69}${escRed}Error:${escReset} problem with MetaData!"
plutil -create "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
fi
# Convert to pure text (if binary plist)
plutil -xml "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
# Remove unwanted keys and subkeys; some keys show your name/email/account/etc
plutil -remove -key 'com.apple.iTunesStore.downloadInfo' "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
plutil -remove -key 'asset-info' "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
plutil -remove -key 'is-purchased-redownload' "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
plutil -remove -key 'storeCohort' "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
plutil -remove -key 'userName' "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
plutil -remove -key 'sourceApp' "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/null
# Building lines
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > "$WorkDir/iTunesMetadata.plist"
echo "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" >> "$WorkDir/iTunesMetadata.plist"
echo "<plist version=\"1.0\">" >> "$WorkDir/iTunesMetadata.plist"
echo "<dict>" >> "$WorkDir/iTunesMetadata.plist"
grep -A99 "<key>UIRequiredDeviceCapabilities</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 -e "</dict>" -e "<dict/>" >> "$WorkDir/iTunesMetadata.plist"
echo -e "\t<key>appleId</key>" >> "$WorkDir/iTunesMetadata.plist"
echo -e "\t<string>$CrackedBy</string>" >> "$WorkDir/iTunesMetadata.plist"
echo -e "\t<key>purchaseDate</key>" >> "$WorkDir/iTunesMetadata.plist"
echo -e "\t<date>2015-11-11T11:11:11Z</date>" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>appleWatchEnabled</key>" "$WorkDir/iTunesMetadataSource.plist" | sed -e "s:true:$AppleWatchSuccess:g" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>artistId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>artistName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>bundleDisplayName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>bundleShortVersionString</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>bundleVersion</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>buy-only</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>buyParams</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>copyright</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>drmVersionNumber</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>fileExtension</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>gameCenterEnabled</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>gameCenterEverEnabled</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 -m1 "<key>genre</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 -m1 "<key>genreId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>itemId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>itemName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>kind</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>playlistArtistName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>playlistName</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>price</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>priceDisplay</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>product-type</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A99 "<key>rating</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</dict>" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>releaseDate</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>s</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>software-type</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>softwareIcon57x57URL</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>softwareIconNeedsShine</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A99 "<key>softwareSupportedDeviceIds</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</array>" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>softwareVersionBundleId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>softwareVersionExternalIdentifier</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A99 "<key>softwareVersionExternalIdentifiers</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</array>" >> "$WorkDir/iTunesMetadata.plist"
# ???? <key>sourceApp</key> ????
grep -A99 "<key>subgenres</key>" "$WorkDir/iTunesMetadataSource.plist" | grep -m1 -B99 "</array>" >> "$WorkDir/iTunesMetadata.plist"
# ???? <key>transitGeoFileURL</key><string> ????
# ???? variantID ????
grep -A1 "<key>vendorId</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
grep -A1 "<key>versionRestrictions</key>" "$WorkDir/iTunesMetadataSource.plist" >> "$WorkDir/iTunesMetadata.plist"
echo "</dict>" >> "$WorkDir/iTunesMetadata.plist"
echo -e "</plist>\n" >> "$WorkDir/iTunesMetadata.plist"
# Timestamp Metadata to protect cracker
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/iTunesMetadata.plist"
# Add ItemId in filename
if [ $RCitemId = "YES" ]; then
Heidi="{$(grep -A1 "<key>itemId</key>" "$WorkDir/iTunesMetadataSource.plist" | grep "<integer>" | tr -d "\t" | sed -e 's:<integer>::g' -e 's:</integer>::g' )}."
else
Heidi=""
fi
# Check for possible iTunesMetadata format changes
rm -f /tmp/diff.txt
diff "$WorkDir/iTunesMetadataSource.plist" "$WorkDir/iTunesMetadata.plist" > /tmp/diff.txt
rm -f "$WorkDir/iTunesMetadataSource.plist"
NewFields=$(wc -l /tmp/diff.txt | cut -f 1 -d " ")
if [ $NewFields -ne "11" -a $NewFields -ne "7" ]; then
echo "${Meter70}${escYellow}$MsgWarning:${escReset} $MsgWrnMeta ?"
if [ "$DebugMode" = "YES" ]; then
echo "( $NewFields )"
cat /tmp/diff.txt
fi
fi
rm -f /tmp/diff.txt
# Don't want MetaData? Keeping a backup
if [ ! $RCmetadata = "YES" ]; then
mv "$WorkDir/iTunesMetadata.plist" "$WorkDir/iTunesMetadata$RCmetadatafilename.plist"
fi
# If AppleWatchThings are a success
if [ "$AppleWatchSuccess" = "true" ]; then
ExtrasAslr="$ExtrasAslr AW"
fi
# Want Extras in filename?
if [ $RCextras = "YES" ]; then
Extras="$ExtrasMatos$ExtrasAslr"
fi
echo "_____"
cat $tempexcl
echo "_____"
# Building ipa's filename, adding AppVersion and MinOsVersion, adding CrackerName
if [ "$CrackerName" = "Anonymous" ]; then
CrackedBy=""
ZipComment="On $iOSver with RC$RCversion ($DayToday) $Patched"
else
CrackedBy="-$CrackerName"
ZipComment="From $CrackerName on $iOSver with RC$RCversion ($DayToday) $Patched"
fi
# ZipComment can't be added inside ".zip'scomment" anymore (recent iOSes block when installation is done from iTunes)
echo -n "$ZipComment" > "$WorkDir/.ZipComment"
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/.ZipComment"
# Cutting too long app name
AppDisplayName=${AppDisplayName:0:150}
IPAName="$NewAppDir/$Heidi$AppDisplayName (v$AppVer$Extras$Patched os$MinOS)$CrackedBy.RastiClutch(${RCversion}_$iOSver).ipa"
#IPAName="$NewAppDir/$Heidi$(echo -n "$AppDisplayName" | tr " " ".")-v$AppVer$CrackedBy.RastiClutch${RCversion}_$iOSver.ipa"
# When RemoteMode, remember the real ipa's filename and use generic name instead.
if [ "$RCremote" = "YES" ]; then
echo "$(basename "$IPAName")" > /tmp/REMOTEname.txt
IPAName="/tmp/REMOTEout.zip"
fi
# If check-only mode (for debug), don't create real ipa but an empty proof file
if [ $RCcheck = "YES" ]; then
printf -v CRC '%x' $(cksum "$WorkDir/Payload/$AppName/$AppExec" | cut -f 1 -d ' ')
touch "$IPAName.$CRC.checked"
echo "${Meter100}${escGreen}Check:${escReset} $AppDisplayName (v$AppVer$Extras$Patched os$MinOS)."
rm -fr "$WorkDir"
echo "$tempLoc" >> /var/mobile/.cracked.log
MenuOK=$(($MenuOK + 1))
return 0
fi
# For debug only
if [ "$DebugMode" = "YES" ]; then
IPAName="$IPAName.DEBUG1"
fi
#DEBUG
#FreeSize=$(df -m "$NewAppDir/" | grep disk | awk '{print $4}')
#echo "${Meter74}Debug: free size on device [$FreeSize M$MsgSizUnit]"
#DEBUG
# Size of first data to compress
FirstSize=$(du -m -s "$WorkDir" | cut -f 1)
echo "${Meter75}$MsgZipStep 1) [$FirstSize M$MsgSizUnit]"
# Timestamping
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/Payload/$AppName/"
touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/Payload/"
cd "$WorkDir"
rm -f "$IPAName"
rm -f "$IPAName.temp"
# Script version number in zip's comment
# Faster ipa thanks to smart files order (?)
ZipError=$( zip $RCcompression -y -m -r "$IPAName.temp" iTunesMetadata$RCmetadatafilename.plist iTunesArtwork .ZipComment Payload/ 2>&1> /dev/null )
cd "$PwdPwd" 2>&1> /dev/null
if [ ! -z "$ZipError" ]; then
echo "${Meter76}${escRed}ZipError${escReset}: \"$( echo "$ZipError" | tr -d "\t\n" )\""
fi
if [ ! -e "$IPAName.temp" ]; then
echo "${escRed}Failed to compress the .ipa${escReset}"
rm -fr "$WorkDir"
return 1
fi
# RemoteRasticrac only does one zip step
if [ "$RCremote" != "YES" ]; then
# Remember size of .ipa after step 1
ZipSize=$(stat -c%s "$IPAName.temp")
# Building .ipa (step 2)
# Using a SymbolicLink pointing to App Directory
ln -s "$AppPath/" "$WorkDir/Payload"
# For debug only
if [ "$DebugMode" = "YES" ]; then
mv "$IPAName.temp" "$IPAName"
IPAName="$IPAName.DEBUG2"
# Create dummy empty zip
touch DEBUG2emptyfile
zip -0 -m "$IPAName.temp" DEBUG2emptyfile 2>&1> /dev/null
#zip -d "$IPAName.temp" DEBUG2emptyfile 2>&1> /dev/null
fi
#DEBUG
#FreeSize=$(df -m "$NewAppDir/" | grep disk | awk '{print $4}')
#echo "${Meter74}Debug: free size on device [$FreeSize M$MsgSizUnit]"
#DEBUG
# Size of other data to compress
SecondSize=$(du -m -s "$AppPath" | cut -f 1)
echo "${Meter80}$MsgZipStep 2) [$(( $SecondSize - $FirstSize )) M$MsgSizUnit]"
# Going into working directory and compress from it
cd "$WorkDir"
# Zip doesn't move/delete source, and excludes some unwanted files. Smart "-n" flag excludes already compact files.
ZipError=$( zip $RCcompression -u -y -r -n .jpg:.JPG:.jpeg:.png:.PNG:.gif:.GIF:.Z:.gz:.zip:.zoo:.arc:.lzh:.rar:.arj:.mp3:.mp4:.m4a:.m4v:.ogg:.ogv:.avi:.flac:.aac \
"$IPAName.temp" -x@$tempexcl Payload/* 2>&1> /dev/null )
## */
if [ ! -z "$ZipError" ]; then
echo "${Meter81}${escRed}ZipError${escReset}: \"$( echo "$ZipError" | tr -d "\t\n" )\""
fi
# Remove list of excluded files
rm -f $tempexcl
# It failed because disk is full (zip size after Part[2] is still the same)
if [ $(stat -c%s "$IPAName.temp") -eq $ZipSize ]; then
echo "${escRed}$MsgIpaInco ! $MsgDskFull ?${escReset}"
rm -f "$IPAName.temp"
rm -fr "$WorkDir"
return 1
fi
# Removing SymbolicLink
rm "$WorkDir/Payload"
# Return to previous directory
cd "$PwdPwd" 2>&1> /dev/null
fi
# Ipa final name
mv "$IPAName.temp" "$IPAName"
# Removing temporary directory
if [ $RCverbose = "YES" ]; then
echo "${Meter98}$MsgRemTemp"
fi
rm -rf "$WorkDir"
# Cracked app is added into the already-cracked apps list
echo "$tempLoc" >> /var/mobile/.cracked.log
## Cracked app is added into Crackulous' cracked-apps-ready-to-upload list
## (Function now removed)
#p="/private/var/root/Documents/IPAStore.plist"
#if [ -e "$p" ]; then
# #If Crackulous is running, we must close it first
# Killous=$(ps -e | grep "/Applications/Crackulous" | grep -v "grep" | awk '{print $1}')
# if [ "$Killous" ]; then
# echo "${Meter99}$MsgWarning: killing Crackulous softly"
# kill $Killous
# sleep 1
# fi
# plutil -key "$IPAName" -type int -value "$(plutil -key 'itemId' "$AppPath/iTunesMetadata.plist" 2> /dev/null)" "$p" 2>&1> /dev/null
#fi
# Displaying finished Ipa details
ZipSize=$(du -m -s "$IPAName" | cut -f 1)
echo "${Meter100}${escGreen}$MsgIpaDone${escReset} \"$IPAName\" [$ZipSize M$MsgSizUnit]"
MenuOK=$(($MenuOK + 1))
}
# End Core Function
# ======
# ======
# Begin script main part
# Origin's directory
PwdPwd="$PWD"
# Select texts' language
SelectLanguage
# Martine Présidente !
if [ ! -e /bin/ps ]; then
if [ ! -e /usr/bin/ps ]; then
echo "$MsgCntFind 'ps'. $MsgInsCydi: 'adv-cmds'"
exit 1
fi
fi
# Is this script running inside a GUI?
# (ie: parent process runs from "/Applications/xxx.app")
if [ ! "$(ps -e | grep "$PPID" | grep "/Applications/.*\.app/")" = "" ]; then
RCinaGUI="YES"
fi
# Initialize progress meter labels (for GUI)
if [ $RCinaGUI = "YES" ]; then
export TERM="xterm"
for ((i=0;i<=100;i++)); do
export Meter$i="$i% "
done
else
# Not in a GUI
# clear
echo ""
# If output is not a terminal (ie: redirected to a file, etc), don't display colors/etc
if [[ -t 1 ]]; then
# Escape codes
esc="$( echo -ne "\033" )"
escReset="${esc}[0m"
escUnder="${esc}[4m"
escBlue="${esc}[34m"
escGreen="${esc}[32m"
escRed="${esc}[31m"
escYellow="${esc}[33m"
escPurple="${esc}[35m"
escCyan="${esc}[36m"
fi
# Terminal misconfigured
if [ -z "$TERM" ]; then
echo "${escYellow}$MsgWarning:${escReset} your \$TERM is not set"
export TERM="xterm"
fi
# MobileTermBackgrounder is used = problems ; other = problems
if [ "$TERM" = "screen" -o "$TERM" = "vanilla" ]; then
#echo "${escYellow}$MsgWarning:${escReset} your \$TERM is '$TERM'"
export TERM="vt100"
fi
# Screen width
if [ ! -e /usr/bin/tput ]; then
echo "$MsgCntFind 'tput'"
exit 1
fi
Cols=$(tput cols)
# Progress bars full width
BarCols=$(( $Cols - 8 ))
while [ ${#RCxxx} -lt $BarCols ]
do
RCxxx="$RCxxx$RCxxx"
RCsss="$RCsss$RCsss"
done
fi
echo "${Meter0}*** ${escUnder}RastiClutch v${RC_VERSION}${escReset} (based on RastiCrac v3.3.0) ***"
if [ ! -e /usr/bin/basename ]; then
echo "$MsgCntFind 'basename'. $MsgInsCydi: 'BigBoss Recommanded Tools'"
exit 1
fi
if [ ! -e /usr/bin/plutil ]; then
echo "$MsgCntFind 'plutil'. $MsgInsCydi: 'Erica Utils'"
exit 1
fi
if [ ! -e /bin/touch ]; then
echo "$MsgCntFind 'touch'"
exit 1
fi
if [ ! -e /usr/bin/Clutch ]; then
echo "$MsgCntFind 'Clutch'"
if [ -e /usr/bin/curl ]; then
echo "Downloading Clutch.."
latest_clutch=$(curl -s -k https://api.github.com/repos/kjcracks/clutch/releases/latest | grep 'browser_')
curl -k -L "$latest_clutch" > /usr/bin/Clutch
chmod 775 /usr/bin/Clutch
else
echo "Please download latest version of Clutch from http://github.com/KJCracks/Clutch/releases/latest and place it into /usr/bin"
echo "Or install cURL and re-run the script (it'll do it for you)"
fi
fi
if [ ! -e /usr/bin/zip ]; then
echo "$MsgCntFind 'zip'"
exit 1
fi
if [ ! -e /usr/sbin/sysctl ]; then
echo "$MsgCntFind 'sysctl'"
exit 1
fi
if [ ! -e /usr/bin/cut ]; then
echo "$MsgCntFind 'cut'"
exit 1
fi
if [ ! -e /usr/bin/awk ]; then
echo "$MsgCntFind 'awk'. $MsgInsCydi: 'Gawk'"
exit 1
fi
# Secret "debug" flag (can be first only)
if [ "$1" = "-debug" ]; then
shift
DebugMode="YES"
fi
# iDevice's type of CPU
CPUGenre=$(sysctl hw.cputype | awk '{print $2}')
CPUType=$(sysctl hw.cpusubtype | awk '{print $2}')
# iDevice's iOS version
iOSver=$(plutil -key ProductVersion /System/Library/CoreServices/SystemVersion.plist 2> /dev/null | tr -d ".")
if [ "$DebugMode" = "YES" ]; then
echo "${Meter1}${escYellow}Note:${escReset} running iOS$iOSver on '$CPUType@$CPUGenre' cpu on $(sysctl hw.machine | awk '{print $2}')"
fi
# Convert compatible CpuType
if [ $CPUType = "10" ]; then
CPUType="9"
fi
# Support for 64bits Cpu
if [ $CPUGenre = "16777228" -a $CPUType = "1" ]; then
CPUType="64"
fi
# Test if Cpu is known and handled yet
if [ $CPUType != "6" -a $CPUType != "9" -a $CPUType != "11" -a $CPUType != "64" ]; then
echo "${escRed}STOP:${escReset} can't handle this cpu ($CPUType@$CPUGenre) yet!"
exit 1
fi
# Cydia's "Speak" tool is needed for speech support
if [ ${iOSver:0:1} -lt 4 ]; then
RCspeak="NO"
fi
# Cydia's "Speak" crashes on iOS7
if [ ${iOSver:0:1} -gt 6 ]; then
RCspeak="NO"
fi
if [ $RCspeak = "YES" ]; then
if [ ! -e /usr/bin/speak ]; then
echo "${Meter3}${escYellow}Note:${escReset} install 'Speak' from Cydia for speech"
RCspeak="NO"
fi
fi
if [ ! -e /usr/bin/head ]; then
echo "$MsgCntFind 'head'"
exit 1
fi
if [ ! -e /usr/bin/tail ]; then
echo "$MsgCntFind 'tail'"
exit 1
fi
# Create an empty public memory file
if [ ! -e /var/mobile/.cracked.log ]; then
touch /var/mobile/.cracked.log
chmod 666 /var/mobile/.cracked.log
fi
# Don't want MetaData? It sucks!
if [ ! $RCmetadata = "YES" ]; then
echo "${Meter3}${escYellow}Note:${escReset} MetaData='NO' is not recommended"
RCmetadatafilename=".backup"
fi
# Are syslog and logger available?
if [ ! -e /usr/sbin/syslogd ]; then
echo "${Meter3}${escYellow}Note:${escReset} should install 'syslogd' from Cydia"
fi
RClogger="NO"
if [ ! -e /usr/bin/logger ]; then
echo "${Meter3}${escYellow}Note:${escReset} should install 'logger' from Cydia (inetutils)"
else
#Cydia's logger crashes under iOS9. Workaround.
foo=$(logger --version)
if [ $? = 0 ]; then
RClogger="YES"
else
echo "${Meter3}${escYellow}Note:${escReset} Cydia's 'logger' crashes. Update needed!"
fi
fi
if [ ! $RCinaGUI = "YES" ]; then
# Get and store the encrypted apps list
rm -f $lsd
touch $lsd
chmod 666 $lsd
# Check for previous cached data. Does cached applist = present applist?
if [ -e $cami ]; then
camicache="/tmp/cache.$(ls -l $cami | tr -cd "[:alnum:]")"
readonly vma="/var/mobile/Applications"
readonly vmd="$vma"
readonly vmaCut=6
readonly vmaLng=62
else
# iOS8+ changed that; temporary workaround
camicache="/tmp/cache.$(ls -l $cali | tr -cd "[:alnum:]")"
readonly vma="/var/mobile/Containers/Bundle/Application"
readonly vmd="/var/mobile/Containers/Data/Application"
readonly vmaCut=8
readonly vmaLng=79
# temporary workaround
RCrealnamemenu="NO"
fi
if [ -e $camicache ]; then
if [ "$DebugMode" = "YES" ]; then
echo "${Meter4}${escYellow}Note:${escReset} using cached applist"
fi
cp $camicache $lsd
else
if [ "$DebugMode" = "YES" ]; then
echo "${Meter4}${escYellow}Note:${escReset} refreshing applist's cache"
fi
# Why is that slower than next code???
#ls -d $vma/*/*.app/SC_Info 2> /dev/null | sort -f -t \/ -k $vmaCut | while read OneApp
## */
#do
# echo "$(dirname "$OneApp")" >> $lsd
#done
# Why is that faster than previous code???
ls -d $vma/*/*.app 2> /dev/null | sort -f -t \/ -k $vmaCut | while read OneApp
## */
do
if [ -d "$OneApp/SC_Info" ]; then
echo "$OneApp" >> $lsd
fi
done
cp $lsd $camicache
fi
fi
# Secret "déjà" flag (must be alone)
if [ "$1" = "-deja" ]; then
echo -n "Deja: "
ls -d $vma/*/*.app 2> /dev/null | sort -f -t \/ -k $vmaCut | while read OneApp
## */
do
if [ ! -d "$OneApp/SC_Info" ]; then
if [ -e "$OneApp/../iTunesArtwork" ]; then
echo "$OneApp" | cut -f $vmaCut -d '/' | sed "s:\\.app:,:" | tr "\n" " "
fi
fi
done
echo -e "\010\010."
exit 0
fi
# Loop through the different flags
LoopExit="NO"
while [ $LoopExit = "NO" ]
do
LoopExit="YES"
# Verbose mode flag
if [ "$1" = "-v" ]; then
shift
RCverbose="YES"
LoopExit="NO"
fi
# Secret "check only" flag
if [ "$1" = "-chk" ]; then
shift
RCcheck="YES"
LoopExit="NO"
fi
# Secret "LamerPatcher Off" flag
if [ "$1" = "-lpoff" ]; then
shift
RClamestpatchest="NO"
LoopExit="NO"
fi
# Secret "Extras Off" flag
if [ "$1" = "-extoff" ]; then
shift
RCextras="NO"
LoopExit="NO"
fi
# Secret "Speak Off" flag
if [ "$1" = "-spkoff" ]; then
shift
RCspeak="NO"
LoopExit="NO"
fi
# Secret "Artist Off" flag
if [ "$1" = "-artoff" ]; then
shift
RCartistfrommeta="NO"
LoopExit="NO"
fi
# Secret "Compression Ratio" flag
if [ "$1" = "-2" -o "$1" = "-3" -o "$1" = "-4" -o "$1" = "-5" -o "$1" = "-6" -o "$1" = "-7" -o "$1" = "-8" -o "$1" = "-9" ]; then
RCcompression="$1"
shift
echo "${Meter5}${escYellow}Note:${escReset} will now use Compression Ratio '$RCcompression'"
LoopExit="NO"
fi
done
# No more argument: display help
if [ $# -lt 1 ]; then
if [ ! $RCinaGUI = "YES" ]; then
# The "-a" flag is not displayed in the help, but it does exist.
scr=$(basename $0)
echo "List/Help: $scr"
echo " Menu: $scr [-v] -m [CN [CFN]]"
echo " CrackAll: $scr [-v] -all [CN [CFN]]"
echo " CrackOne: $scr [-v] AN [CN [CFN]]"
echo " MarkDone: $scr -mark"
echo "ResetDone: $scr -zero"
echo ""
echo " Update: -u"
echo
echo "AN=AppName CN=CrackerName CFN=CreditFileName"
echo
if [ -e $lsd ]; then
cat $lsd | cut -f $vmaCut -d '/' | sed "s:\\.app:,:" | tr "\n" " "
echo -e "\010\010."
rm -f $lsd
fi
exit 1
else
echo "Missing argument!"
exit 2
fi
fi
# Erasing memory file
if [ "$1" = "-zero" ]; then
echo "$MsgEraMemo"
# Don't use rm
cp /dev/null /var/mobile/.cracked.log 2>&1> /dev/null
rm -f $lsd
exit 1
fi
# Marking all apps as done in memory file
if [ "$1" = "-mark" ]; then
echo "$MsgMarDone"
if [ -e $lsd ]; then
cp $lsd /var/mobile/.cracked.log 2>&1> /dev/null
rm -f $lsd
else
cp /dev/null /var/mobile/.cracked.log 2>&1> /dev/null
fi
exit 1
fi
if [ ! $RCinaGUI = "YES" ]; then
MenuAsked=0
MenuFound=0
MenuOK=0
MenuError=0
MenuErrorList=""
if [ "$1" = "-u" ]; then
echo "Updating RastiClutch"
if [ ! -e /usr/bin/curl ]; then
echo "$MsgCntFind 'curl'"
exit 1
fi
curl -L -k "https://gist.github.com/ttwj/8771034/raw" > $0
latest_clutch=$(curl -s https://api.github.com/repos/kjcracks/clutch/releases/latest | grep 'browser_')
curl -L -k "$latest_clutch" > /usr/bin/Clutch
echo "${escGreen}Done updating RastiClutch${escReset}"
exit 0
fi
# Berzerk mode: cracking all apps
if [ "$1" = "-all" ]; then
echo -n "$MsgBrzMode !"
if [ -e $lsd ]; then
# ("grep -vf" is sloooow. Use "-Fvf")
# Removing already-done from full apps list
tempgrep=$(mktemp)
grep -Fvf /var/mobile/.cracked.log $lsd > $tempgrep
MenuAsked=$(cat $tempgrep | wc -l)
ProgressTarget=$MenuAsked
ProgressDone=0
echo " ($MenuAsked)"
echo
if [ $RCbarSize = "YES" -a $MenuAsked != 0 ]; then
ProgressTargetSize=0
ProgressDoneSize=0
echo -n "Computing total size"
# (Never use a pipe for the "while" loop)
while read OneApp
do
# Size of the app, till dawn.
AppSize=$( du -s -k "$OneApp" | cut -f 1 )
ProgressTargetSize=$(($ProgressTargetSize + $AppSize))
echo -n "."
done < $tempgrep
echo
echo
fi
# (Never use a pipe for the "while" loop)
while read OneApp
do
ProgressDone=$(($ProgressDone + 1))
echo -n "${escPurple}($ProgressDone/$ProgressTarget)${escReset} "
if [ $RCbarSize = "YES" ]; then
# Size of the app, till dawn.
AppSize=$( du -s -k "$OneApp" | cut -f 1 )
ProgressDoneSize=$(($ProgressDoneSize + $AppSize))
fi
CoreFunction "$OneApp" "$2" "$3"
if [ $? = 1 ]; then
if [ $RCspeak = "YES" ]; then
su mobile -c "speak Error!" &
fi
MenuError=$(($MenuError + 1))
if [ -z "$MenuErrorList" ]; then
MenuErrorList="${OneApp:$vmaLng:$(( ${#OneApp} - $vmaLng - 4 ))}"
else
MenuErrorList="$MenuErrorList, ${OneApp:$vmaLng:$(( ${#OneApp} - $vmaLng - 4 ))}"
fi
fi
DisplayBars
echo
done < $tempgrep
rm -f $tempgrep
rm -f $lsd
else
echo " ($MsgBrzNoth)"
fi
echo "$MsgWasAskd:all ($MenuAsked) $MsgFoundIt:$MenuFound $MsgErrrors:$MenuError OK:$MenuOK."
if [ ! -z "$MenuErrorList" ]; then
echo "$MsgErrrors: $MenuErrorList."
fi
if [ $RCspeak = "YES" ]; then
su mobile -c "speak Terminated." &
fi
exit 1
else
# Menu mode: displaying menu and processing user choices
if [ "$1" = "-m" ]; then
if [ -e $lsd ]; then
echo -n "$MsgBldMenu"
rm -f /tmp/lsdmenu.tmp
touch /tmp/lsdmenu.tmp
rm -f /tmp/lsddisp.tmp
# Array with all the letters
Letters=( $( echo {a..z} {a..z}{a..z} ) )
# Search for best columns size
BestFiller=666
BestFound=666
for (( i=18;i<=30;i++)); do
FillerFound=$(( $Cols % $i ))
if [ $FillerFound -lt $BestFiller ]; then
BestFiller=$FillerFound
BestFound=$i
if [ $FillerFound = 0 ]; then
break
fi
fi
done
LongNames=$(( $BestFound - 3 ))
ShortNames=$(( $LongNames - 1 ))
# Using 'real name' in menu?
if [ $RCrealnamemenu = "YES" ]; then
tempfile=$(mktemp)
templist=$(mktemp)
# Using 'list of installed apps' from SpringBoard as source for real names
cp $cami $tempfile
plutil -xml $tempfile 2>&1> /dev/null
cat $tempfile | grep -F -e "<key>CFBundleDisplayName</key>" -e "<key>Container</key>" -A1 | tr -d "\t" > $templist
rm $tempfile
fi
Letter=0
LineLength=$Cols
# ("grep -vf" is sloooow. Use "-Fvf")
# Removing already-done from full apps list
grep -Fvf /var/mobile/.cracked.log $lsd | while read OneApp
do
GoodLetter=${Letters[$Letter]}
# Using 'real name' in menu?
if [ $RCrealnamemenu = "YES" ]; then
unicode="$( cat $templist | grep "${OneApp:0:61}" -B3 | grep -m1 "<string>" | sed -e 's:<string>::g' -e 's:</string>::g' )"
# If name is too exotic, use 'internal name'
if [ "$(echo -n "$unicode" | tr -cd "[:alnum:]")" = "" ]; then
unicode="${OneApp:$vmaLng:$(( ${#OneApp} - $vmaLng - 4 ))}"
fi
UnicodeToHuman
OneOneApp="$human$RCdots"
else
OneOneApp="${OneApp:$vmaLng:$(( ${#OneApp} - $vmaLng - 4 ))}$RCdots"
fi
if [ $Letter -lt 26 ]; then
echo -n "${escPurple}$GoodLetter:${escReset}${OneOneApp:0:$LongNames} " >> /tmp/lsddisp.tmp
echo "\"$GoodLetter\"$OneApp" >> /tmp/lsdmenu.tmp
LineLength=$(( $LineLength - $LongNames - 3 ))
else
echo -n "${escPurple}$GoodLetter:${escReset}${OneOneApp:0:$ShortNames} " >> /tmp/lsddisp.tmp
echo "\"$GoodLetter\"$OneApp" >> /tmp/lsdmenu.tmp
LineLength=$(( $LineLength - $ShortNames - 4 ))
fi
# End of line
if [ $LineLength = $BestFiller ]; then
echo "" >> /tmp/lsddisp.tmp
LineLength=$Cols
fi
Letter=$(($Letter + 1))
# Too much apps (max is 27*26 = 702)
if [ $Letter = 702 ]; then
break
fi
done
if [ $RCrealnamemenu = "YES" ]; then
rm $templist
fi
# Other options
echo -n "${escPurple}0:${escReset}${MskZroDone:0:$LongNames} " >> /tmp/lsddisp.tmp
echo -n "${escPurple}9:${escReset}${MsgMrkDone:0:$LongNames} " >> /tmp/lsddisp.tmp
# Displaying menu
if [ -e /tmp/lsddisp.tmp ]; then
echo
clear
echo "*** ${escUnder}RastiClutch v${RC_VERSION} menu${escReset} ***"
cat /tmp/lsddisp.tmp
rm -f /tmp/lsddisp.tmp
echo
read -p "$MsgYouChoi ? " YourChoices
echo
ProgressTarget=$( echo $YourChoices | wc -w )
ProgressDone=0
if [ $RCbarSize = "YES" -a $ProgressTarget != 0 ]; then
ProgressTargetSize=0
ProgressDoneSize=0
echo -n "Computing total size"
# Do all these choices
for OneChoice in $YourChoices
do
if [ ! "$OneChoice" = "0" ]; then
if [ ! "$OneChoice" = "9" ]; then
tempLoc=$(grep -i "\"$OneChoice\"" /tmp/lsdmenu.tmp | cut -f 3 -d "\"")
if [ ! -z "$tempLoc" ]; then
AppCount=$(echo "$tempLoc" | wc -l)
if [ $AppCount = 1 ]; then
# Size of the app, till dawn.
AppSize=$( du -s -k "$tempLoc" | cut -f 1 )
ProgressTargetSize=$(($ProgressTargetSize + $AppSize))
echo -n "."
fi
fi
fi
fi
done
echo
echo
# Nothing to do; no need for progress
if [ $ProgressTargetSize = 0 ]; then
RCbarSize="ZERO"
fi
fi
# Do all these choices
for OneChoice in $YourChoices
do
ProgressDone=$(($ProgressDone + 1))
echo -n "${escPurple}($ProgressDone/$ProgressTarget)${escReset} "
MenuAsked=$(($MenuAsked + 1))
if [ "$OneChoice" = "0" ]; then
echo "$MsgEraMemo"
# Don't use rm
cp /dev/null /var/mobile/.cracked.log 2>&1> /dev/null
MenuAsked=$(($MenuAsked - 1))
else
if [ "$OneChoice" = "9" ]; then
echo "$MsgMarDone"
cp $lsd /var/mobile/.cracked.log 2>&1> /dev/null
MenuAsked=$(($MenuAsked - 1))
else
tempLoc=$(grep -i "\"$OneChoice\"" /tmp/lsdmenu.tmp | cut -f 3 -d "\"")
if [ -z "$tempLoc" ]; then
echo "$MsgWrgChoi ($OneChoice)"
else
AppCount=$(echo "$tempLoc" | wc -l)
if [ $AppCount = 1 ]; then
if [ $RCbarSize = "YES" ]; then
# Size of the app, till dawn.
AppSize=$( du -s -k "$tempLoc" | cut -f 1 )
ProgressDoneSize=$(($ProgressDoneSize + $AppSize))
fi
CoreFunction "$tempLoc" "$2" "$3"
if [ $? = 1 ]; then
if [ $RCspeak = "YES" ]; then
su mobile -c "speak Error!" &
fi
MenuError=$(($MenuError + 1))
if [ -z "$MenuErrorList" ]; then
MenuErrorList="${tempLoc:$vmaLng:$(( ${#tempLoc} - $vmaLng - 4 ))}"
else
MenuErrorList="$MenuErrorList, ${tempLoc:$vmaLng:$(( ${#tempLoc} - $vmaLng - 4 ))}"
fi
fi
else
echo "$MsgBadChoi ($OneChoice = $AppCount)"
fi
fi
fi
fi
DisplayBars
echo
done
rm -f /tmp/lsdmenu.tmp
if [ $RCspeak = "YES" ]; then
su mobile -c "speak Finished." &
fi
echo
echo "$MsgWasAskd:$MenuAsked $MsgFoundIt:$MenuFound $MsgErrrors:$MenuError OK:$MenuOK."
if [ ! -z "$MenuErrorList" ]; then
echo "${escRed}$MsgErrrors:${escReset} $MenuErrorList."
fi
else
echo " $MsgMnuEmpt !"
fi
rm -f $lsd
else
echo " $MsgMnuEmpt !"
fi
exit 1
fi
fi
fi
# Just one app to do
CoreFunction "$1" "$2" "$3"
#if [ $? = 1 ]; then
# echo "Error: problem encountered."
# exit 1
#fi
# Not needed anymore
rm -f $lsd
### # Temp-temp-dir not needed anymore
### rm -fr "$RooRoo"
#
# Thanks.
# Merci.
# Hontoni arigato.
#
@wudongdong
Copy link

this method can get idfa ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment