×

动态防护技术-防调试
  

新手623937 26691人觉得有帮助

{{ttag.title}}
本帖最后由 新手623937 于 2023-3-17 10:04 编辑

动态防护技术是面向App运行过程的防护,一方面可以通过App动态加固技术来实现,比如程序数据加解密保护、进程防动态调试保护、运行日志输出保护、用户信息输入保护等;另一方面需要开发者在App实现方案中采用保护技术,如客户端和服务器端通信过程的保护等。此次仅介绍App动态防护技术的实现思路,不讨论具体的实现方案细节。

1、防调试
在对Android App进行逆向破解的过程中,动态调试是最常用也是最有效的方式。动态调试攻击是指攻击者利用调试器跟踪目标程序运行,查看、修改内存代码和数据,分析程序逻辑,进行攻击和破解等行为。比如对于金融类app,动态调试可以修改APP业务操作时的账号、金额等数据。相应的App防调试安全要求在之前章节已有描述,常用的动态调试工具有IDAPro gdb等,开发者通过提高App防调试的能力,能够增加App的破解难度。
由于Android平台没有禁止用于调试的ptrace系统调用,恶意程序在得到ROOT权限后,可以使用系统API对目标进程的内存、寄存器进行修改,达到执行shellcode、注入恶意模块的目的。在注入恶意模块后,攻击者就可以动态获取内存中的各种敏感信息,例如用户名、密码等。除了 ptrace系统调用外,Android 系统中的proc 文件也暴露了大量的程序进程信息,能够实现对内存的读写操作,因此对程序进行反调试的保护是非常有必要的。攻击者常常利用动态调试工具以及挂钩系统函数跟踪程序的执行流程,分析程序执行逻辑,查看并修改内存中的代码和数据。因此,本节主要介绍防调试和防挂钩方法的基本思路。
1.防调试方法
在Linux系统中,一个进程只能被附加一次,因此可以让App进程复制出子进程,然后对自已进行附加,这样就可以防止调试器在App运行过程中附加到App的进程中。
当一个进程被跟踪时,对应的进程status文件中的TracerPid字段会发生变化。当进程没有被跟踪或者调试时,TracerPid字段的默认值是0;如果进程被跟踪或者被调试,则该字段的值为跟踪进程的pid值。通过轮询/proc/app_pid/status文件,读取TracerPid的字段值,可以判断App当前是否被调试跟踪。以下是检查TracerPid的示例代码:

  1. char file [MAX_ _LEN], line[MAX_ _LEN];
  2. snprintf (file, MAX_ LEN -1, "/proc/%d/status",getpid());
  3. /*这些地方都需要进行下列检查
  4. /proc/<pid>/status

  5. /proc/<pid>/task/ <chdpid>/status,

  6. /proc/<pid>/stat

  7. /proc/ <pid>/task/ <chdpid>/stat

  8. /proc/<pid> /wchan

  9. /proc/ <pid>/task/ <chdpid> /wchan

  10. */

  11. FILE *fp = fopen (file, "r");

  12. while (fgets (line, MAX _LEN -1,fp)) {

  13. if (strncmp (line, "TracerPid:", 10) == 0) {
  14.       if (0 != atoi (&line[10])) {

  15. //进程处于被调试之中
  16.        }
  17.      break;
  18.    }
  19. }
  20. fclose (fp);
复制代码


利用Linux系统的inotify机制监测/proc目录,利用监听函数监测/proc目录是否阻塞在监听处,一旦有调试进程通过/proc文件系统对App进程内存进行读写操作,监听函数就会停止阻塞, 就可以判定有调试进程正在通过/proc文件系统。以下是inotify 监视/proc文件系统中maps是否被访问的示例代码:

  1. bool check_ inotify(){
  2.     int ret, i;
  3.     const int BUF_SIZE = 2048;
  4.     char buf[BUF_ SIZE];
  5.     int fd, wd;
  6.     fd_ set readfds;
  7.     fd = inotify_init();
  8.     sprintf(buf, "/proc/%d/maps", getpid());
  9.     wd = inotify_add_watch(fd, buf, IN_ ALL_EVENTS);
  10.     if(wd>=0){
  11.            while (1) {
  12.                   i= 0;
  13.                   FD_ ZERO(&readfds);
  14.                   FD_ SET(fd, &readfds);
  15.                   ret = select(fd + 1, &readfds, 0, 0, 0); if (ret == -1) {
  16.                      break;
  17.                  }
  18.                  if (ret) {
  19.                      while (i < read(fd, buf, BUF _SIZE)) {
  20.                            struct inotify_event *event = (struct inotify_event *) &buf[i];
  21.                          if ((event->mask & IN_ACCESS) || (event->mask & IN _OPEN)) {
  22.                          // maps被访问
  23.                          return true;
  24.                            }
  25.                         i+=sizeof(struct notify_event)+event->len;
  26.                           }
  27.                  }
  28.          }
  29.    }
  30.    inotify_ rm _watch(fd, wd);
  31.    close(fd);
  32. }
复制代码

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

平凡的小网工 发表于 2023-4-9 11:34
  
我在社区摸爬滚打这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混子有着本质的差别,你一定就是传说中的最强技术牛。
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
西北区每日一问
干货满满
【 社区to talk】
安全效果
技术笔记
新版本体验
技术咨询
功能体验
标准化排查
高手请过招
2023技术争霸赛专题
GIF动图学习
信服课堂视频
产品连连看
社区新周刊
秒懂零信任
技术晨报
自助服务平台操作指引
每周精选
技术圆桌
每日一记
玩转零信任
纪元平台
场景专题
升级&主动服务
全能先锋系列
畅聊IT
答题自测
专家问答
在线直播
MVP
网络基础知识
安装部署配置
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
运维工具
云计算知识
用户认证
原创分享
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
通用技术
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
故障笔记
排障那些事
高频问题集锦
POC测试案例
云化安全能力

本版达人

新手68983...

本周分享达人

零和一网络

本周提问达人