반응형

그동안 픽셀폰 쓰느라 s9 은 쳐다도 안봤습니다.

뒷방 늙은이 신세였던 s9 단말기에 PixelExperience + kernelSU 를 올려봤더니...좋네요.

앱 모의해킹하시는 분들 kernelSU 적극 추천 드립니다.

 

- 사전 준비 사항
Windows10, Ubuntu 22.04.3 VM 에서 진행
갤럭시 s9 (SM-G960N) AOS10 순정에 twrp 올려놓기
PixelExperience 13 커스텀롬 준비 (https://get.pixelexperience.org/starlte)
 
- Build Kernel

출처: https://github.com/CruelKernel/samsung-exynos9820

# Install prerequisites
# If you use ubuntu or ubuntu based distro then you need to install these tools:
sudo apt-get install build-essential libncurses-dev libtinfo5 bc bison flex libssl-dev libelf-dev heimdall-flash android-tools-adb android-tools-fastboot curl p7zip-full

# Install avbtool
wget -q https://android.googlesource.com/platform/external/avb/+archive/refs/heads/master.tar.gz -O - | tar xzf - avbtool.py
chmod +x avbtool.py
sudo mv avbtool.py /usr/local/bin/avbtool

# Install mkbootimg
wget -q https://android.googlesource.com/platform/system/tools/mkbootimg/+archive/refs/heads/master.tar.gz -O - | tar xzf - mkbootimg.py gki
chmod +x mkbootimg.py
sudo mv mkbootimg.py /usr/local/bin/mkbootimg
sudo mv gki $(python -c 'import site; print(site.getsitepackages()[0])')

# Install mkdtboimg
wget -q https://android.googlesource.com/platform/system/libufdt/+archive/refs/heads/master.tar.gz -O - | tar --strip-components 2 -xzf - utils/src/mkdtboimg.py
chmod +x mkdtboimg.py
sudo mv mkdtboimg.py /usr/local/bin/mkdtboimg

# Get the sources
git clone https://github.com/PixelExperience-Devices/kernel_samsung_exynos9810.git
cd kernel_samsung_exynos9810
git clone --depth=1 https://github.com/kdrag0n/proton-clang.git

 

kernelSU를 받고,

curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -

 

커널 소스 코드를 수동으로 패치 (출처: https://kernelsu.org/guide/how-to-integrate-for-non-gki.html)

(1) fs/exec.c 파일 패치

다음 코드 추가

extern int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, void *envp, int *flags);

ksu_handle_execveat(&fd, &filename, &argv, &envp, &flags);

 

(2) fs/open.c 파일 패치

다음 코드 추가

extern int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode, int *flags);

ksu_handle_faccessat(&dfd, &filename, &mode, NULL);

 

(3) fs/read_write.c 파일 패치

다음 코드 추가

extern int ksu_handle_vfs_read(struct file **file_ptr, char __user **buf_ptr, size_t *count_ptr, loff_t **pos);

ksu_handle_vfs_read(&file, &buf, &count, &pos);

 

(4) fs/stat.c 파일 패치

다음 코드 추가

extern int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags);

ksu_handle_stat(&dfd, &filename, &flags);

 

(5) drivers/input/input.c 파일 패치

다음 코드 추가

extern bool ksu_input_hook __read_mostly;
extern int ksu_handle_input_handle_event(unsigned int *type, unsigned int *code, int *value);

if (unlikely(ksu_input_hook))
    ksu_handle_input_handle_event(&type, &code, &value);


(6) security/selinux/hooks.c 파일 패치

패치 안하면 커널수 모듈 작동 안함

다음과 같이 패치 (출처: https://github.com/F-19-F/android_kernel_oneplus_msm8998/commit/1042d5601a1c0db08c9a9cea89d1895e74576a27)

static inline u32 current_sid(void) --> u32 current_sid(void)

 

check_nnp_nosuid 함수를 다음과 같이 패치

...

static int check_nnp_nosuid(const struct linux_binprm *bprm,
			    const struct task_security_struct *old_tsec,
			    const struct task_security_struct *new_tsec)
{
	static u32 ksu_sid;
	char *secdata;
	int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
	int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
	int rc, error;
	u32 seclen;

	if (!nnp && !nosuid)
		return 0; /* neither NNP nor nosuid */

	if (new_tsec->sid == old_tsec->sid)
		return 0; /* No change in credentials */
		
	if(!ksu_sid){
		security_secctx_to_secid("u:r:su:s0", strlen("u:r:su:s0"), &ksu_sid);
	}
	error = security_secid_to_secctx(old_tsec->sid, &secdata, &seclen);
	if (!error) {
		rc = strcmp("u:r:init:s0",secdata);
		security_release_secctx(secdata, seclen);
		if(rc == 0 && new_tsec->sid == ksu_sid){
			return 0;
		}
	}
    
 ...

 

다음 명령어 순서대로 입력해서 커널 빌드. 대략 20분정도 소요됨.

export PATH=~/kernel_samsung_exynos9810/proton-clang/bin:${PATH}

make O=out ARCH=arm64 CC=clang exynos9810-starlte_defconfig

make O=out ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-gnu- CROSS_COMPILE_ARM32=arm-linux-gnueabi- AR=llvm-ar NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump STRIP=llvm-strip -j12

 

빌드가 완료되면 out/arch/arm64/boot 디렉터리에 Image 파일이 떨어짐

 

AnyKernel3(https://github.com/osm0sis/AnyKernel3) 디렉터리에 Image 파일 옮기고 압축

 

※ anykernel.sh

### AnyKernel3 Ramdisk Mod Script
## osm0sis @ xda-developers

### AnyKernel setup
# global properties
properties() { '
kernel.string=ExampleKernel by osm0sis @ xda-developers
do.devicecheck=0
do.modules=0
do.systemless=1
do.cleanup=1
do.cleanuponabort=0
device.name1=
supported.versions=
supported.patchlevels=
supported.vendorpatchlevels=
'; } # end properties


### AnyKernel install
## boot files attributes
boot_attributes() {
set_perm_recursive 0 0 755 644 $ramdisk/*;
set_perm_recursive 0 0 750 750 $ramdisk/init* $ramdisk/sbin;
} # end attributes

# boot shell variables
block=/dev/block/platform/11120000.ufs/by-name/BOOT;
is_slot_device=0;
ramdisk_compression=auto;
patch_vbmeta_flag=auto;

# import functions/variables and setup patching - see for reference (DO NOT REMOVE)
. tools/ak3-core.sh;

# boot install
dump_boot; # use split_boot to skip ramdisk unpack, e.g. for devices with init_boot ramdisk

write_boot; # use flash_boot to skip ramdisk repack, e.g. for devices with init_boot ramdisk
## end boot install

 

- Kernel 플래싱

twrp 리커버리 --> wipe --> format data --> yes --> advanced wipe --> Dalvik / System / Data / Cache 체크 & wipe --> PixelExperience, anykernel.zip 플래싱 --> reboot

부팅 완료 후 https://github.com/tiann/KernelSU/releases 에서 최신버전 KernelSU.apk 다운로드 받아서 adb install 로 설치

 

반응형

+ Recent posts