IntellIdroid는 특정 동작으로 이어지는 통화 경로를 추출하고 실행 시간 동안 이러한 경로를 정확하게 실행하는 Android 애플리케이션을위한 분석 도구입니다. 표적화 된 행동 세트가 주어지면 정적 분석 구성 요소는 응용 프로그램의 호출 그래프를 통과하여 이러한 동작으로가는 경로를 찾습니다. 또한 경로 제약 조건을 추출하며 이러한 경로를 트리거 할 수있는 입력 값을 결정하는 데 사용됩니다. 동적 구성 요소는 추출 된 경로/제약 조건을 취하고 입력 값을 Android 장치에 주입하여 대상 동작을 트리거합니다.
자세한 내용은 논문 및 슬라이드 (NDSS 2016)를 참조하십시오.
'Frameworkanalysis'는 정적 분석을 수행하여 Android 프레임 워크의 제약 조건을 생성합니다. 현재 출력 프레임 워크 제약 조건을 제공하여 'AppAnalysis'구성 요소에 의해 생성 된 응용 프로그램 제약 조건에 추가 할 수 있습니다.
'AppAnalysis'디렉토리는 Android 응용 프로그램에 대한 제약 조건을 생성하는 코드를 보유합니다.
| 예배 규칙서 | 설명 |
|---|---|
| 전처리 | 도구에 전달하기 전에 APK 파일을 추출하고 전처리하는 스크립트. |
| SRC | 소스 코드 파일. |
| 리브스 | 필요한 Wala 라이브러리를 포함한 종속성. 1 |
| 기계적 인조 인간 | ASP 버전 4.4.2_R2에서 컴파일 된 Android 프레임 워크 파일 (분석 할). |
1 우리는 Intellididroid의 성능을 향상시키기 위해 Wala의 통화 그래프 생성을 약간 변경했습니다. 수정 된 소스 코드는 여기에서 찾을 수 있습니다.
이 프로젝트는 Gradle 빌드 시스템을 사용합니다. 출력 파일은 build/ 디렉토리에 있습니다. Gradlew 스크립트는 Gradle이 이미 설치되지 않은 기계 용 래퍼입니다. 개발 시스템에 이미 Gradle이 포함 된 경우 아래 명령에서 ./gradlew gradle 로 교체하여 자체 설치를 사용할 수 있습니다. Gradle이 종속성을 자동으로 다운로드 할 수 있도록 코드를 처음 컴파일 할 때 네트워크 연결이 필요합니다.
android 디렉토리에 포함 된 Android 프레임 워크 파일은 JDK 1.6을 사용하여 컴파일되었지만 전처리 스크립트에 사용 된 apktool 에는 JDK 1.7이 필요합니다. JDK 1.7을 사용하는 것이 좋습니다. 필요한 경우 android 디렉토리의 파일을 교체하여 다양한 버전의 AOSP 또는 JDK를 시도 할 수 있습니다.
분석 할 대상 APK 파일은 먼저 preprocess 폴더의 스크립트를 사용하여 사전 처리해야합니다. 결과 디렉토리 (APK 파일 및 추출 된 리소스 포함)를 정적 분석으로 전달할 수 있습니다.
전처리 스크립트는 APKTool 및 감히 APK 패키지를 추출합니다. 자체 추출 도구를 사용할 수 있지만 IntellidRoid가 주어진 응용 프로그램에 대한 바이트 코드 및 매니페스트 파일을 찾을 수 있도록 앱 분석 코드를 수정해야 할 수도 있습니다.
./preprocess/PreprocessAPK.sh <APK file>
./preprocess/PreprocessDataset.sh <directory of APK files>
./gradlew build
./IntelliDroidAppAnalysis -o <output directory> <preprocessed app directory>
다른 명령 줄 옵션을 보려면 실행하십시오.
./IntelliDroidAppAnalysis --help
출력 디렉토리는 App Info JSON 파일 및 Z3 제약 파일을 저장하는 데 사용됩니다. 지정되지 않으면이 파일은 ./pathOutput 에 저장됩니다. 출력 파일은 IntelliDroidDynamicClient 도구에서 통화 경로를 식별하고 이러한 경로를 트리거하기 위해 입력 데이터를 생성하는 데 사용됩니다.
출력 디렉토리에서 생성 된 appInfo.json 및 constraintX_X.py 파일은 동적 클라이언트에 필요하지만 읽기 쉽지는 않습니다. -y 플래그를 사용하여 더 읽기 쉬운 (그러나 출력이 많은) 버전의 경로/제약 조건 결과 (STDOUT에서 인쇄)를 얻을 수 있습니다.
'DynamicClient'디렉토리에는 Android 장치와 통신하는 Python 프로그램이 포함되어 있으며 원하는 이벤트를 트리거하는 입력을 보냅니다.
이 프로그램은 Android 장치 또는 에뮬레이터가 시스템에 연결되어있을 것으로 예상합니다. 이 장치는 IntellIdroidService가 포함 된 맞춤형 Android OS를 실행해야합니다 (이 프로그램이 보내는 명령을 해석하고 실제 이벤트 호출을 수행합니다). DynamicClient 프로그램은 포트 TCP : 12348의 소켓을 통해 장치에 자동으로 연결됩니다. adb 도구는 연결을 설정하고 특정 명령을 실행하는 데 사용되며 PATH 에서 도달 할 수 있어야합니다 (이는 PATH 변수에 Android SDK 도구 디렉토리를 추가하거나 동적 클라이언트를 실행하기 전에 AOSP 빌드 환경을 설정하여 수행 할 수 있습니다.
또한 동적 클라이언트는 Python API (Z3-PY)를 통해 Z3 제약 솔버를 사용합니다. 파이썬 바인딩으로 Z3을 빌드 및 설치하는 지침은 여기에서 확인할 수 있습니다.
IntellIdroid에서 사용하는 커스텀 안드로이드 OS는 기본 AOSP 소스 트리에 적용 할 수있는 일련의 DIFF 파일로 제공됩니다. IntellIdroid는 현재 Android 4.3 (AOSP Branch android-4.3_r1 ) 용으로 구현되었습니다. Android를 다운로드하고 구축하는 방법에 대한 지침은 AOSP 문서를 참조하십시오.
올바른 AOSP 버전을 다운로드하여 컴파일 한 후에는 androidPatches 디렉토리에있는 IntellIdroid 패치를 적용 할 수 있습니다. 이 프로세스를 자동화하기 위해 patch.sh 및 unpatch.sh 파일이 제공됩니다. 패치 후 ASP를 재건 한 후 (우리는 당신이 두 번 make 할 수도 있고 그렇지 않으면 에뮬레이터의 특정 파일이 일관되지 않게됩니다). make 와 함께 make update-api 실행해야 할 수도 있습니다. 일단 구축되면 logcat 사용하여 장치 부츠가 부츠를 부팅 할 때 IntelliDroidService 클래스가 시스템 서비스로 시작되었는지 확인할 수 있습니다.
cd androidPatches
./patch.sh <path to AOSP directory>
./IntelliDroidDynamicClient.py
HELP (명령 설명)
INSTALL <APK file>
START <directory to app information, generated by IntelliDroidAppAnalysis>
TRIGGER <call path ID to trigger, as specified in appInfo.json>
EXECUTE <command to send to IntelliDroidService> 1
INFO <info requested from IntelliDroidService> 1
CLOSE
KILL
1 이 명령은 디버깅 목적으로 만 사용됩니다. IntellIdroidService가 기대하는 정확한 매개 변수를 알고있는 경우에만 사용해야합니다.
TaintDroid와의 통합은 매우 간단합니다. 'AppAnalysis'구성 요소의 경우 -t 플래그를 사용하여 다른 대상 방법 목록을 지정하십시오 (즉, 제공된 taintdroidTargets.txt 파일).
./IntelliDroidAppAnalysis -t taintdroidTargets.txt <preprocessed app directory>
역동적 인 측면에서, 여기서 지침을 따라 Android 4.3 용 TaintDroid를 다운로드하고 구축하십시오. TaintDroid의 빌드가 작동하는지 확인한 후에는 Unmichined ASP와 같은 방식으로 DynamicClient/androidPatches 의 패치를 적용하십시오.
IntellIdroid는 처음에 토론토 대학의 Michelle Wong이 마스터의 논문 프로젝트로 개발되었으며 David Lie 박사가 감독했습니다.
문의 사항은 다음과 같이 문의하십시오.
다음은 IntellIdroid에 코드를 기여했습니다.
IntellIdroid는 MIT 라이센스에 따라 릴리스됩니다.