# 네이티브 라이브러리 리버싱 {{#include ../../banners/hacktricks-training.md}} **자세한 정보는 다음을 확인하세요:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) 안드로이드 앱은 성능이 중요한 작업을 위해 일반적으로 C 또는 C++로 작성된 네이티브 라이브러리를 사용할 수 있습니다. 악성코드 제작자들도 이러한 라이브러리를 사용하며, 이는 DEX 바이트코드보다 리버스 엔지니어링이 더 어렵습니다. 이 섹션은 어셈블리 언어를 가르치는 대신 안드로이드에 맞춘 리버스 엔지니어링 기술을 강조합니다. 호환성을 위해 ARM 및 x86 버전의 라이브러리가 제공됩니다. ### 주요 사항: - **안드로이드 앱의 네이티브 라이브러리:** - 성능 집약적인 작업에 사용됩니다. - C 또는 C++로 작성되어 리버스 엔지니어링이 어렵습니다. - 리눅스 바이너리와 유사한 `.so` (공유 객체) 형식으로 발견됩니다. - 악성코드 제작자는 분석을 어렵게 만들기 위해 네이티브 코드를 선호합니다. - **자바 네이티브 인터페이스 (JNI) 및 안드로이드 NDK:** - JNI는 자바 메서드를 네이티브 코드로 구현할 수 있게 합니다. - NDK는 네이티브 코드를 작성하기 위한 안드로이드 전용 도구 세트입니다. - JNI와 NDK는 자바(또는 코틀린) 코드와 네이티브 라이브러리를 연결합니다. - **라이브러리 로딩 및 실행:** - 라이브러리는 `System.loadLibrary` 또는 `System.load`를 사용하여 메모리에 로드됩니다. - 라이브러리 로딩 시 JNI_OnLoad가 실행됩니다. - 자바에서 선언된 네이티브 메서드는 네이티브 함수에 연결되어 실행을 가능하게 합니다. - **자바 메서드를 네이티브 함수에 연결하기:** - **동적 링크:** 네이티브 라이브러리의 함수 이름이 특정 패턴과 일치하여 자동 링크를 허용합니다. - **정적 링크:** `RegisterNatives`를 사용하여 링크하며, 함수 이름 및 구조에 유연성을 제공합니다. - **리버스 엔지니어링 도구 및 기술:** - Ghidra 및 IDA Pro와 같은 도구는 네이티브 라이브러리를 분석하는 데 도움을 줍니다. - `JNIEnv`는 JNI 함수 및 상호작용을 이해하는 데 중요합니다. - 라이브러리 로딩, 메서드 링크 및 네이티브 함수 식별을 연습할 수 있는 연습문제가 제공됩니다. ### 리소스: - **ARM 어셈블리 학습:** - 기본 아키텍처에 대한 깊은 이해를 위해 권장됩니다. - Azeria Labs의 [ARM Assembly Basics](https://azeria-labs.com/writing-arm-assembly-part-1/)를 추천합니다. - **JNI 및 NDK 문서:** - [Oracle의 JNI 사양](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html) - [안드로이드의 JNI 팁](https://developer.android.com/training/articles/perf-jni) - [NDK 시작하기](https://developer.android.com/ndk/guides/) - **네이티브 라이브러리 디버깅:** - [JEB 디컴파일러를 사용하여 안드로이드 네이티브 라이브러리 디버깅하기](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3) {{#include ../../banners/hacktricks-training.md}}