《SoftICE IceExt 0.70使用手册》
一、安装使用
SoftICE作为调试器王者当之无愧,但是对于为专业的程序分析来说还有很多不方便的地方,为此诞生了诸如IceExt之类的扩展SoftICE功能的插件,本文将描述IceExt。并逐步分析内核调试的技术和手段。
和以往的版本相比,IceExt有了很大的改观,在0.70版本中主要改变了人工的注册IceExt.sys 和使用net start IceExt的方式,这不知道算不算人性化设计,不过也方便了不少,但这不是最主要的,最大的改变是加入了eXTreme tRaCer Engine。使得SoftIce在输入特定的条件下跟踪单步调试,记录调试的过程信息。
首先,我们先下载IceExt,IceExt可以从http://sourceforge.net/projects/iceext免费获得,在发行版中可以选择二进制版本和源代码,图方便的话,可以下载二进制版本的文件,当然这对于一个专业的调试人员是不适合的,毕竟我们需要研究一下这个东西内部的工作原理,还有是否可以改进的地方,所以我建议还是下载源代码。不过下载源代码的同时你必须保证已经安装了WINDOWXP的DDK,当然你也可以选择WINNT和WIN2000的DDK,但我使用的是WINDOWSXP SP2。
修改make.bat和source文件中的W2K,将其替换成WXP,以及修改sys\source中的ntoskrnlNT4.LIB为$(DDKLIBPATH)\ntoskrnl.lib,我们可以使用make.bat来生成文件。当然我并不是使用make.bat来生成了,而是先去BUILD了SYS,如果你使用的也和我一样是WINDOWS XP SP2相信也会得到 如下的错误。
errors in directory c:\iceext\iceext-0.70-src\sys
libmad.lib(stream.obj) : error LNK2026: module unsafe for SAFESEH image.
libmad.lib(synth.obj) : error LNK2026: module unsafe for SAFESEH image.
libmad.lib(frame.obj) : error LNK2026: module unsafe for SAFESEH image.
libmad.lib(bit.obj) : error LNK2026: module unsafe for SAFESEH image.
libmad.lib(layer3.obj) : error LNK2026: module unsafe for SAFESEH image.
libmad.lib(layer12.obj) : error LNK2026: module unsafe for SAFESEH image.
libmad.lib(timer.obj) : error LNK2026: module unsafe for SAFESEH image.
objfre_wxp_x86\i386\iceext.sys : error LNK1281: Unable to generate SAFESEH image.
什么是SAFESEH? safeseh是一项保护和检测和防止堆栈中的seh被覆盖而导致利用的技术。
在指定 /SAFESEH 后,只有在链接器还可以生成映像的安全异常处理程序表的情况下,该链接器才会生成一个映像。该表指定其异常处理程序适合于该映像的操作系统。
只有在对 x86 目标进行链接时,/SAFESEH 才有效。已说明异常处理程序的平台不支持 /SAFESEH。例如,在 x64 和 Itanium 上,所有异常处理程序都在 PDATA 中说明。ML64.exe 支持添加批注,这些批注将 SEH 信息(XDATA 和 PDATA)发出到映像中,允许您通过 ml64 函数展开。有关更多信息,请参见 MASM for x64 (ml64.exe)。
如果未指定 /SAFESEH,链接器将生成具有安全异常处理程序表的映像(如果所有模块都与安全异常处理功能兼容)。如果任意模块与安全异常处理功能不兼容,则最终的映像将不会包含安全异常处理程序表。如果 /SUBSYSTEM 指定 WINDOWSCE 或某一 EFI_* 选项,则链接器将不尝试生成具有安全异常处理程序表的映像,因为上述任何子系统都不可以利用这些信息。
如果指定了 /SAFESEH:NO,则链接器将不会生成具有安全异常处理程序表的映像,即使所有模块都与安全异常处理程序功能兼容。
链接器无法生成映像的最常见的原因是:该链接器的一个或多个输入文件(模块)与安全异常处理程序功能不兼容。模块与安全异常处理程序不兼容的一个常见原因是:该模块是通过来自以前版本的 Visual C++ 的编译器创建的。
通过使用 .SAFESEH,还可以将函数注册为结构化的异常处理程序。
在 Microsoft Visual C++ 2005 中,无法将现有的二进制文件标记为具有安全异常处理程序(或不具有异常处理程序);必须在生成时添加关于安全异常处理的信息。
链接器能否生成安全异常处理程序表取决于使用 C 运行时库的应用程序。如果使用 /NODEFAULTLIB 进行链接,并希望得到一张安全异常处理程序表,则需要提供加载配置结构(例如可在 loadcfg.c CRT 源文件中找到的结构),此结构包含为 Visual C++ 定义的所有项。
为了编译通过我们必须取消/SAFESEH的连接参数,打开DDK中的i386mk.inc文件,将/SAFESEH参数去掉。好了,我们成功的生成了ICEEXT.SYS,将编译好的ICEEXT.SYS复制到/EXE文件夹,打开ICEExt.rc将
#ifdef _DEBUG
1 BINARY DISCARDABLE "..\\sys\\objchk_w2k_x86\\i386\\IceExt.sys"
#else
1 BINARY DISCARDABLE "..\\sys\\objfre_w2k_x86\\i386\\IceExt.sys"
#endif
改写成
#ifdef _DEBUG
1 BINARY DISCARDABLE "IceExt.sys"
#else
1 BINARY DISCARDABLE "IceExt.sys"
#endif
保存后,BUILD。
OK,我们得到了iceext.exe.
接下来我们要修改SOFTICE的注册表信息。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\NTice]
"KDHeapSize"=dword:00008000
"KDExtensions"=""
好了,可以使用iceext –s来启动softice了。
迫不及待,我CTRL+D;
Lines 45;
Set font 2;
!help后调出了新的ICEEXT的全部功能。
!BC - 清除内存区块中所有的断点
!BL - 列出内存区块中所有的断点
!BPR - 中断在内存范围中
!CP - 设定当前代码页(866 or 1251)
!DUMP - dump内存到磁盘
!DUMPSCREEN - dumpSoftICE屏显成RAW格式到磁盘
!INTSAVE - 存储中断句柄
!INTREST - 恢复中断句柄
!INTXCHG - 置换中断句柄
!INTSHOW - 显示内部中断句柄表
!EB -内存补丁patch byte in memory (restores PTE after patching)
!FONT - 设定屏幕字体
!FPOS - 显示文件指针
!LASTBRANCH - 显示最后的MSR分支信息
!LOADFILE - 打开硬盘文件载入到内存镜像
!PROTECT - 开关 SoftICE 自我保护功能
!HELP - 显示帮助
!SUSPEND - 挂起当前执行的线程(仅ring-3线程)
!RESUME - 唤醒被挂起的线程
!TETRIS - 俄罗斯方块
!TRCINIT-初始化跟踪。
!TRACE-跟踪
!TRCCODE-察看跟踪代码。
书写仓促,下次我将继续将我使用ICEEX的过程和遇到的问题和大家讨论
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!