当前位置:网站首页>Anti App so层对抗分析

Anti App so层对抗分析

2022-08-09 09:19:00 Codeooo

1.jadx反编译,查看

直接在onCreate之前就进行加载了一个so
在这里插入图片描述

static {
    
        System.loadLibrary("antidebug");
    }

查看so有大文章:
在这里插入图片描述
直接分析动态注册:
在这里插入图片描述

静态分析 改改参数:
至于怎么静态改,查阅之前博客:https://blog.csdn.net/weixin_38927522/article/details/119672156

在这里插入图片描述

  if (((*vm)->GetEnv)(vm) || (v4 = anti_time(), anti_breakpoint(v4, v5), anti_pthread(), registerNativeMethod(v6)) )
    result = -1;
  else
    result = 65540;

jclass FindClass(const char* name) FindClass(查找java中的类)
jclass cls = (*env)->FindClass(env, “类路径”);
|| 或
(v4 = anti_time(), anti_breakpoint(v4, v5), anti_pthread(), registerNativeMethod(v6))

这里有一个成立,则会返回-1

=========anti_time():

在这里插入图片描述
v0 = getpid(); 获取进程id
在这里插入图片描述
在这里插入图片描述

  gettimeofday(&v3, &tz);
  gettimeofday(&tv, &tz);
  v1 = tv.tv_sec - v3.tv_sec;  秒数相减

时间函数,传入两个值,进行相减,看结果是否大于1s
在这里插入图片描述
大于1: kill掉进程,并返回1
小于1 :直接返回0

=========anti_breakpoint:

在这里插入图片描述

if 是 v2,则进入循环,否则报错retuern 0

  v2 = GetLibAddr();
  v3 = v2;
  if ( v2 )

v2为获取的地址值, 地址值若获取到则必然大于1为真:

在这里插入图片描述
这一块循环,都会走到:LABEL_11: return 1
经过我们分析,实际上我们要过掉反调,就应让他返回false
在这里插入图片描述
V6:

  v2 = GetLibAddr();
  v3 = v2;
   v6 = *(v3 + 44); 地址+ 44

v4:初始值为0

这样地方可以考虑在IDA动态调试的时候: 将 if ( v4 >= v6 ) NOP掉直接走break
也可以用010Editor直接修改so 将大于改为小于 方法很多

==========anti_pthread():

在这里插入图片描述
这个地方很明显就是开线程:

  v1 = pthread_self(); 获取自身线程id
  pipe(&pipefd); 加入管道 实现进程通信
  pthread_create(&v1, 0, anti_thread, 0); 创建线程

上面未发现异常,看下创建线程时候,V1地址,V1为自己的线程id

anti_thread:

在这里插入图片描述
看这个,kill -9 强制杀死

kill(childpid, 9);
v2 = getpid();
kill(v2, 9);

这方法大致看了下,获取了线程做了一些操作

在这里插入图片描述
_stack_chk_guard:
详细查阅:https://wiki.osdev.org/Stack_Smashing_Protector 361
用来检查进出函数时堆栈是否平衡和数据是否被修改

v1 = fork(); 一个子进程。成功则赋值childpid,失败则关闭。

在这里插入图片描述
最后才是走registerNativeMethod注册函数:
在这里插入图片描述
//RegisterNatives,注册方法;
//第一个、第二个:env,clazz; 第三个:定义的数组名;第四个:数组元素的个数

原网站

版权声明
本文为[Codeooo]所创,转载请带上原文链接,感谢
https://codeooo.blog.csdn.net/article/details/124589235