android反调试源码实现

公众号:小道安全 等级 409 1 0

反调试的方法很多,不过由于android系统是开源的,所以反调试其实也不是很神秘的东西。 下面是常见的也是很多厂商都在使用,包括我们项目组也在使用的。多个方案相互结合可以实现更好反调试。

1.1 ptrace自己,使得android_server附加不上

void anti_ptrace()
{
ptrace(PTRACE_TRACEME, 0, 0, 0);
}

1.2. 检测Tracepid的值

void anti_Tracepid()
{
try
{
const int bufsize = 1024;
char filename[bufsize];
char line[bufsize];
int pid = getpid();
sprintf(filename, “/proc/%d/status”, pid);
FILE* fd = fopen(filename, “r”);
if (fd !=NULL)
{
while (fgets(line, bufsize, fd))
{
if (strncmp(line, “TracerPid”, 9) == 0)
{
int statue = atoi(&line[10]);
if (statue != 0)
{
fclose(fd);
int ret = kill(pid, SIGKILL);
}
break;
}
}
fclose(fd);
} else
{
// LOGD(“open %s fail…”, filename);
}
} catch (…)
{

}

}

1.3 检测端口号,针对android_server这个端口号

void anti_serverport() {
const int bufsize=512;
char filename[bufsize];
char line[bufsize];
int pid =getpid();
sprintf(filename,"/proc/net/tcp");
FILE* fd=fopen(filename,“r”);
if(fd!=NULL){
while(fgets(line,bufsize,fd)){
if (strncmp(line, “5D8A”, 4)==0){
int ret = kill(pid, SIGKILL);
}
}
}
fclose(fd);

}

1.4 检测这些调试进程的名字

void anti_processstatus(){
const int bufsize = 1024;
char filename[bufsize];
char line[bufsize];
char name[bufsize];
char nameline[bufsize];
int pid = getpid();
//先读取Tracepid的值
sprintf(filename, “/proc/%d/status”, pid);
FILE *fd=fopen(filename,“r”);
if(fd!=NULL){
while(fgets(line,bufsize,fd)){
if(strstr(line,“TracerPid”)!=NULL)
{
int statue =atoi(&line[10]);
if(statue!=0){
sprintf(name,"/proc/%d/cmdline",statue);
FILE *fdname=fopen(name,“r”);
if(fdname!= NULL){
while(fgets(nameline,bufsize,fdname)){
if(strstr(nameline,“android_server”)!=NULL){
int ret=kill(pid,SIGKILL);
}
}
}
fclose(fdname);
}
}
}
}
fclose(fd);
}

1.5. 检测常放目录:/data/local/tmp

void anti_localtmp(){
int pid=getpid();
const int bufsize=1024;
char line[bufsize];
char filename[bufsize];
sprintf(filename,"/data/local/tmp");
FILE *fd=fopen(filename,“r”);
if(fd!=NULL){
while(fgets(line,bufsize,fd)){
if(strstr(line,“android_server”)!=NULL){
int ret=kill(pid,SIGKILL);
}
}
}
fclose(fd);
}

1.6 检测break point指令

unsigned long GetLibAddr() {
unsigned long ret = 0;
char name[] = “libptrace.so”;
char buf[4096], *temp;
int pid;
FILE *fp;
pid = getpid();
sprintf(buf, “/proc/%d/maps”, pid);
fp = fopen(buf, “r”);
if (fp == NULL) {
puts(“open failed”);
goto _error;
}
while (fgets(buf, sizeof(buf), fp)) {
if (strstr(buf, name)) {
temp = strtok(buf, “-”);
ret = strtoul(temp, NULL, 16);
break;
}
}
_error: fclose(fp);
return ret;
}

1.7 通过使用Linux inotify特性来对文件的读写,以及打开等权限进行监控

void anti_debug06() {
int ret, len, i;
int pid6 = getpid();
const int MAXLEN = 2048;
char buf[1024];
char readbuf[MAXLEN];
int fd, wd;
fd_set readfds;
fd = inotify_init();
sprintf(buf, “/proc/%d/maps”, pid6);
wd = inotify_add_watch(fd, buf, IN_ALL_EVENTS);
if(wd>=0){
while (1) {
i = 0;
FD_ZERO(&readfds);//使得readfds清零
FD_SET(fd, &readfds);//将fd加入readfds集合
ret = select(fd + 1, &readfds, 0, 0, 0);
if(ret==-1){
break;
}
if (ret) {
len = read(fd, readbuf, MAXLEN);
while (i < len) {
struct inotify_event *event = (struct inotify_event *) &readbuf[i];
if ((event->mask & IN_ACCESS) || (event->mask & IN_OPEN)) {
int ret = kill(pid6, SIGKILL);
return;
}
i += sizeof(struct inotify_event) + event->len;
}
}

}
}
inotify_rm_watch(fd, wd);
close(fd);

}

1.8.检测被调试代码的前后时间的差异;

int gettimeofday(struct timeval *tv,struct timezone *tz);
void anti_debug07(){
int pid=getpid();
struct timeval t1;
struct timeval t2;
struct timezone tz;
gettimeofday(&t1,&tz);
gettimeofday(&t2,&tz);
// int timeoff=gettimeofday(&t1,0)-gettimeofday(&t2,0);
int timeoff=(t2.tv_sec)-(t1.tv_sec);
if(timeoff>1){
int ret=kill(pid,SIGKILL);
return ;
}
}

更多安全技术文章,请关注 “小道安全”公众号,一起交流,一起进步。

收藏
评论区

相关推荐

