自己的Android 反外掛SDK絮宁,主要還是cpp代碼,對(duì)自己的代碼還是不太放心脱茉,還是找個(gè)工具測(cè)試測(cè)試
環(huán)境
windows 10 + Android Studio 4.0 + ndk r18b + MIX3 API28 root / Pixel2 API27 root
配置
1.模塊的 build.gradle 中配置自己CMake參數(shù)
cmake{
arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared", "-DANDROID_TOOLCHAIN=clang"
????ndk {
????????????abiFilters "armeabi-v7a"
????}
}
2.在AndroidManifest.xml中application標(biāo)簽添加android:debuggable="true"屬性(似乎沒(méi)啥用哈)
3.把ndk目錄下的asan動(dòng)態(tài)庫(kù)拷貝到工程中
動(dòng)態(tài)庫(kù)位置在? ${NDK_PATH}\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\7.0.2\lib\linux
動(dòng)態(tài)庫(kù)名大概是??libclang_rt.asan-*-android.so非驮,比如我這里是armeabi-v7a,文件名就是? libclang_rt.asan-arm-android.so
把相應(yīng)的庫(kù)文件放在jniLibs相應(yīng)的目錄下
4.添加封裝的shell腳本
如上圖所示担扑,創(chuàng)建一個(gè)resources/lib/[armeabi-v7a]目錄恰响,并創(chuàng)建一個(gè)wrap.sh文件,文件內(nèi)容如下涌献,可參考官網(wǎng)
#!/system/bin/sh
HERE="$(cd "$(dirname "$0")" && pwd)"
export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1,fast_unwind_on_fatal=1
ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so)
if [ -f "$HERE/libc++_shared.so" ]; then
????export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so"
else
????export LD_PRELOAD="$ASAN_LIB"
fi
"$@"
tips:我在官網(wǎng)的基礎(chǔ)上多添加了一個(gè)fast_unwind_on_fatal=1選項(xiàng)(第三行末尾)胚宦,可參考issue
!Q嗬枢劝!注意!2泛尽您旁!:上面這個(gè)腳本每一行的換行符都需要從CRLF換成LF,不然運(yùn)行時(shí)會(huì)報(bào)錯(cuò)說(shuō) No such file or directory轴捎,可參考issue鹤盒,和網(wǎng)友提供解決方案,不過(guò)我用網(wǎng)友提供的決解方案后侦副,發(fā)現(xiàn)還是報(bào)錯(cuò)(具體原因是在進(jìn)行字符替換的時(shí)候?qū)⑽夷_本第一個(gè)字符'#'給刪除了)侦锯。最后我是通過(guò)010Editor把腳本的0xD 0xA全部替換成0xA
在apk被安裝后秦驯,這個(gè)wrap.sh會(huì)放在/data/app/<pkg-name>/lib/[arm]目錄下率触,為了確保正確,可以手動(dòng)執(zhí)行一下腳本,不報(bào)錯(cuò)就ok
5.在CMakeLists.txt中設(shè)置各種標(biāo)志
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} -fsanitize=address")
6.編譯-安裝-運(yùn)行
如果有崩潰葱蝗,logcat過(guò)濾AddressSanitizer參看詳細(xì)信息