https://biji-jjigae.tistory.com/89
지난번에 libpcap-1.8.1과 NDK 10으로 libpcap 안드로이드용 크로스 컴파일을 한 글을 쓴적이 있다.
NDK도 너무 옛날 버전이고 libpcap도 1.9.1.이 최신 버전이여서 다시 작성했다.
1. Device
Nexus 5 (codenamed Hammerhead)에서 테스트를 진행했고, 안드로이드 버전은 6.0.1이다.
2. Environment Path
편리한 관리를 위해 NDK와 libpcap은 아래의 경로에 위치하도록 한다. NDK는 처음 이름이 좀 기니까 ndk로 바꾸어서 사용하는 것이 편할 것이다.
[root account]
ndk - /root/android/ndk
libpcap - /root/android/libpcap-1.9.1
[user account]
ndk - /home/<user>/android/ndk
libpcap - /home/<user>/android/libpcap-1.9.1
3. Download NDK & libpcap
NDK: https://developer.android.com/ndk/downloads
최신 버전인 r21을 사용한다.
libpcap
wget https://www.tcpdump.org/release/libpcap-1.9.1.tar.gz
tar xf libpcap-1.9.1.tar.gz
cd libpcap-1.9.1
여기까지 마치면 현재 작업 디렉토리가 ~/android/libpcap-1.9.1 일 것이다.
4. Install compile tools
sudo apt install byacc
sudo apt install flex
5. Set Environment variables
해당 부분이 구 버전과 약간 차이가 존재한다.
export ANDROID_NDK_HOST=linux-x86_64
export ANDROID_NDK_PLATFORM=android-16
export ANDROID_NDK_ROOT=/root/android/ndk
export TOOLCHAIN=/root/android/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export PATH=/root/android/ndk/toolchains/llvm/prebuilt/linux-x86_64/bin:/root/android/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH
export CC=armv7a-linux-androideabi16-clang
export CXX=armv7a-linux-androideabi16-clang++
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
6. Execute configure and build
./configure --prefix=$PWD/../sysroot --host=arm-linux --enable-shared=no --with-pcap=linux --without-libnl
make
make install
여기까지 마치고 나면 상위 디렉토리인 android 안에 sysroot 디렉토리가 생성이 되었을 것이다.
sysroot 디렉토리가 제대로 생성이 되었다면
위와 같이 네개의 디렉토리가 생기고, 안에 크로스컴파일 된 헤더들과 라이브러리가 들어있게 된다.
7. Test
pcap.h의 pcap_findalldevs() 함수를 이용하여 모든 인터페이스의 내용을 출력하는 테스트 프로그램을 작성해본다.
cd ~ # move to home directory
mkdir pcap-test
cd pcap-test
vi makefile
# makefile
TARGET=pcap-test
CFLAGS+=-I../android/sysroot/include
LDFLAGS+=-L../android/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의 결과물이다.
앞에서 export로 CC의 값을 armv7a-linux-androideabi16-clang으로 바꾸어 주었기 때문에, libpcap을 컴파일 할 때와 같은 컴파일러로 해당 c 파일을 컴파일 하게 되고, 필요한 라이브러리들도 지정해준 경로에서 찾아서 컴파일을 해주게 된다.
결과물로 pcap-test 실행 파일이 생성되는데, 이를 안드로이드에 올려서 실행해본다.
테스트용 안드로이드 기기를 컴퓨터에 연결하고,
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를 실행한다.
제대로 컴파일이 되었다면, 위와 같이 안드로이드 기기의 인터페이스 정보들을 확인할 수 있다.
8. References
https://g.gilgil.net/android/build/tree/master/pcap
https://developer.android.com/ndk/guides/other_build_systems
'Mobile' 카테고리의 다른 글
[Nexmon] nexus5 monitor mode(bcm4339) (0) | 2020.05.11 |
---|---|
Android screen mirroring in Kali linux (0) | 2020.04.18 |
[안드로이드 모바일 앱 모의해킹] 환경설정(drozer) (0) | 2020.03.19 |
libpcap Android build(arm cross compile) (0) | 2020.03.13 |
[Android] APK 분석 준비하기 (0) | 2019.12.31 |