首页
社区
课程
招聘
[原创]基于HOOK的Anti-debug调用点trace和Anti-anti
发表于: 2015-4-16 20:25 29385

[原创]基于HOOK的Anti-debug调用点trace和Anti-anti

2015-4-16 20:25
29385

发一个之前写的辅助调试SO的小东西,限于水平难免会有错误之处,请各位大大批评斧正,小弟感激不尽。

同时,也欢迎各位大大讨论下反调试的技术和Anti方法,让也小弟学学
-------------------------------------------------------------------------------
基于HOOK的Anti-debug调用点trace和Anti-anti
一、  概述
相信动态调试过SO的坛友对Anti并不陌生,比如读取/proc/self/status,/proc/self/task/xxx/status、stat文件查看状态TracePid和PPid,读取wchan查看进程等待,添加notify,模拟器检测等等。经过各种掉坑之后,虽然知道了这些检测方法,但如果elf文件被畸形不能静态分析(修复又是另外一回事了),也只能动态调试在这些关键API处下断点,也免不了掉坑调试崩溃,再来点指令混淆的话,调试起来确实比较恶心。虽然在Android平台同样也存在linux常用的ltrace(库函数trace)和strace(系统调用和信号trace)工具,但不能满足调试需求,还有检测ltrace的调试。废话不多说,直接进入正题(限于水平,难免会有疏漏和错误之处,请各位大大斧正,小弟感激不尽)。

