我们通常使用SoftIce都是使用汇编调试,以前在很多有关SoftIce的文章中看到了基于源码调试的方法.但是自己没有亲自去整过.
遗憾的是按照网上任何一个例子,都不能配置成功,FILE命令显示源码为空.
后来总结了一下,发现问题出在
源码文件的位置.原来,写教程的人,都留了一手.
scz在他的一篇文章中这样写
他编译一个loopback.sys)
复制内容到剪贴板
代码:
一定要用"Win XP Checked Build Environment"编译。编译前先确认两个环境变量的
设置,第二个可以设置成"NTDEBUGTYPE=windbg",也可以保持不变。
> set NTDEBUG
NTDEBUG=ntsd
NTDEBUGTYPE=both
我的DDK开发环境在VMware Host上,调试环境则在VMware Guest上。将loopback.c、
loopback.pdb、loopback.sys复制到VMware Guest上同一目录下,比如onlytemp下。
用installdriver.exe安装loopback.sys。VMware Guest上PATH环境变量已经包含
"C:\Program Files\Compuware\DriverStudio\SoftICE",其下含有nmsym.exe。
--------------------------------------------------------------------------
onlytemp> installdriver.exe -s Loopback -d Loopback -c c:\onlytemp\loopback.sys
onlytemp> nmsym.exe /translate:always,source,package /output:loopback.nms loopback.sys
Compuware NM32 Symbol Translator/Loader version 1.24
(C) Compuware Technologies, 1996-2001
MODULE=loopback.sys
OUTPUT=loopback.nms
PROMPT=OFF
Translation of C:\onlytemp\loopback.sys successfully completed
onlytemp> nmsym.exe /symload:loopback.nms
Compuware NM32 Symbol Translator/Loader version 1.24
(C) Compuware Technologies, 1996-2001
SYMLOAD=loopback.nms
PROMPT=OFF
Symbols for loopback.nms successfully loaded
我在主机上e:\Source\hook2中建立了工程,编写了makefile和source文件
进入DDK Checked Build环境
e:\Source\hook2\build -cZ -x86 编译
然后我将.cpp,.obj,.pdb,.sys以及.h文件全部拷入我虚拟机的c:\c文件夹
更改VMware Guest上的PATH环境变量,加入C:\Program Files\Compuware\DriverStudio\SoftICE
c:\c>net start NTICE 启动SoftIce
然后翻译符号表,注意translate后面的参数,表示将源代码信息加载到符号表
c:\c>nmsym.exe /translate:always,source,package /output:hook2.nms hooks.sys
加载符号表
c:\c>nmsym.exe /symload:hook2.nms
成功将nms文件加载到SoftIce符号表,可以在SoftIce里面用Table命令看到hook2.
设下驱动入口断点:
:BPX hook2!DriverEntry
然后
c:\c>svcs -install hook2 hook2.sys
c:\c>svcs -start hook2
(svcs是我用来加载驱动为服务的一个小工具...)
c:\c>svcs -start hook2执行后SoftIce马上弹出来,停在DriverEntry处.
但是,我用File hook2.cpp想显示源文件的时候,竟然没有作用(-_-!)
File *显示并没有源代码文件加载进来...
问题的发现和解决执行nmsym.exe /translate:always,source,package /output:hook2.nms hooks.sys的时候,返回
MODULE=hook2.sys
OUTPUT=hook2.nms
PROMPT=OFF
Translation of C:\c\hook2.sys successfully completed
注意到PROMPT这个选项
将命令改为:
nmsym.exe /translate:always,source,package /output:hook2.nms hooks.sys /prompt
n
执行后终于现了原型,提示源文件找不到.
怪不得加载了这样的nms不会显示源文件.
通过UltraEdit中的UltraCompare分析生成的目标文件obj和pdb,发现其中含有e:\Source\hook2信息,于是判断可能SoftIce生成符号表的时候会判断这里的源码文件路径,所以才会弹出源文件找不到的提示.
我编译是在主机的e:\Source\hook2上,而在VM虚拟机上并不存在这个路径,所以在虚拟机上调试出现问题.
我在主机C:\中新建一个文件夹c,使得路径和虚拟机一样,成为c:\c
我将主机中的e:\Source\hook2内容全部copy到主机的c:\c中
打开DDK Checked Build环境,在c:\c下重新编译
将新生成的所有文件copy到虚拟机的c:\c中,重新建立符号表:
nmsym.exe /translate:always,source,package /output:hook2.nms hooks.sys /prompt
n
这次没有任何错误提示.
设hook2!DriverEntry断点
c:\c>svcs -start hook2
SoftIce 弹出
File命令显示有4个源码文件加载进来
src切换到源码显示,光标停留在DriverEntry的左花括号所在行.
至此,可以进行源代码调试了.