OS 보안 기능으로 인해 커널 메모리의 후킹이나 수정이 제한되므로, 해당 보안 기능을 비활성화한 OS를 직접 빌드하여 설치해야 한다.
이 가이드는 특정 단말기를 예시로 설명하고 있지만, 엑시노스 칩셋을 사용하는 다른 삼성 기기들도 얼마든지 적용이 가능하다. 리니지OS 홈페이지에서 본인의 모델을 검색해 ZIP 파일을 다운로드한 뒤, 아래와 같은 순서로 시도하면 된다.
준비물
OS : Ubuntu 24.03 LTS
단말기 : 갤럭시 S6 LITE (OEM 잠금 해제 된)
진행 순서
1. 태블릿에 공식 리니지 OS 설치
2. 리눅스에서 리니지 OS 빌드
- 커널 버전이 높을수록 적용된 보안 기능이 많아지므로, 가능한 한 낮은 커널 버전(필자가 설치한 롬은 4 버전 커널) 을 사용하여 진행한다.
3. 태블릿에 빌드한 리니지 OS 설치
4. 크로스 컴파일러로 커널 빌드
5. syscall 후킹 lkm 빌드
1. 태블릿에 공식 리니지 OS 설치
1. 드라이버 설치 후 재부팅 : https://github.com/daynix/usbdk/releases/latest
heimdall : https://blob.lineageos.org/downloads/heimdall/Heimdall-Windows-v2.2.2-120625.zip
2. 전원을 끈 후, 볼륨 상 + 볼륨 하를 동시에 누르면서, 1초후에 usb를 연결하고, 볼륩 상을 눌러 다운로드 모드에 진입한다.
3. https://b4.timschumi.net/lineage-archive/lineage-20.0-20240629-nightly-gta4xlwifi-signed.zip 다운로드
4. zip을 해제한 후, recovery.img 설치
heimdall flash --RECOVERY recovery.img
5. 위 명령어를 실행하면 바로 재부팅이 되는데, 볼륨 상 + 파워를 길게 눌러 리커버리 모드 진입
6. Factory Reset -> 3개 전부 실행
7. 메인 메뉴로 이동 후 Apply update-> apply from adb 후 아래 명령어 실행
adb -d sideload lineage-20.0-20240629-nightly-gta4xlwifi-signed.zip
8. 재부팅 후, 개발자 옵션에서(설정 -> 시스템에 위치) adb 디버깅 enable 및 디버깅 시 루트 권한 사용 enable
2. 리눅스에서 리니지 OS 빌드
$ sudo apt-get install python-is-python3 brotli repo adb bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick protobuf-compiler python3-protobuf lib32readline-dev lib32z1-dev libdw-dev libelf-dev libgnutls28-dev lz4 libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
$ wget https://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2_amd64.deb && sudo dpkg -i libtinfo5_6.3-2_amd64.deb && rm -f libtinfo5_6.3-2_amd64.deb
$ wget https://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2_amd64.deb && sudo dpkg -i libncurses5_6.3-2_amd64.deb && rm -f libncurses5_6.3-2_amd64.deb
$ git config --global user.email "abc@lol.com"
$ git config --global user.name "kim kim"
$ mkdir -p ~/android/lineage
$ export USE_CCACHE=1
$ export CCACHE_EXEC=/usr/bin/ccache
$ echo 'ccache -M 50G' >> ~/.bashrc
$ source ~/.bashrc
$ cd ~/android/lineage
$ repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --git-lfs --no-clone-bundle
$ repo sync
$ source build/envsetup.sh
$ croot
$ breakfast gta4xlwifi # 빌드 중 오류 발생은 당연함. 무시하고 아래 명령어 실행
$ cd ~/android/lineage/device/samsung/gta4xlwifi
$ ./extract-files.sh
$ cd ~/android/lineage
$ breakfast gta4xlwifi # 여기서 빌드 오류가 발생하면 안됨
# 보안 기능 off
$ sed -i \
-e 's/CONFIG_EXYNOS_KERNEL_PROTECTION=y/CONFIG_EXYNOS_KERNEL_PROTECTION=n/' \
-e 's/CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y/CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=n/' \
-e 's/CONFIG_STRICT_KERNEL_RWX=y/CONFIG_STRICT_KERNEL_RWX=n/' \
-e 's/CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y/CONFIG_ARCH_HAS_STRICT_MODULE_RWX=n/' \
-e 's/CONFIG_STRICT_MODULE_RWX=y/CONFIG_STRICT_MODULE_RWX=n/' \
-e 's/CONFIG_EXYNOS_CONTENT_PATH_PROTECTION=y/CONFIG_EXYNOS_CONTENT_PATH_PROTECTION=n/' \
-e 's/CONFIG_HAVE_ARCH_SECCOMP_FILTER=y/CONFIG_HAVE_ARCH_SECCOMP_FILTER=n/' \
~/android/lineage/kernel/samsung/gta4xl/arch/arm64/configs/exynos9611-gta4xlwifi_defconfig
# 보안 기능 삭제 (https://codetronik.tistory.com/155)
$ sed -i -e '/struct vm_struct \*area;/ s/^/\/\//' \
-e '/area = find_vm_area/,/return -EINVAL;/ s/^/\/\//' \
~/android/lineage/kernel/samsung/gta4xl/arch/arm64/mm/pageattr.c
$ croot
$ brunch gta4xlwifi
$ cd $OUT # 출력 파일 확인
3. 태블릿에 빌드한 리니지 OS 설치
1. 드라이버 설치 후 재부팅 : https://github.com/daynix/usbdk/releases/latest
heimdall : https://blob.lineageos.org/downloads/heimdall/Heimdall-Windows-v2.2.2-120625.zip
2. 전원을 끈 후, 볼륨 상 + 볼륨 하를 동시에 누르면서, 1초후에 usb를 연결하고, 볼륩 상을 눌러 다운로드 모드에 진입한다.
3. 빌드 한 recovery.img 설치
heimdall flash --RECOVERY recovery.img --no-reboot
4. 재부팅을 위해 볼륨 하 + 파워를 8~10초간 누르고 있다가 손 뗌
5. 재부팅 되면 볼륨 상 + 파워를 길게 눌러 리커버리 모드 진입
6. Factory Reset -> 3개 전부 실행
7. 메인 메뉴로 이동 후 Apply update-> apply from adb 후 아래 명령어 실행
adb -d sideload lineage-20.0-20251230-UNOFFICIAL-gta4xlwifi.zip
adb -d sideload MindTheGapps-13.0.0-arm64-20231025_200931.zip
9. 재부팅
4. 크로스 컴파일러로 커널 빌드
cd ~
git clone https://github.com/Shubhamvis98/toolchains
export PATH="/home/code/toolchains/clang-r428724/bin:/home/code/toolchains/aarch64-linux-android-4.9/bin:$PATH"
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export CLANG_TRIPLE=aarch64-linux-gnu-
cd ~/android/lineage/kernel/samsung/gta4xl
make clean
make mrproper
make exynos9611-gta4xlwifi_defconfig
make menuconfig -> 실행 후 <Save> 클릭
make -j16 CC=clang
커널 소스 수정 (오류 발생 시)
# 파일 내 모든 "/drivers/misc/tzdev/"를 "drivers/misc/tzdev/"로 변경
sed -i 's|"/drivers/misc/tzdev/|"drivers/misc/tzdev/|g' drivers/misc/tzdev/tz_deploy_tzar.c
5. syscall 후킹 lkm 빌드
아래 2개의 파일을 작성한다.
// Makefile
hook-objs := main.o
obj-m += hook.o
KERNEL_PATH := ~/android/lineage/kernel/samsung/gta4xl
CCPATH := /home/code/toolchains/clang-r428724/bin:/home/code/toolchains/aarch64-linux-android-4.9/bin
ARCH=arm64
export PATH := ${CCPATH}:${PATH}
export CLANG_TRIPLE = aarch64-linux-gnu-
export CROSS_COMPILE = aarch64-linux-android-
all:
make CC=clang ARCH=$(ARCH) CFLAGS=$(CFLAGS) -C $(KERNEL_PATH) M=$(PWD) modules -j$(nproc --all)
clean:
make -C $(KERNEL_PATH) M=$(PWD) clean
// main.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/ftrace.h> // kallsyms_lookup_name()
#include <linux/uaccess.h> // copy_to_user()
#include <linux/slab.h>
#include <asm/set_memory.h>
#include <linux/nls.h>
#include "util.h"
MODULE_AUTHOR("codetronik");
MODULE_LICENSE("GPL");
MODULE_VERSION("1.0");
MODULE_DESCRIPTION("Anti Android Root Detector");
u64 *sys_call_table;
typedef asmlinkage int (*_original_faccessat)(int dfd, const char __user *filename, int mode);
_original_faccessat org_faccessat;
static int (*p_set_memory_rw)(unsigned long, int);
asmlinkage int hook_faccessat(int dfd, const char __user *filename, int mode)
{
pr_info("[CODETRONIK] hello");
return org_faccessat(dfd, filename, mode);
}
int init_module(void)
{
sys_call_table = (u64*)kallsyms_lookup_name("sys_call_table");
pr_info("[CODETRONIK] syscall table %016lx", sys_call_table);
p_set_memory_rw = (void*)kallsyms_lookup_name("set_memory_rw");
p_set_memory_rw((unsigned long)sys_call_table, 1);
org_faccessat = (_original_faccessat)sys_call_table[__NR_faccessat];
sys_call_table[__NR_faccessat] = (u64)hook_faccessat;
return 0;
}
void cleanup_module(void)
{
sys_call_table[__NR_faccessat] = (u64)org_faccessat;
}
빌드 및 모듈 설치 방법
$ make
$ adb root
$ adb push hook.ko /data/local/tmp
gta4xlwifi:/ $ adb shell
gta4xlwifi:/ $ insmod /data/local/tmp/hook.ko
정상적으로 모듈이 설치되었으면, dmesg로 로그를 확인할 수 있다.
'Android Linux > Rooting' 카테고리의 다른 글
| [2025/12 new!] Galaxy Tab S6 Lite 리니지OS 설치 (0) | 2025.12.15 |
|---|---|
| Galaxy Tab S6 Lite 리니지OS 설치 (0) | 2022.04.20 |
| Galaxy Tab S6 Lite 리니지OS 커스텀 롬 전체 빌드 (0) | 2022.04.20 |
| [Galaxy Tab S6 Lite] lkm빌드를 위한 커널 빌드 (0) | 2022.04.17 |
| 갤럭시탭 s6 lite 루팅 방법 (3) | 2021.04.10 |