보안 솔루션 분석 방법
2025년 5월 23일
공부해야할것 #
- 유니콘엔진도 필요함 에뮬레이션을 해야하는데 .. + unidbg?
- 사실 안드로이드가 더 유리함. PC는 어차피 공격자도 로컬에서 더높은 권한을 갖고있는데 안드로이드는 그래도 TEE라도 있지..
- SELinux/eBPF 같은것도 공부해야됨. 안드로이드도 커널기반 안티치트가 있다??? 그럼 운영체제랑 협업을 하는거네..?
- GKI 구조의 벤더 커널모듈? 이게 텐센트 ACE?
구현 층 어떻게 커널에 발붙이냐 대표 예시 무슨 일을 하나 ① Vendor kernel module (.ko) 제조사 / SoC 벤더가 vendor ramdisk안에 .ko 넣어 부팅 때modprobe로 로드 ( Android Open Source Project)tc_anticheat.ko(Tencent ACE), “xshield.ko”(넷이즈)• security_ptrace_access()·process_vm_writev()후킹
•/proc/*/mem오픈 감시 → Frida·GameGuardian 차단② eBPF 프로그램 시스템 데몬(게임부스터, 보안앱)이 CAP_BPF 로 eBPF 바이트코드 로드 ( Android Open Source Project, Medium) 중국 게이밍폰 “Turbo-BPF”, 삼성 Knox Net Manager • tracepoint/sys_enter_ptrace같이 특정 syscall 실시간 스니핑
• 비정상 패턴 잡으면bpf_send_signal(SIGKILL)③ LSM 패치 / Yama 강화 OEM이 security_ptrace_access()를 패치하거나kernel.yama.ptrace_scope=3하드코딩 ( Android Git Repositories)MIUI 커널, 일부 Vivo 커스텀커널 • 비시스템 UID가 ptrace 시도 → 직접 -EPERM리턴④ 하이퍼바이저 / RKP 계열 ARM EL2(케이진, 삼성 RKP)에서 커널 메모리 무결성 감시 플래그십 갤럭시, 퀄컴 “Game Security Engine” • 코드 페이지가 R-X 아닌 W 시그널 → 즉시 PANIC or kill
보안 솔루션의 역할 #
- 후킹 탐지
- 메모리 변경감지
- 코드 보호(java, jni, 보안솔루션 코드도)
- 난독화(문자열, 로직)
- 암호화(데이터 문자열 등)
- 리포팅?
- 악성 패키지 탐지?
- 해시값 검증
- 악성 환경 탐지
- 에뮬레이터
- 루팅
보안솔루션이 탐지하게 되면 실행하는 로직 #
- 리포팅
- 프로세스 킬 이건 어떻게하나? 방법은 개많음
- adb logcat | grep -E “Fatal|signal|Abort”
- 종료위치 찾는 코드
1const targets = [
2 { n: "kill", ret: "int", args: ["int", "int"] },
3 { n: "tgkill", ret: "int", args: ["int", "int", "int"] },
4 { n: "tkill", ret: "int", args: ["int", "int"] },
5 { n: "pthread_kill", ret: "int", args: ["pointer", "int"] },
6 { n: "exit_group", ret: "void", args: ["int"] },
7 { n: "_exit", ret: "void", args: ["int"] },
8 { n: "exit", ret: "void", args: ["int"] },
9 { n: "syscall", ret: "long", args: ["long", "..."] }, // 직접 syscall 우회
10];
11
12targets.forEach(t => {
13 const p = Module.findExportByName("libc.so", t.n);
14 if (!p) return;
15 Interceptor.replace(p, new NativeCallback(function () {
16 console.log(`[BLOCK] ${t.n}`, JSON.stringify(Array.prototype.slice.call(arguments)));
17 if (t.n === "syscall") {
18 const nr = arguments[0].toInt32();
19 if (nr === 94 || nr === 129 || nr === 131) { // exit_group / kill / tgkill
20 console.log(" ↳ sys_exit / kill family blocked");
21 return 0;
22 }
23 // non-exit syscalls는 그냥 통과
24 return this.orig.apply(this, arguments);
25 }
26 return (t.ret === "void") ? undefined : 0;
27 }, t.ret, t.args));
28});
가장 먼저 실행될 수 있는 코드 #
- 사실상 process 기준으로 먼저 실행할 수 있는 권한이 있는건 frida?
- initarray? (native)
- attachBaseContext (java)
게임은 어떻게? #
- unity C# 같은 엔진이 있는 경우
- 언리얼은 자체 게임엔진이 들어갈거임
그럼 분석은 어떻게 해야하는가? #
정적분석 또는 동적분석밖에 선택지가 없는데, 정적분석은 사실상 난독화만 되어있어도 분석하기 어려워진다.
만약 난독화나 암호화로 인해 Frida 탐지 로직이 보이지 않고, Frida 연결하자마자 종료된다면 보안 로직을 찾는데 가장 효율적인건 Frida이다.
- 순정 단말 1대 (정상동작 시 로그나 여러가지 정보 수집용), 루팅 마지스크 프리다 단말 1대 (우회 테스트)
- 정적분석으로 쉬운 해결이 가능할지 코드를 확인해본다.
- 만약 어렵다면 가장먼저 frida 사용이 가능하도록 세팅해야한다.
- frida spawn (-f), kill/exit 훅이 가장 먼저해볼 내용임
- pause 상태에서 죽으면 initarray를 의심해야한다.
- initarray 보다 먼저 실행하는 방법은 있다. systemserver 후킹?
보안은 어떻게 해야하는가 #
정적분석 방어 #
| 난독·보호 기법 | 정적 분석에 주는 타격 |
|---|---|
| 컨트롤 플로 플래티닝 / CFG 스플릿 | 그래프 연결이 끊겨 IDA/JADX가 논리 흐름 복구 실패 → 의도적 “죽음의 엣지” 다수 삽입 |
동적 클래스·메서드 로딩 (Class.forName, dexClassLoader) |
코드가 APK 밖(암호화 blob·서버)에서 내려와 정적 바이너리엔 없음 |
| 스트링·리터럴 암호화 | 탐지 키워드(“frida”, “ptrace”)가 전부 런타임 복호화 → grep·xrefs 무력화 |
| OPCode 가상머신 랩핑 (e.g., Qihoo, Bangcle packer) | DEX 바이트코드가 단순 디스패처/해시로 치환돼 실제 로직 미노출 |
자체 무결성 해시 (calculate_md5(…dex_section)) |
패치 시도 자체를 앱이 체크해 즉시 크래시 |
| ELF 변형 + PAC/BTI 보호 (ARM64e) | IDA/Ghidra가 함수 경계·리턴타입 추론 실패, 정적 해독 속도 ↓ |