android下的so层检测反调试

简介: 反调试检测思路

检测原理

安卓的native下,是运用醉倒的反调试方案是通过读取进程的status或stat来检测tracepid,它主要原理是调试状态下的进程tracepid不为0。
对于这种调试检测手段,因为android系统是开源的,所以最彻底的绕过方式就是修改系统源码后重新编译,让tracepid永远为0。
对抗这种bypass手段,我们可以创建一个子进程,让子进程主动ptrace自身设为调试状态,
此时正常情况下,子进程的tracepid应该不为0。此时我们检测子进程的tracepid是否为0,
如果为0说明源码被修改了。

代码实现
//检测系统实现

bool checkSystemData()
{

// 建立管道
int pipefd[2];
if (-1 == pipe(pipefd))
{

LOGA("pipe() error.\n");

return false;

}

// 创建一个子进程
pid_t pid = fork();

LOGB("father pid is: %d\n",getpid());

LOGB("child pid is: %d\n",pid);

// for失败

if(0 > pid) {

LOGA("fork() error.\n");

return false;

}

// 子进程程序

int childTracePid=0;

if ( 0 == pid )

{

int iRet = ptrace(PTRACE_TRACEME, 0, 0, 0);

if (-1 == iRet)

{

LOGA("child ptrace failed.\n");

exit(0);

}

LOGA("%s ptrace succeed.\n");

// 获取tracepid

char pathbuf[0x100] = {0};

char readbuf[100] = {0};

sprintf(pathbuf, "/proc/%d/status", getpid());

int fd = openat(NULL, pathbuf, O_RDONLY);

if (-1 == fd) {

LOGA("openat failed.\n");

}

read(fd, readbuf, 100);

close(fd);

uint8_t *start = (uint8_t *) readbuf;

uint8_t des[100] = {0x54, 0x72, 0x61, 0x63, 0x65, 0x72, 0x5

0, 0x69, 0x64, 0x3A,0x09};

int i = 100;

bool flag= false;

while (--i)
{

if( 0==memcmp(start,des,10) )
{

start=start+11;childTracePid=atoi((char*)start);

flag= true;

break;

}else

{

start=start+1;

flag= false;

}

}//while

if(false==flag) {

LOGA("get tracepid failed.\n");

return false;

}

// 向管道写入数据

close(pipefd[0]); // 关闭管道读端

write(pipefd[1], (void*)&childTracePid,4); // 向管道写端写入数据

close(pipefd[1]); // 写完关闭管道写端

LOGA("child succeed, Finish.\n");
exit(0);

}

else

{

// 父进程程序
LOGA("开始等待子进程.\n");

waitpid(pid,NULL,NULL); // 等待子进程

结束

int buf2 = 0;

close(pipefd[1]); // 关闭写端

read(pipefd[0], (void*)&buf2, 4); // 从读端读取

数据到buf

close(pipefd[0]); // 关闭读端

LOGB("子进程传递的内容为:%d\n", buf2); // 输出内容

// 判断子进程ptarce后的tracepid

if(0 == buf2) {

LOGA("源码被修改了.\n");

}else{

LOGA("源码没有被修改.\n");

}

return true;

}

}

//检测代码的调用

void main()

{

bool bRet=checkSystemData();

if(true==bRet)

LOGA("check succeed.\n");

elseLOGA("check failed.\n");

LOGB("main Finish pid:%d\n",getpid());

return;

}
相关文章
|
5月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
220 3
|
5月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
554 8
|
5月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
395 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1764 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
11月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
603 0
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
626 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
Android开发
如何在Android真机上检测是否有Google Map add-on
如何在Android真机上检测是否有Google Map add-on
208 3
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
586 8
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。