文档章节

如何防范动态调试(Anti-Debug)(SoftICE篇)

rise-worlds
 rise-worlds
发布于 2016/06/20 13:41
字数 654
阅读 4
收藏 0

Windows NT/2000/XP系统:

1.判断NTICE服务是否运行
在Windows NT/2000/XP系统中,SoftICE是一个内核设备驱动类型的服务,服务名为NTICE,因此可通过判断NTICE服务是否运行来检测SoftICE.

BOOL SoftICEIsLoad()
{
 SERVICE_STATUS ssStatus;
 // 打开服务控制管理器
 SH_HANDLE shServiceManager = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);
 if(NULL == shServiceManager)
  return FALSE;
 // 打开NTICE服务
 SC_HANDLE shMyService = OpenService(shServiceManager, "NTICE", SERVICE_ALL_ACCESS);
 if(QueryServiceStatus(shMyService, &ssStatus)) == 0)
 {
  CloseServiceHandle(shMyService);
  return FALSE;
 }
 // NTICE服务正在运行
 if(SERVICE_RUNNING == ssStatus.dwCurrentState)
 {
  CloseServiceHandle(shMyService);
  return TRUE;
 }
 return FALSE;
}

2.利用 UnhandledExceptionFilter 检测
如果SoftICE加载,SoftICE会在kernel32.dll的UnhandledExceptionFilter函数第一字节外设一个INT 3指令,即用"CC"代替原机器码"55".因此就可根据这个"CC"机器码,判断SoftICE是否加载.

BOOL SoftICEIsLoad()
{
 FARPROC Uadder;
 BYTE Mark = 0;
 (FARPROC&)Uaddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "UnhandledExceptionFilter");
 Mark = *((BYTE)Uaddr);
 // 取UnhandledExceptionFilter函数的第一字节
 if(0xCC == Mark) // 如是则SoftICE已加载
  return TRUE;
 
 return FALSE;
}

3.检测断点
由于SoftICE有针对API设置断点的强大功能,它工作时是在函数前插入INT 3指令(机器码CC),因此检测函数首地址机器码是否为CC就可以判断是否被SofeICE设置断点跟踪.

#include <windows.h>

BOOL IsBPX(void* address);

int WINAPI WinMain(HINSTANCE hInstanec, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
 void* addr;
 addr=MessageBox;
 if(IsBPX(addr))
 {
  MessageBox(NULL,"don't debug me.","help!",MB_HELP);
 }else{
  MessageBox(NULL,"no one.","go go go!",MB_OK);
 }
 
 return 0;
}

BOOL IsBPX(void* address)
{
 _asm
 {
  MOV ESI , address // 被监视函数的地址
  MOV AL  , [ESI]  // 取该函数的机器码
  CMP AL  , 0xCC  // 检测机器码是否为0xCC
  JE  SoftICELoad     // 如果是则函数被跟踪
 }
 return FALSE;
SoftICELoad:
 return TRUE;
}

Windows 9x系统:
1.检测INT 1和INT 3服务的差
在Windows 9x系统中,SoftICE驻留后修改INT 1和INT 3中断的入口,指向它自己的处理程序,其中INT 1和INT 3服务的差总是为1EH利用这点就可检测SoftICE.
这种方法要结合SEH来实现,否则在Windows 2000/XP系统中会产生断点异常.

BOOL SoftICEIsLoad()
{
 char pIDT[6]={0};// IDT保存在这
 try
 {
  _asm
  {
   sidt fword ptr pIDT // 取IDT内容
   mov eax,dword ptr[pIDT+2] // 获取IDT表的基地址
   add eax,8
   mov ebx,[eax] // 取INT 1的低位偏移
   add eax,16
   mov eax,[eax] // 取INT 3的低位偏移
   and eax,0ffffh
   and ebx,0ffffh
   sub eax,ebx  // 计算低位偏移这差
   cmp eax,0xle 如果SoftICE驻留内存,则差为0xle
   jz SoftICELoad
  }
 }
 catch(...)
 {
  return FALSE
 }
 return FALSE;
SoftICELoad:
 return TRUE; 
}

2.检测SoftICE VxD ID

BOOL SoftICEIsLoad()
{
 _asm
 {
  xor     di,di
   mov     es,di
   mov     ax, 1684h      
    mov     bx, 0202h       ; VxD ID of winice
    int     2Fh
    mov     ax, es          ; ES:DI -> VxD API entry point
    add     ax, di
    test    ax,ax
    jnz     SoftICELoad
  }
 return FALSE;
SoftICELoad:
 return TRUE:
}

 

本文转载自:http://www.cnblogs.com/flying_bat/archive/2005/06/10/171655.html

下一篇: C++批判(1)
rise-worlds

rise-worlds

粉丝 3
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
程序调试工具--OllyDbg

OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了.同时还支持插件扩展功能,是目前最强大的调试...

匿名
2010/10/20
7.3K
1
Android安全防护之旅---Android应用"反调试"操作的几种方案解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0910410003/article/details/65935044 一、前言 在之前介绍了很多破解相关的文章,在这个过程中我们难...

尼古拉斯_赵四
2017/04/11
0
0
APK反逆向之一:监控debug

在开发和逆向过程中很多时候都需要动态调试,开发时候可以用开发 android 的 IDE进行调试,native层也可用调试,Android Studio早就可以进行 native 的debug调试了。但是在 release 后的 ap...

凸一_一凸
09/29
0
0
如何动态调试 (ddebug)

这篇文档主要介绍动态调试 (ddebug) 特性. 动态调试的主要功能是允许你动态的打开或关闭内核代码的各种提示信息. 现在, 假如 CONFIG_DYNAMIC_DEBUG 已经设置好了, 那么所有的 pr_debug()/dev...

FGQ
2013/03/24
1K
0
IDEA快捷键拆解系列(十七):Debug篇

  这是IDEA快捷键拆解系列的第十七篇。   本文主要讲解如何利用好IDEA强大的断点调试功能,含快捷键、经验分享等。 Shortcuts:快捷键 Mute Breakpoints:禁用断点 Condition Breakpoint...

mario阿东
2018/03/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于谷歌浏览器崩溃,打不开任何界面

首先:谷歌浏览器右键打开属性,在箭头所指的位置复制粘贴 -no-sandbox。(需要空一格再写入 -no-sandbox) 其次:你打开谷歌浏览器可以看到如下提醒,提醒你,稳定性和安全性会有所下降,但...

Raphael98
16分钟前
2
0
java 删除文件夹下的文件

/** * 删除已经下载过的文件 * @param path * @return */ @ApiOperation(value = "删除已经下载过的Excel",httpMethod="",notes="") @GetMapping("/deleteExcel") public Object downLoad(@......

简小姐
16分钟前
3
0
如何安装GMP,MPFR,MPC,ELF,无需共享库?

如何使用当前版本, 使用正确版本的依赖关系,不使用包管理器(如yum,rpm,apt,dpkg)并且不使用共享库,来逐块安装GCC(GNU编译器集合)? 典型的开发人员可能希望以典型的方式安装GCC,使...

mskk
20分钟前
2
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
25分钟前
2
0
docker修改log-driver后启动失败问题解决

vi /etc/sysconfig/docker 去掉--log-driver=journald 重启docker,重新run一个容器

abowu
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部