Android 内存管理机制
前言:Android系统是基于Linux内核开发的操作系统,而Linux系统有其独到的内存管理机制,会在进程活动停止后结束该进程。Android在此基础上优化了内存管理,会把进程都保存在内存中,直到系统需要更多内存为止,释放部分进程。这些被保存在内存中的进程,并不会影响系统的运行速度,相反,在重新打开这些进程时,会提升进程启动速度 Android 内存管
C++概述
概述 C 是静态,可编译,通用,大小写敏感,格式自由的编程语言,它支持程序化,面向对象的,和泛型编程方式。 C 被看作是中间层语言,因为它同时包含了低级语言和高级语言的特性。 C 是于 1979 年在新泽西的茉莉山丘的贝尔实验室由 Bjarne Stroustrup 开发的,它是 C 语言的加强版,最开始它被称作 “C with Classes”,但是
《C# 教程》菜鸟教程学习笔记
C简介 下面列出 C 一些重要的功能: 布尔条件(Boolean Conditions) 自动垃圾回收(Automatic Garbage Collection) 标准库(Standard Library) 组件版本(Assembly Versioning) 属性(Properties)和事件(Events) 委托(D
还怕问源码?Github上神级Android三方源码解析手册,已有7.6 KStar
或许对于许多Android开发者来说,所谓的Android工程师的工作“不过就是用XML实现设计师的美术图,用JSON解析服务器的数据,再把数据显示到界面上”就好了,源码什么的,看也好不看也罢,反正应用层的开发用不上,再加上现在优秀的轮子越来越多,拿来主义泛滥,能用就是,反正老板也不关心是不是你自己写的,用我现在老大的话来说,阅读源码似乎只是一种“锦上添花”
创建型工厂设计模式之前置黑魔法(反射)
什么是反射? 为什么说反射是黑魔法? 为什么要在工厂设计模式前扯反射这东西? 首先,既然在工厂设计模式前整它,肯定是在处理工厂设计模式时会用到它;既然都用黑魔法来形容它了,肯定是它异常强大; 那什么是反射嘞?既然能被称为"反",那就肯定会有"正",那,正。。。是啥子嘞?想当然,既然平时我们都不怎么搞反射,那我们平日整的就是正了呗!平时我们实例化一个对象都是是
如果有人再问你 Java 的反射,把这篇文章扔给他
在 Java 中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为 RTTI,英文全称为 RunTime Type Identification,即运行时类型识别,有没有一点“知行合一”的味道?运行时类型识别主要由Class类实现。 在日常的学习工作当中,有一些知识是我们在读书的时候就能够习得;但有一些知识不是的
python百题大冲关-反转字符串中的字符
挑战介绍 实现一个算法来实现反转字符数组的功能。反转的要求如下: 将字符数组的字符进行反转,例如 'b', ' ', 'a', 'r' 变成 'r', 'a', ' ', 'b'。 将字符数组替换为反转后的数组。 本次挑战中,你需要在 reverse_chars.py 文件中补充函数 reverse 的空缺部分。 re
C语言入门系列之5.循环控制结构程序
@ 一、概述循环结构是程序中一种很重要的结构。其特点是:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构: goto语句和if语句构成循环; while语句; dowhile语句; for语句。 二、got
C语言基础习题50例(一)1-5
虎为百兽尊,罔敢触其怒。惟有父子情,一步一回顾。 习题1 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?实现思路:显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。代码如下:cinclude <stdio.hint main(){ int i, j, k,
android反调试源码实现
反调试的方法很多,不过由于android系统是开源的,所以反调试其实也不是很神秘的东西。下面是常见的也是很多厂商都在使用,包括我们项目组也在使用的。多个方案相互结合可以实现更好反调试。 1.1 ptrace自己,使得android_server附加不上javavoid anti_ptrace(){ptrace(PTRACE_TRACEME, 0,
Newtonsoft.Json的使用整理
关于我 引言json是我们在工作中经常用到的一种数据传输格式,开始过程中解析json是我们经常面对的问题。NewtonsoftJson是c的一套json处理封装类,它可以高效,方便地帮助我们处理json。NetonSoftJson提供了完整的使用文档,文档地址如下: NetonSoftJson的不同使用场景 常用方法 序列化和反序列化这应该是我们最常用的俩
10年程序员的编程语言感受与Go的结缘
因为小编最近在写两套教程,分别是Java语言基础教程和Go语言的基础教程,并且这 2 门语言,小编在实际的工作中也都有用过而且 www.helloworld.net 社区的后台,就是用Go语言写的,而且正是小编负责的。况且小编在工作中是用Java的。所以对这两门语言还算比较了解,所以本文对这 2 种语言聊聊小编自己的感受与看法,也顺便聊聊小编这10年来,各种
秋招面试我去了拼多多,直接被问JVM&GC底层原理和算法,我吊打面试官
](https://shimo.im/docs/9GTP6XrJg9J88cJD/) JVM 常用参数设置积累c 堆的初始值,默认物理内存的1/64Xms: 堆的最大值,默认物理内存的1/4Xmx: 年轻代大小「在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8」X
JNI 基础 - Android 共享内存的序列化过程
1. 进程间的通信方式有哪些2. binder 和 socket 通信的区别有哪些3. Android 为什么在大部分场景下用 Binder 进行进程间通信4. Serializable 和 Parcelable 之间的区别5. Parcelable 序列化和反序列化的具体过程不知道大家在面试中的过程中,有没有碰到上面类似的问题,我在腾讯和 oppo 面试的
JNI 基础 - JNIEnv 的实现原理
一.JNI 开发的一般流程在 windows 系统上面我们经常能看到很多类似于 xxx.dll 的文件,在做 android 开发的时候我们能看到很多 xxx.so 的文件。这些都是啥呢?其实就是用 c 和 c++ 实现生成的动态库,供 windows 和 android 系统来调用。我们解压 QQ 和支付宝的 apk 找到它的 libs 目录下,会发现有大