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:
}

转载于:https://my.oschina.net/riseworlds/blog/696972

如何防范动态调试(Anti-Debug)(SoftICE篇)相关推荐

  1. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  2. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)

    From:https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250 jeb 动态调试 smali 代码:https://www.bi ...

  3. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  4. Android逆向之旅---动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前说的主要采用的是静态方式,步骤也很简单,首先使用apktool来反编译apk,得到smail源码,然后分析smail代码,采用代码 ...

  5. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)...

    From:https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250 jeb 动态调试 smali 代码:https://www.bi ...

  6. 安卓动态调试七种武器之孔雀翎 – Ida Pro – 蒸米

    原文地址:http://drops.wooyun.org/tips/6840 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的, ...

  7. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

  8. Smalidea+IntelliJ IDEA/Android Studio动态调试安卓app教程

    smalidea smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码. github地址:https://github.c ...

  9. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  10. Android IDA 动态调试最完善攻略,跨过各种坑

    From:https://www.pianshen.com/article/3409449384/ IDA 静态分析 与 动态分析:https://zhuanlan.zhihu.com/p/38983 ...

最新文章

  1. 附录6:TensorFlow基础(二)
  2. 智能假手与机器人融合可以灵活抓取物品
  3. Python 基本数据类型、运算符
  4. 使用 Chrome 开发者工具进行 JavaScript 问题定位与调试
  5. java通过异常处理错误_java 通过异常处理错误
  6. kaptcha配置java_kaptcha 配置
  7. 图像协方差矩阵_深度学习的预处理:从协方差矩阵到图像白化
  8. Python学习笔记之if语句(二)
  9. Word2013中制作按钮控件
  10. Task/Parallel实现异步多线程
  11. Trie树---前缀最相似匹配
  12. archlinux for wps 字体缺失解决办法
  13. fine-grained prosody control专栏
  14. 为什么相敬如宾是对的?
  15. mysql平然_分享 | 36张不可思议的数学知识动图,让你对数学怦然心动!!
  16. zoj 1005 Jugs BFS
  17. C++风格指南(Google版)
  18. binlog2sql 恢复工具使用
  19. 【视频笔记】微信小程序
  20. 随学随考计算机应用基础作业1,【随学随练】统编版四年级下册语文《第一单元》一课一练带答案,快给孩子练习!...

热门文章

  1. win10远程桌面 出现系统管理员已经限制你可以使用的登录类型(网络或交互式)
  2. matlab求一个矩阵的逆矩阵的命令,如何用MATLAB求逆矩阵
  3. java 逆矩阵_用Java实现求逆矩阵
  4. 视频教程-物联网嵌入式技术应用-物联网技术
  5. 内网穿透及常用工具集合
  6. 【Matlab图像隐写】DCT数字水印嵌入与提取【含GUI源码 943期】
  7. 推荐给DBA的Oracle书籍
  8. firewalld系列一:自定义zone与ipset
  9. 挪威访学1:My first flight
  10. 兔子数列规律怎么讲_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