#!/system/bin/sh
MODDIR=${0%/*}
Улучшение 1: Прячем лог в папку модуля.
Это убережет от "палева" перед античитами, которые мониторят /data/local/tmp/
exec > "${MODDIR}/adguardcert.log"
exec 2>&1
set -x
set_context() {
[ "$(getenforce)" = "Enforcing" ] || return 0
# Улучшение 2: Более правильный fallback-контекст для системных сертификатов
default_selinux_context="u:object_r:system_security_cacerts_file:s0"
selinux_context=$(ls -Zd "$1" 2>/dev/null | awk '{print $1}')
if [ -n "$selinux_context" ] && [ "$selinux_context" != "?" ]; then
chcon -R "$selinux_context" "$2"
else
chcon -R "$default_selinux_context" "$2"
fi
}
AG_CERT_HASH="0f4ed297"
Более надежное экранирование переменных
AG_CERT_FILE=$(ls /data/misc/user//cacerts-added/${AG_CERT_HASH}. 2>/dev/null | (IFS=.; while read -r left right; do echo $right $left.$right; done) | sort -nr | (read -r left right; echo $right))
if ! [ -e "${AG_CERT_FILE}" ]; then
echo "Certificate ${AG_CERT_HASH} not found. Exiting."
exit 0
fi
rm -f /data/misc/user//cacerts-removed/${AG_CERT_HASH}.
Поддержка Android 13 и ниже (классический Magisk-метод)
mkdir -p "${MODDIR}/system/etc/security/cacerts"
cp -f "${AG_CERT_FILE}" "${MODDIR}/system/etc/security/cacerts/${AG_CERT_HASH}.0"
chown -R 0:0 "${MODDIR}/system/etc/security/cacerts"
set_context /system/etc/security/cacerts "${MODDIR}/system/etc/security/cacerts"
Поддержка Android 14+ (Обход ограничений APEX)
if [ -d /apex/com.android.conscrypt/cacerts ]; then
# Улучшение 3: Используем защищенную директорию модуля вместо /data/local/tmp/
TMP_DIR="${MODDIR}/adg-ca-copy"
rm -rf "${TMP_DIR}"
mkdir -p "${TMP_DIR}"
# Монтируем tmpfs (RAM-диск) прямо в папку модуля
mount -t tmpfs tmpfs "${TMP_DIR}"
cp -f /apex/com.android.conscrypt/cacerts/* "${TMP_DIR}/"
# Инжектим сертификат AdGuard
cp -f "${AG_CERT_FILE}" "${TMP_DIR}/${AG_CERT_HASH}.0"
chown -R 0:0 "${TMP_DIR}"
set_context /apex/com.android.conscrypt/cacerts "${TMP_DIR}"
CERTS_NUM="$(ls -1 "${TMP_DIR}" | wc -l)"
if [ "$CERTS_NUM" -gt 10 ]; then
# Биндим в текущем пространстве имен
mount --bind "${TMP_DIR}" /apex/com.android.conscrypt/cacerts
# Улучшение 4: Пробрасываем mount --bind во все изолированные пространства Zygote
# pgrep zygote захватывает и zygote, и zygote64, что делает код чуть лаконичнее
for pid in 1 $(pgrep zygote); do
nsenter --mount=/proc/${pid}/ns/mnt -- \
mount --bind "${TMP_DIR}" /apex/com.android.conscrypt/cacerts 2>/dev/null
done
else
echo "Cancelling replacing CA storage due to safety check (certs count: $CERTS_NUM)"
fi
# Убираем за собой: отмонтируем tmpfs от папки модуля.
# Сами сертификаты останутся наложенными на APEX благодаря mount --bind.
umount "${TMP_DIR}"
rmdir "${TMP_DIR}" 2>/dev/null
fi
#!/system/bin/sh
MODDIR=${0%/*}
Улучшение 1: Прячем лог в папку модуля.
Это убережет от "палева" перед античитами, которые мониторят /data/local/tmp/
exec > "${MODDIR}/adguardcert.log"
exec 2>&1
set -x
set_context() {
[ "$(getenforce)" = "Enforcing" ] || return 0
}
AG_CERT_HASH="0f4ed297"
Более надежное экранирование переменных
AG_CERT_FILE=$(ls /data/misc/user//cacerts-added/${AG_CERT_HASH}. 2>/dev/null | (IFS=.; while read -r left right; do echo $right $left.$right; done) | sort -nr | (read -r left right; echo $right))
if ! [ -e "${AG_CERT_FILE}" ]; then
echo "Certificate ${AG_CERT_HASH} not found. Exiting."
exit 0
fi
rm -f /data/misc/user//cacerts-removed/${AG_CERT_HASH}.
Поддержка Android 13 и ниже (классический Magisk-метод)
mkdir -p "${MODDIR}/system/etc/security/cacerts"
cp -f "${AG_CERT_FILE}" "${MODDIR}/system/etc/security/cacerts/${AG_CERT_HASH}.0"
chown -R 0:0 "${MODDIR}/system/etc/security/cacerts"
set_context /system/etc/security/cacerts "${MODDIR}/system/etc/security/cacerts"
Поддержка Android 14+ (Обход ограничений APEX)
if [ -d /apex/com.android.conscrypt/cacerts ]; then
# Улучшение 3: Используем защищенную директорию модуля вместо /data/local/tmp/
TMP_DIR="${MODDIR}/adg-ca-copy"
fi