일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OSR
- android inject
- uftrace
- Linux custom packer
- anti debugging
- pinpoint
- Linux packer
- on stack replacement
- 안티디버깅
- initial-exec
- TLS
- thread local storage
- Android
- so inject
- custom packer
- pthread
- apm
- on-stack replacement
- 난독화
- LLVM Obfuscator
- Obfuscator
- tracing
- linux debugging
- LLVM
- Injection
- tracerpid
- v8 tracing
- linux thread
- LLVM 난독화
- v8 optimizing
- Today
- Total
Why should I know this?
AOSP build 후 Linux에서 dex 실행 해보기 본문
모종의 이유로 Linux에서 AOSP를 빌드한 후 DEX를 실행하고 싶다면 이 글이 도움이 될 겁니다.
먼저 Linux에서 AOSP를 빌드할 때 사용하시는 컴퓨터에 맞는 아키텍처로 빌드하세요.
아직까지 AOSP는 x86에서만 빌드할 수 있으므로 x86_64를 선택하시면 될겁니다.
dalvikvm을 실행하기 위한 스크립트 :
#!/bin/sh
# base directory, at top of source tree; replace with absolute path
base=`pwd`
# configure root dir of interesting stuff
root=$base/out/target/product/generic_x86_64/system
export ANDROID_ROOT=$root
# configure bootclasspath
bootpath=$root/framework
export BOOTCLASSPATH=/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jar
# this is where we create the dalvik-cache directory; make sure it exists
export ANDROID_DATA=/tmp/dalvik_$USER
mkdir -p $ANDROID_DATA/dalvik-cache
exec $root/bin/dalvikvm $@
aosp 를 빌드하고 나면
out/target/product/generic_x86_64/system 같은 경로가 생성됐을 겁니다.
중요한 것은 이 경로에는 framework 가 반드시 존재해야 합니다.
system 경로를 통채로 root로 복사합니다.
이렇게 하는 이유는 위에 보다시피 BOOTCLASSPATH를 지정해줘야 하는데, 이 값을 복붙할 원본이 /system 경로를 기반으로 되어 있어서 입니다.
cp -R out/target/product/generic_x86_64/system /system
그럼 이제 BOOTCLASSPATH 를 긁어와야 합니다. 위 env.sh 에서 export BOOTCLASSPATH= 다음에 오는 부분입니다.이 내용은 out/target/product/generic_x86_64/root/init.environ.rc 파일에 존재합니다.
grep "BOOTCLASS" -nR out/target/product/generic_x86_64/ --include=*.rc
위 명령으로 검색할 수 있습니다.
out/target/product/generic_x86_64/root/init.environ.rc:10: export BOOTCLASSPATH /system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jar
이 파일이 기기가 부팅될 때 안드로이드를 부팅시키는 init script 중에 하나입니다.
위 export BOOTCLASSPATH를 env.sh 처럼 복붙해주면 됩니다.
그외 ANDROID_DATA는 캐쉬이므로 신경쓰지 않아도 됩니다.
이제 apk 를 만들어 봅시다.
dalvikvm 은 dex 파일은 실행하지 못합니다. 그러므로 귀찮더라도 apk를 만들어줘야 합니다.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
먼저 헬로 월드를 만듭니다! HelloWorld.java 로 만드셔야 합니다.
다음 명령으로 apk를 만들 수 있습니다.
javac HelloWorld.java
dx --dex --output=classes.dex HelloWorld.class
zip HelloWorld.zip classes.dex
zip = apk 입니다.
dx 는 ./prebuilts/sdk/tools/dx 경로에 존재합니다.
이제 실행하면 됩니다.
m@n2:~/aosp$ ./env.sh -cp HelloWorld.zip HelloWorld
Hello World!
이상입니다.
'Knowledge > Android' 카테고리의 다른 글
SystemCall 직접 박아넣기 (0) | 2022.12.07 |
---|---|
Android Hooking - Java layer 편 #1 (3) | 2022.12.07 |
Dexopt, Dex2oat 실행 옵션 (0) | 2020.03.15 |
ARMv7 에서 Cacheflush를 사용할 때 주의점 (0) | 2020.02.22 |
Android 보안솔루션의 기법 깨기 (8) | 2019.02.22 |