安卓逆向之java层反调试

很多同学都问反调试是什么?今天小编就和大家一起去了解什么是反调试,java层反调试,然后一起学习学习!

反调试:

反调试技术是一种常见的反检测技术,因为恶意软件总是企图监视自己的代码以检测是否自己正在被调试。为做到这一点,恶意软件可以检查自己代码是否被设置了断点,或者直接通过系统调用来检测调试器

目录:

Java层反调试的原理介绍

以百度加固实例演示java层反调试

绕过java层反调试的方法

Java层反调试原理介绍

1、在AndroidMainfest.xml文件中,application标签下,Android:debuggable=true。
2、系统默认调试,在build.prop(bort.img),ro.debugable=1.

我们都知道安卓程序动态调试需要满足两个条件,一是在AndroidMainfest.xml文件中在application标签下,Android:debuggable=true。第二是系统默认调试,在build.prop(bort.img),ro.debugable=1。

以百度加固实例演示java层反调试
会调用这个Debug.isDebuggerConnected函数去检测程序是否被调试反调。

1、将样本拖入jdax-gui里面进行反编译
我们首先先把样本拖入到jdax-gui里面进行反编译,去看看他的现象是怎么样的。我们把准备好的程序拖入到jdax-gui里面去。

在这里插入图片描述
拖进去以后我们在这一个方法中来去找一个类.
在这里插入图片描述
我们先来到这manifest.xml中去找一下程序的入口点

在这里插入图片描述

然后我们按照包名去找一下,这里面有一个context在这里插入图片描述
在这里插入图片描述

然后我们在去oncreate,oncreat里面有一个attachBaseContext方法
在这里插入图片描述
在attachBaseContext里面有一个if判断也就是debug.isdebuggerConnected,如果不为真的话,对它的一个取法就会加载so库,否则就不会有so库,也就是说,这个程序会在这里去进行一个判断,用isdebuggerConnected这个函数来检测这个程序是否被反调试或者有没有被调试。
从而去执行是否加载so库的逻辑操作。

在这里插入图片描述
我们点进去看一下,在这里它执行了一个so库。

在这里插入图片描述
以上呢就是java反调试的一个现象。

绕过java层反调试的方法

使用Androidkiller进行反编译,然后搜索isDebuggerConnected,修改此次判断的samil代码即可
我们在之前已经把他进行一个发编译。

在这里插入图片描述
然后我们去到工程搜索里面,我们直接搜索isDebugger
在这里插入图片描述
搜索到了,我们去看一下搜索到的地方,而我们搜索到的地方就是对应着这个jdax-gui里面进行一个判断的一个操作。

在这里插入图片描述
那我们该怎么去绕过这个反调试呢?我们这里在这里去找到if-nez,把这个if-nez,它根据这里的一个判断。实现这里的代码执不执行,那我们直接把这个nez给它改成一个eqz
在这里插入图片描述
它以前是不相等就跳,我们改成相等就跳,和0比较相等就跳,和v0比较相等就跳,那么我们修改过smail之后呢,我们去把这个程序进行一个保存,然后重新打包反编译,就可以绕过反调试了,当然我们不要忘记了签名。

今天小编给大家介绍了java层反调试的原理,然后讲解一个反调试例子,并且过掉java层反调试,不知道朋友们是否听懂呢?没听懂的话赶快来找小编吧,小编给你细细的在说一遍。当然小编也给大家准备了学习大礼包和课程