美文网首页
使用AddressSanitizer检测内存错误

使用AddressSanitizer检测内存错误

作者: 老江_ | 来源:发表于2020-07-23 21:27 被阅读0次

自己的Android 反外挂SDK,主要还是cpp代码,对自己的代码还是不太放心,还是找个工具测试测试

环境

windows 10 + Android Studio 4.0 + ndk r18b + MIX3 API28 root / Pixel2 API27 root

配置

1.模块的 build.gradle 中配置自己CMake参数

cmake{

arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared", "-DANDROID_TOOLCHAIN=clang"

    ndk {

            abiFilters "armeabi-v7a"

    }

}

2.在AndroidManifest.xml中application标签添加android:debuggable="true"属性(似乎没啥用哈)

3.把ndk目录下的asan动态库拷贝到工程中

动态库位置在  ${NDK_PATH}\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\7.0.2\lib\linux

动态库名大概是  libclang_rt.asan-*-android.so,比如我这里是armeabi-v7a,文件名就是  libclang_rt.asan-arm-android.so

把相应的库文件放在jniLibs相应的目录下

工程目录

4.添加封装的shell脚本

如上图所示,创建一个resources/lib/[armeabi-v7a]目录,并创建一个wrap.sh文件,文件内容如下,可参考官网

#!/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:我在官网的基础上多添加了一个fast_unwind_on_fatal=1选项(第三行末尾),可参考issue

!!!注意!!!:上面这个脚本每一行的换行符都需要从CRLF换成LF,不然运行时会报错说 No such file or directory,可参考issue,和网友提供解决方案,不过我用网友提供的决解方案后,发现还是报错(具体原因是在进行字符替换的时候将我脚本第一个字符'#'给删除了)。最后我是通过010Editor把脚本的0xD 0xA全部替换成0xA

粗暴。jpg

在apk被安装后,这个wrap.sh会放在/data/app/<pkg-name>/lib/[arm]目录下,为了确保正确,可以手动执行一下脚本,不报错就ok

5.在CMakeLists.txt中设置各种标志

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.编译-安装-运行

如果有崩溃,logcat过滤AddressSanitizer参看详细信息

相关文章

网友评论

      本文标题:使用AddressSanitizer检测内存错误

      本文链接:https://www.haomeiwen.com/subject/beqklktx.html