表达式
调试中也经常需要查看内存地址或者反汇编地址,这些地址一般通过一些表达式参与计算来获得。其中复杂表达式由基本元素与“(”“)”“】”“【”“+”“——”“^”“|”等符号组合。MDG支持的表达式如下
调试
MDG支持多种调试,有之前学的启动一个进程,有附加到一个进程,还有调试DLL模块,调试服务,调试一段独立的shellcode,也支持子进程调试。
1.调试服务
文件->调试进程,选择服务。
2.调试shellcode
解释:shellcode是一段利用软件漏洞而执行的代码。shell:因为大部分计算机使用者无法也没必要直接接触内核来使用计算机,那么就需要一层代理来连接用户和系统操作内核,在linux中这个就是shell。
在安全研究人员要编写或者分析一段独立代码时,这个功能比较有用。若没有这个功能,研究人员就需要在VC等开发环境下建立一个工程,对Shellcode进行调用。
3.调试DLL
对软件进行研究时候,时常发现需要分析的功能位于某个DLL的输出函数中。MDG支持打开DLL进行调试,并允许直接调试DLL的输出函数。如果正在被调试程序允许中,并且要在特定的DLL模块被加载时终端在模块入口,就单击选项,调试菜单项,选择“在模块载入时停止在模块入口处”。
4.调试子程序
若果碰到了被调试程序在中途启动了一个子进程,需要从入口处调试子进程,MDG可以解决子进程调试的问题。选项,调试菜单项,选择“调试子进程”,那么在子进程在被创建或者启动的时候,MDG会自动启动并开始对子进程调试。
断点
MDG支持普通断点,硬件断点,内存断点,消息断点,模块断点。
其中除了模块断点,其余断点在第二章①中学过了。
模块断点:用于在程序执行到某个模块的代码空间时设断。我们常常不知道程序会在何时调用某个DLL模块,就可以设置模块断点来解决。
其他功能
1.内存搜索
可以直接在输入框输入普通字符串或者十六进制字符,指定内存进行搜索。
2.脚本
有强大的脚本引擎,对于复杂或者繁琐的操作时,可以由脚本自动执行。
3.跟踪
会记录某些函数或者地址被执行。
4.插件
有利于用户的二次开发。
WinDbg
WDG是Windows平台一款强大的用户态和内核态调试工具,是微软的免费调试器。不仅可以调试应用程序还可以完成内核调试,分析崩溃转储文件等工作。
WDG功能十分强大,支持平台包括x86,IA64,AMD64。
windbg的安装与配置
1.版本选择
总结来讲就是x86适用性更高,x64实在其平台上处理文件要用x86版本。
2.工作空间
在WDG开始调试的时候,会建立一个默认的工作空间。使用工作空间workspace来描述项目的属性,参数及设置等信息,相当于集成开发环境的系项目文件。
3.调试符号
调试符号对调试器的工作而言非常重要,可以让使用者了解被调试模块的更多内部信息,例如内部函数名,变量名,结构体的定义等。如果没有调试符号,使用者就只能看到输出表中的函数名称。
目前使用最多的符号文件的就是PDB符号文件,它通常与对应的二进制文件同名,由C/C++编译过程中产生,每个PDB文件都有根据编译时间编译器版本等因素生成的唯一33位特征签名。
用户可以制定一个或者多个目录存放符号文件,用环境变量path来指向这些目录的位置。这样wdg启动时就会自动到目录中搜索符号文件。操作系统经常升级会导致系统中很多某爱的实际版本与发布的符号文件无法匹配,因此,实际使用者中是根据使用的模块版本访问微软提供的符号服务器下载。
调试时,使用命令“ld”从符号文件目录或者符号服务器加载符号,并使用如下方法观察模块符号文件。
使用符号前要了解符号的表示方式。WDG一般表示为“模块名!符号名”。例如kernel32.dll有一个OpenProcess函数,可以将其表示未“kernel32!OpenProcess”。例外是操作系统的内核模块,他有不同的版本和名字,例如ntoskrnl.exe,ntkrnlpa等。使用其中的符号时,可以使用nt这个符号名例如“ntdll!NtOpenProcee”“nt!NtOpenProcess”分别表示ntdll.dll中的NtOpenProcess函数和内核模块中的NtOpenProcess函数,这是不同的函数。如果不加上指定模块名,俺么wdg就会尝试在所有已加载的模块所对应的符号文件中搜索,会降低搜索的效率,所以最好加上模块名前缀。
在有符号文件支持下,WDG支持源代码调试,需要源文件和WDG在同一系统。