有一定技巧性的问题--->>>>如何知道当前环境是在系统调试状态?

kind_li 2003-10-30 10:30:56
在安装了SOFTICE后,QQ2003运行不起来了,报错:
---------------------------
QQ.exe
---------------------------
This Program does not run on machines with active system debugger!
---------------------------
确定
---------------------------
很想知道QQ2003是如何知道当前环境是在系统调试状态?不知有那位高手知道此法,谢谢!
...全文
88 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
flinming 2003-10-30
  • 打赏
  • 举报
回复
学习。。
kind_li 2003-10-30
  • 打赏
  • 举报
回复
原来有那么多方法可选,谢谢!
会思考的草 2003-10-30
  • 打赏
  • 举报
回复
sorry,是FrogICE,呵呵。
会思考的草 2003-10-30
  • 打赏
  • 举报
回复
调试的话推荐在9x下跟踪,可以用ForgICE进行掩护。或者用TRW、TWX,一般国外的软件对于这两个国产调试器都不防护的。没办法,SoftICE实在太有名了。
会思考的草 2003-10-30
  • 打赏
  • 举报
回复
1.MeltICE子类型
类型:检测SoftICE、TRW2000
平台:Windows9x、Windows NT
原理:用CreateFileA( )或_lopen( )函数试图获得SoftICE的驱动程序"\\.\SICE"(Windows9X版本)、"\\.\SIWDEBUG"、"\\.\NTICE"(Windows NT版本)、"\\.\SIWVID"等的句柄,如果成功则说明SoftICE驻留在内存中。

2.VWIN32_Int41Dispatch子类型
类型:检测SoftICE
平台:Windows9x
原理:VWIN32.VxD(其VxD ID为0x002A)提供一个名为VWIN32_Int41Dispatch的VxD service(其service ID为0x002A),系统内核使用此服务来与系统级调试器如WinDBG、SoftICE等进行通信。其中0x4F号子功能是用来查询调试器是否已经驻留内存并能否处理保护模式程序,如果是的话则调试器应返回0xF386。

3.给SoftICE发送命令
类型:检测SoftICE
平台:Windows9x、Windows NT
原理:通过调试中断int 3给SoftICE发送命令让其执行,其中SI和DI寄存器中放的分别是固定值0x4647("FG")和0x4A4D("JM")。AX中存放的是子功能号,值为0x0911则表示让SoftICE执行命令,此时DX指向一个命令字符串如"HBOOT"等。AX还可以为其它子功能号,比如让SoftICE修改断点设置等。

4、BoundsChecker后门
类型:检测SoftICE
平台:Windows9x、Windows NT
原理:这是SoftICE为BoundsChecker留的一个公开的接口,入口参数EBP = 0x4243484B(即"BCHK"),AL =4,如果SoftICE在内存中则应返回AL = 0。

这种方法一般也要结合SEH?(结构异常处理)来实现,否则当SoftICE不存在时就会引起非法操作。

5.ICECream子类型
类型:检测SoftICE、TRW2000
平台:Windows9x
原理:调试器驻留后修改INT 1和INT 3的入口,指向它自己的处理程序,所以入口高位偏移与其他中断不同。其他所有中断入口高位偏移都相同。

6.INT 68h子类型
类型:检测SoftICE
平台:Windows9x
原理:

MOV AH, 43h
INT 68h
CMP AX, 0F386h ;检测此处是否被调试器设置0F386h
JZ SoftICE_is_here

7.搜索特征串
类型:检测SoftICE
平台:Windows9x
原理:通过在内存中搜索SoftICE的特征串来发现SoftICE,这一般要结合SEH一起使用,以防止引起内存保护出错而使得程序被终止。这种方法在DOS下是可行的。由于Windows95之后的操作系统中的每个ring 3进程的地址空间是独立的,使得这种方法受到限制。比如在内存中搜索"WINICE.BR"。

8.IsDebuggerPresent子类型
类型:检测SoftICE
平台:Windows NT
原理:调用kernel32.dll输出的函数IsDebuggerPresent()来检测是否有调试器存在。这个函数只能检查使用Debug API来跟踪程序的调试器,无法检测SoftICE之类的系统级调试器。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