网络安全——安卓逆向-反调试与绕过反调试(一)
1024节日快乐!!
前言
在谈到网络安全时,其中反调试在代码保护中扮演着很重要的角色,虽然不能完全阻止攻击者,但是还是能加大攻击者的时间成本,一般与加壳结合使用。
反调试可以分为两类:一类是检测,另一类是攻击,前者是去想各种办法去检测程序是否在被调试,如果正在被调试的话做出一些“反”的举措,比如退出等等,后者是采用攻击的方法,就是想办法让调试器不能正常工作或者是让调试器崩溃,从而阻止它。
一、实战详解分析-关键文件检测
1、IDA案例思路分析
反调试通俗意思就是,程序挂起后突然出现八个F:FFFFFFFF或者在java层运行程序一直运行不起来等情况!
第一个反调试会检测android_server,文件名检测!来分析下android_server源文件。
接下来分析下filecheck,用IDA打开
拖入后,IDA反编译
这是编译可执行文件,那么和so文件有什么区别呢?
SO文件是可以找到JNI_onload,那么编译可执行文件在IDA如何找逻辑所在处呢?
可看到main函数的入口函数,在Exports搜索start:
进来后看到main函数,还有了BL libc_init指令,这时候看看有几个参数?
如果这个函数的参数超过了四个以上(>4),跳转的地址就得用其他的寄存器来替代,libc_init当它这里没有被代替的时候,往下找最大的寄存器只出现了R3为止,没有出现R4以上的寄存器,那么就可以猜测传入的个数的参数为:0-3就是四个参数!TAB查看伪C代码:
双击main方法
这样就是编译可执行程序所要找的main函数
就算在重新打开IDA反编译,还是直接进入main函数处,那么得知道如何进入main函数的地方
开始分析,TAB键打开伪c代码
隐藏类型后:
check()检查,执行下面的循环if,判断if需要执行检查check,双击check进入
v0 = opendir(“/data/local/tmp”); opendir打开/data/local/tmp目录给V0,这是文件指针
result = getpid(); getpid给result。getpid是当前进程的ID。
v2 = result; result给V2
就是说当V0不为空的时候,要执行while里面的循环逻辑,
V3=readdir(v0); readdir()返回参数dir 目录流的下个目录进入点。返回值:成功则返回下个目录进入点. 有错误发生或读取到目录文件尾则返回NULL.
v4 = v3 == 0; 拿V3和0对比
v5 = (v3 + 19); 计算v3+19
if ( v4 ): 判断V3=readdir(v0);是否为null,为空结束循环
如果/data/local/tmp目录下有android_server就会直接kill结束进程,这就是一个文件反调试逻辑思路。
2、案例思路源码分析
过掉文件检查不难,直接改名字即可!开始分析下面的案例。
C语言从这个main函数开始执行,首先对数组的开始一个声明,主要关心check函数。
check就是检测android_server文件的!和之前理解的是一样的,定义了一个字符串指针指向目录/data/local/tmp,然后定义一个文件dir操作,用opendir打开tmp目录,打开后获取pid,接下来判断有没有打开,如果打开不为空(!=)就打开成功下面的while条件代码,currentDir有定义了一个指针,当读取的文件指针不为空(null),就继续往下读取。
遍历一个文件时,如果你的指针指向的下一个位不为空,意味着你的指针的后面还有文件。
3、Android底层详解
上传文件名为android_server和filecheck可执行文件(android_server文件在IDA的dbgsrv目录下)
1、adb push C:\test\filecheck data/local/tmp adb push
2、 C:\test\android_server data/local/tmp
成功上传到底层,可执行文件
为filecheck赋最高权限
chmod 777 filecheck
执行filecheck文件
我们看到执行失败,报处kliied
为android_server改名测试
可以看到改名后,filecheck正常执行!!!
(下一期:实战详解分析-调试端口检测)