开发者社区> xumaojun> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Windbg脚本和扩展工具开篇

简介:
+关注继续查看

好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是我最大的动力,希望本系列文章对您有所帮助。

那么一个完整的windbg script是什么样子的呢?首先让我们看如下示例:

$$ 该脚本是列出用户进程和栈

 

复制代码
 
r $t0 = nt!PsActiveProcessHead 
.for (r $t1 = poi(@$t0); (@$t1 != 0) & (@$t1 != @$t0); r $t1 = poi(@$t1)) 

  r? $t2 = #CONTAINING_RECORD(@$t1, nt!_EPROCESS, ActiveProcessLinks); 
  .process @$t2 
  .reload 
  !process @$t2
}
 
复制代码

 

相对于Windbg脚本,windbg扩展比较复杂,而且通常需要花费更大的精力写出同样的功能,但是它带来的一个好处就是你可以获得更多的功能,你甚至可以通过这些扩展写一个调试器,那么一个完整的windbg扩展又是什么样子的呢?该扩展dll打印出一个全局字符串的值。

C++语言编写的windbg扩展示例:

复制代码
 
HRESULT CALLBACK 
PrintPTR(PDEBUG_CLIENT pDebugClient, PCSTR args)
{
    UNREFERENCED_PARAMETER(args);

    IDebugSymbols* pDebugSymbols;
    if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugSymbols), (void **)&pDebugSymbols)))
    {    // Resolve the symbol
        ULONG64 ulAddress = 0;
        if (SUCCEEDED(pDebugSymbols->GetOffsetByName("TestSTLMap!g_wString", &ulAddress)))
        {
            IDebugDataSpaces* pDebugDataSpaces;
            if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugDataSpaces), (void **)&pDebugDataSpaces)))
            {    // Read the value of the pointer from the target address space
                ULONG64 ulPtr = 0;
                if (SUCCEEDED(pDebugDataSpaces->ReadPointersVirtual(1, ulAddress, &ulPtr)))
                {
                    PDEBUG_CONTROL pDebugControl;
                    if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl), (void **)&pDebugControl)))
                    {    // Output the values
                        pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "%p TestSTLMap!g_wString= 0x%p\n", ulAddress, ulPtr);
                        pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "%mu\n", ulPtr);
                        pDebugControl->Release();
                    }
                }
                pDebugDataSpaces->Release();
            }
            pDebugSymbols->Release();
        }
    }
    return S_OK;
}
 
复制代码

 

总结

基于笔者的研究发现,国内做相关研究的人并不多,其实国外也就几个业内比较牛的人做的相对比较好,但是这些工具的作用足以让你震撼,今天开个头,有兴趣的朋友可以继续关注后续文章。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Windbg脚本和扩展工具开篇
好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是我最大的动力,希望本系列文章对您有所帮助。
542 0
[小工具]代码统计小工具编写
代码小工具是有一定工作经验并且有更高追求的程序的必备技能,今天加班到早晨五六点,到家都七点了,回到家倒头就睡,下午来公司感觉头还有点晕乎,工作的话怕只会产生更多的代码,就想起来写个工程代码统计工具。
850 0
第二章排错的工具:调试器Windbg(下)
感谢博主 http://book.51cto.com/art/200711/59874.htm 2.2  读懂机器的语言:汇编,CPU执行指令的最小单元2.2.1  需要用汇编来排错的常见情况 汇编是CPU执行指令的最小单元。
2093 0
第二章排错的工具:调试器Windbg(上)
感谢博主 http://book.51cto.com/art/200711/59731.htm 《Windows用户态程序高效排错》第二章主要介绍用户态调试相关的知识和工具。本文主要讲了排错的工具:调试器Windbg。
1176 0
谈一谈在工作过程中搜集的.NET小工具小程序 数据库脚本工具 VS2010/2012风格的界面框架
原文 http://www.cnblogs.com/JamesLi2015/archive/2013/05/23/3094294.html 工作中遇到的问题,经常会在网络上搜集一些相关的内容,以此扩展以解决相同性质的问题,StackOverflow,CodeProject,CodPlex是我经常查找内容的网站。
1114 0
+关注
xumaojun
乐于学习与分析
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Shell 脚本速查手册
立即下载
15分钟打造你自己的小程序更新版
立即下载
函数计算最佳实践:快速开发一个分布式 Puppeteer 网页截图服务
立即下载