二、  调用点trace
注入Hook API函数,当然首选zygote进程是最方便的了(如果zygote不能注入的话,那就关文档去修改ROM吧)。HooK住函数之后,通常采用下面这种模式添加代码:
Xxx new_fun(xxx){
  Before_call();
  Old_fun();
  After_call();
}
相信许多都知道ARM函数的调用流程,这里再啰嗦下 ARM汇编如何调用函数:
直接调用:BL/BLX  _xxfun
函数指针调用:BL/BLX  Rx
某些混淆代码:mov lr, [pc, #xx], 计算Rx,Ldr PC, Rx等
外部函数调用:BL/BLX _plt表项,plt表中load got表存在的函数地址到PC
被调函数一般模式:
Stmxx {Rx-Rx, lr}  /push

ldmxx {Rx-rx, pc}  /pop

函数的返回地址保存在lr寄存器中,之后被被调函数存在放栈上。只要lr的值未被修改,那么就保存着调用点的下一条指令地址!只要获取lr的值,那么就能跟踪到调用点。
知道了lr保存了调用点的值,获取lr的值也要注意时机。调用函数时lr的值已经被存在放栈上,修改lr也无关紧要。无法确定被调函数是否存在显式地给lr赋值或者函数调用,那要保证lr不被修改,故在函数入口点就保存lr的值是最佳也是最简单的选择。获取lr的值可以通过汇编来实现:
#define GETLR(store_lr)  \
  __asm__ __volatile__(  \
    "mov %0, lr\n\t"  \
    :  "=r"(store_lr)  \
  )
则Hook函数模式:
Xxx new_fun(xxx){
  Unsigned lr;
  GETLR(lr)
  Before_call();
  Old_fun();
  After_call();
}

来个实例,简单起见只Hook fopen函数:
FILE* new_fopen(const char *path,const char * mode){
  unsigned lr;
  GETLR(lr);

  if(strstr(path, "status") != NULL){
    LOGD("

  •  Traced-fopen Call function: 0x%x\n", lr);
  •  Traced-anti-task/status");
  •  Traced-anti-status");
  •  Traced-fopen Call function: 0x%x\n", lr);
  •  Traced-anti-wchan");

  • [招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

    上传的附件:
    收藏
    免费 5
    支持
    分享
    最新回复 (21)
    雪    币: 76
    活跃值: (13)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    2
    感谢分享  学习了
    2015-4-16 21:28
    0
    雪    币: 246
    活跃值: (26)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    入门还是不错的。。。
    2015-4-16 21:43
    0
    雪    币: 3901
    活跃值: (6150)
    能力值: ( LV13,RANK:550 )
    在线值:
    发帖
    回帖
    粉丝
    4
    来学习的,多谢分享。
    2015-4-16 22:00
    0
    雪    币: 335
    活跃值: (263)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    5
    TK牛很nice,技术也nice...
    最近都有撤贴风,马上本地备份一份
    2015-4-17 09:36
    0
    雪    币: 94
    活跃值: (2397)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    6
    好东西,支持一个
    2015-4-17 09:55
    0
    雪    币: 507
    活跃值: (130)
    能力值: ( LV6,RANK:90 )
    在线值:
    发帖
    回帖
    粉丝
    7
    前排顶一顶,好资料,感谢分享~~~~~这个是substrate来做的hook,还是自己实现的框架呢?
    2015-4-17 10:03
    0
    雪    币: 370
    活跃值: (1180)
    能力值: ( LV9,RANK:310 )
    在线值:
    发帖
    回帖
    粉丝
    8
    鬼哥,上次实现的Hook库
    2015-4-17 10:04
    0
    雪    币: 188
    活跃值: (167)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    9
    现在已经工作了吗。还是在某地实习。
    2015-4-17 10:22
    0
    雪    币: 250
    活跃值: (251)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    10
    我用substrate做了个过这些反调试的。  远远没有你这个这么强大呀 哈哈哈  学习学习
    2015-4-17 10:24
    0
    雪    币: 232
    活跃值: (1796)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    学习一下,感谢分享~
    2015-4-17 13:50
    0
    雪    币: 36
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12
    居然是。。。支持大牛。。。。。。。。。。。
    2015-4-17 15:49
    0
    雪    币: 275
    活跃值: (254)
    能力值: ( LV7,RANK:100 )
    在线值:
    发帖
    回帖
    粉丝
    13
    火速围观。楼主真好人。
    2015-4-18 12:39
    0
    雪    币: 217
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    14
    感谢楼主分享.下载研究研究.
    2015-4-20 01:28
    0
    雪    币: 20
    活跃值: (210)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    15
    tk
    是tk教主么。。哈哈
    2015-6-2 09:25
    0
    雪    币: 30
    活跃值: (1332)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    16
    刚学安卓,就碰到各种奇葩的调试问题,这篇资料非常重要完整,谢谢!
    2016-3-27 09:11
    0
    雪    币: 68
    活跃值: (190)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    17
    意思是HOOK zygote这个进程吗? 这样能获取到 我需要获取的进程的 执行吗?
    不是HOOK我要获取的进程吗?
    2016-4-9 20:08
    0
    雪    币: 7818
    活跃值: (1073)
    能力值: ( LV7,RANK:110 )
    在线值:
    发帖
    回帖
    粉丝
    18
    请教楼主是通过什么方式注入的?我用的古河的注入方式,不过需要注入两个so,一个是libTKHooklib.so,一个是libtrace_anti.so,第一个so可以成功注入到Zygote,但是第二个so就不能成功注入了,我在java层system.loadlibrary是可以的。
    2016-5-4 16:03
    0
    雪    币: 7818
    活跃值: (1073)
    能力值: ( LV7,RANK:110 )
    在线值:
    发帖
    回帖
    粉丝
    19
    终于弄出来了,本文中没有写如何注入到Zygote,我下面简单说下:
    参考http://blog.csdn.net/jinzhuojun/article/details/9900105。
    这里要先dlopen libTKHooklib.so ,然后再dlopen libtrace_anti.so。
    再加载之前要在java层先加载一遍,如果加载无误,再去用dlopen加载。如果出现错误,就修改对应的代码,我遇到一个错误,找不到android::AndroidRuntime::findClass(env, JNIREG_CLASS);这个可能和系统有关,注释掉即可。
    static {
                    System.load("/data/data/com.example.anti_antidebug/lib/libTKHooklib.so");
                    System.loadLibrary("trace_anti");
            }
    2016-5-4 16:15
    0
    雪    币: 7818
    活跃值: (1073)
    能力值: ( LV7,RANK:110 )
    在线值:
    发帖
    回帖
    粉丝
    20
    真心感谢分享。
    2016-5-4 22:36
    0
    雪    币: 248
    活跃值: (3789)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    21
    路过留mark
    2016-5-4 22:46
    0
    雪    币: 4687
    活跃值: (253)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    22
    虽然过了好久,还是mark  下,  技术点是不变的
    2017-5-12 15:24
    0
    游客
    登录 | 注册 方可回帖
    返回
    //