Skip to content

Latest commit

 

History

History
97 lines (70 loc) · 3.99 KB

File metadata and controls

97 lines (70 loc) · 3.99 KB

언어: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية

← NeverC 예제

Android 커널 함수 훅

neverc_krt_interpose_register를 사용하여 do_faccessat 진입점을 훅합니다. 데모 내용:

  • 자동 체인: 동일 대상에 여러 핸들러를 우선순위 순으로 실행
  • 원본 호출 패턴: 핸들러가 orig 포인터를 받아 원본 함수를 호출 가능
  • 우선순위 제어: 값이 작을수록 먼저 실행. 음수 값으로 다른 훅보다 먼저 실행
  • 공존: 대상이 이미 다른 모듈에 의해 훅되어 있어도 동작

API

int neverc_krt_interpose_register(void *target, void *handler, int priority,
                             void **orig, struct neverc_krt_interpose_ref *ref);
int neverc_krt_interpose_unregister(struct neverc_krt_interpose_ref *ref);

핸들러 시그니처:

long my_interpose(void *orig, void *a0, void *a1, void *a2, void *a3, void *a4, void *a5);

빌드

cd examples/android-kernel-inline-interpose
neverc make          # debug: -g(첫 빌드 기본값)
neverc make release  # release: -O2 --strip
neverc make debug    # debug로 전환

다른 커널 프리셋은 예를 들어 neverc make KERNEL=612 release로 선택합니다. neverc make release는 -O2 --strip을 선택합니다. Makefile은 선택한 KERNEL과 PROFILE을 .nvk-build-flags에 기록하므로 이후 make push, make run, 대상 없는 make가 같은 산출물을 사용합니다. 이 상태 파일이 없으면 make는 debug를 기본값으로 사용합니다. make debug 또는 명시적인 PROFILE=...는 저장된 프로필을 갱신하고, make clean은 상태 파일을 삭제하여 다음 빌드를 debug로 되돌립니다.

NeverC는 IDA에서 착안하되 예약 접두사를 쓰지 않는 릴리스 이름을 다섯 종류로 기록합니다. 함수는 fn_HEX, 실행 가능한 무형식 레이블은 code_HEX, 객체는 obj_HEX, 그 밖의 무형식 레이블은 sym_HEX, 절대 심볼은 abs_HEX입니다. 일반 할당 정의에서 HEX는 최종 SHF_ALLOC 섹션 배치로부터 결정적으로 계산한 analysis EA입니다(abs_HEX는 대신 절대 st_value를 사용합니다). 이는 hash (해시), encryption(암호화), file offset(파일 오프셋), ELF virtual address (ELF 가상 주소), runtime kernel address(런타임 커널 주소)가 아닙니다. NeverC는 예약된 sub_/loc_ 형식이나 의도적으로 빈 일반 이름도 저장하지 않습니다.

정확히 보존할 이름, IDA의 합성 extern 보기, 보안 경계, 확정 처리와 서명의 순서는 릴리스 및 스트립 정책을 참조하십시오.

배포 및 실행

neverc make run

또는 수동:

adb push nvk_interpose_demo.ko /data/local/tests/
adb shell su -c 'insmod /data/local/tests/nvk_interpose_demo.ko'
adb shell su -c 'dmesg | grep neverc_krt_interpose_demo'

커널 로그(실시간)

기기에서 cat /proc/kmsg를 실행하면 커널 ring buffer를 실시간으로 볼 수 있습니다. Windows DbgView와 비슷합니다. insmod가 모호한 오류만 돌려주거나 vermagic, modversions, section 크기 등 실제 거부 이유를 확인할 때 사용하세요.

터미널 1(계속 실행):

adb shell
su
cat /proc/kmsg

터미널 2:

adb shell su -c 'insmod /data/local/tests/nvk_interpose_demo.ko'

로드 순간의 새 로그가 터미널 1에 나타납니다. Ctrl+C로 중지합니다.

참고: 일부 Android 빌드는 dmesg -w를 지원하지 않습니다. /proc/kmsg는 root가 필요하지만 모듈 로드 디버깅에 더 안정적입니다.

언로드

neverc make rmmod