libpcap 라이브러리를 armv7 기반 안드로이드에서 사용하기 위해 cross-compile 하는 과정을 문서화 한 것이다. 성공한 경우에 대한 버전 및 환경 세팅으로 설명을 진행하였다.
libpcap & NDK version
- libpcap-1.8.1
-
NDK 103
버전은 위와 같이 통일하는 것을 권장한다.
Download NDK
https://developer.android.com/ndk/downloads/older_releases
NDK 10e version으로 다운로드 받는다. 다운로드 받은 후에 압축을 풀고 디렉토리 이름을 ndk로 변경한 뒤에, 홈 디렉토리 밑에 android 디렉토리를 만들고 그 안에 넣는다.
- ex) 자신의 홈 디렉토리가 /root라면 /root/android/ndk와 같은 위치에 ndk 폴더를 위치시킨다.
Install compile tools
apt install byacc
apt install flex
현재 작업중인 사용자가 루트가 아닐 경우, sudo를 붙여서 사용한다.
Download libpcap
편리한 관리를 위해 홈디렉토리에 다운로드 받는 것을 권장한다.
wget https://www.tcpdump.org/release/libpcap-1.8.1.tar.gz
tar xf libpcap-1.8.1.tar.gz
cd libpcap-1.8.1
여기까지 진행되고 나면, libpcap-1.8.1 디렉토리로 들어와있어야 한다.
Set Environment variables
이전 과정에서 동일한 버전을 다운로드 받고, 동일한 과정으로 진행했다면, 다음과 같은 명령을 통해 환경변수를 세팅한다. 경로가 지정되어 있는 경우(ndk 디렉토리의 경로)는 자신의 경로로 수정을 하여 export 해주어야 한다.
- ex) export ANDROID_NDK_ROOT=~/home/android/ndk
export ANDROID_NDK_HOST=linux-x86_64
export ANDROID_NDK_PLATFORM=android-16
export ANDROID_NDK_ROOT=/root/android/ndk
export ANDROID_NDK_TOOLCHAIN_PREFIX=arm-linux-androideabi
export ANDROID_NDK_TOOLCHAIN_VERSION=4.9
export ANDROID_NDK_TOOLS_PREFIX=arm-linux-androideabi
export PATH=/root/android/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
export CC=arm-linux-androideabi-gcc
export CFLAGS=-I/root/android/ndk/platforms/android-16/arch-arm/usr/include
export CXX=arm-linux-androideabi-g++
export CXXFLAGS=-I/root/android/ndk/platforms/android-16/arch-arm/usr/include
export LDFLAGS=--sysroot=/root/android/ndk/platforms/android-16/arch-arm
Execute configure and build
./configure --prefix=$PWD/../sysroot --host=arm-linux --enable-shared=no --with-pcap=linux --without-libnl
- —prefix: 컴파일된 프로그램을 설치하는 위치. 여기서는 현재 경로의 상위 디렉토리에 sysroot를 생성하여 해당 디렉토리에 설치하도록 하였다.
- —host: 빌드 후, 실행파일이 실행 될 시스템을 명시한다. 컴파일 한 결과물이 사용될 환경을 의미한다. arm 기반 환경에서 사용할 것이므로 arm-linux를 명시하였다.
- —enable-shared: 공유 드라이버 라이브러리를 구축할 때 사용하는데, 여기서는 no로 주었다. 따라서 컴파일 후, lib 디렉토리에 가보면 .so 파일들은 생성이 되지 않는 것을 확인할 수 있다.
- —with-pcap
- —without-libnl
make
make install
여기까지 마치고 나면, 상위 디렉토리에 sysroot라는 디렉토리가 생성되었을 것이다.
sysroot 디렉토리가 제대로 생성이 되었다면
bin, include, lib, share 디렉토리가 생성이 된다.
Test
pcap.h의 pcap_findalldevs() 함수를 이용하여 모든 인터페이스의 내용을 출력하는 테스트 프로그램을 작성해본다.
mkdir pcap-test
cd pcap-test
vi makefile
# makefile
TARGET=pcap-test
CFLAGS+=-I../sysroot/include
LDFLAGS+=-L../sysroot/lib
LDFLAGS+=-pie
LDLIBS+=-lpcap
all: $(TARGET)
$(TARGET): $(TARGET).o
clean:
rm -f $(TARGET)
rm -f *.o
vi pcap-test.c
#include <pcap.h>
#include <stdio.h>
int main() {
char error[PCAP_ERRBUF_SIZE];
pcap_if_t* all;
pcap_if_t* temp;
int i;
if(pcap_findalldevs(&all, error) == -1) {
printf("error in pcap_findalldevs(%s)\n", error);
return -1;
}
i = 1;
for(temp = all; temp ;temp = temp->next) {
printf("%d : %s\n",i++,temp->name);
}
return 0;
}
makefile과 pcap-test.c 파일을 작성했다면, make 명령어를 이용하여 컴파일 한다. 이때, make 파일에서 정해준 sysroot/include와 sysroot/lib에서 헤더와 라이브러리를 사용하게 된다. sysroot는 앞에서 진행한 libpcap의 arm용 cross-compile의 결과물이다.
make
앞에서 export로 CC의 값을 arm-linux-androideabi-gcc로 바꾸어 주었기 때문에, libpcap을 컴파일 할 때와 같은 컴파일러로 해당 c 파일을 컴파일 하게 되고, 필요한 라이브러리들도 지정해준 경로에서 찾아서 컴파일을 해주게 된다.
결과물로 pcap-test 실행 파일이 생성되는데, 이를 안드로이드에 올려서 실행해본다.
테스트용 안드로이드 기기를 컴퓨터에 연결하고,
adb devices
List of devices attached
064d364b0b1096d0 device
연결이 되어 있는지 확인 한다. 되어 있다면 adb devices를 실행했을 때, 위와 같은 결과를 볼 수 있다.
adb push pcap-test /data/local/tmp
adb를 이용하여 연결된 기기의 /data/local/tmp 디렉토리에 pcap-test를 push 한다. 해당 디렉토리에만 쓰기 권한이 있으므로 /data/local/tmp에 넣어주도록 한다.
adb shell
# 여기부터는 adb prompt
su
cd /data/local/tmp
ls # pcap-test check
./pcap-test
adb로 기기에 접속하여, pcap-test를 실행한다.
제대로 컴파일이 되었다면, 위와 같이 안드로이드 기기의 인터페이스 정보들을 확인할 수 있다.
References
'Mobile' 카테고리의 다른 글
libpcap Android build(Newest version) (0) | 2020.04.03 |
---|---|
[안드로이드 모바일 앱 모의해킹] 환경설정(drozer) (0) | 2020.03.19 |
[Android] APK 분석 준비하기 (0) | 2019.12.31 |
[Android_Frida] 시작하기 (0) | 2019.12.31 |
[Android] ADB install (0) | 2019.12.31 |