好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对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;
}
 

总结

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

最新文章

  1. Tomcat的粗略介绍
  2. Python笔记(4)类__属性与描述符
  3. 用<forEach>遍历list集合时,提示我找不到对象的属性
  4. Codeforces Round #383 (Div. 2) D 分组背包
  5. Android 内容提供者简介
  6. JavaScript系列:正则表达式
  7. HDOj 1010 DFS优化
  8. NetBeans使用技巧记录
  9. 黑马程序员_JavaIO流(二)
  10. c#中的面向对象基础知识总结
  11. IOS开发之语音合成(科大讯飞)详解
  12. Spring mvc interceptor配置拦截器,没有登录跳到登录页
  13. Oracle安装配置流程
  14. java之JDK的环境变量配置
  15. HashMap原理阅读
  16. c/c++ gdb 调试带参数的程序
  17. mysql客户端连不上数据库
  18. Java 实现 AES 加解密
  19. 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
  20. python中pip

热门文章

  1. [luoguP1437] [HNOI2004]敲砖块(DP)
  2. ubuntu使用git时,终端不显示git分支。
  3. svg学习之旅(3)
  4. POJ3177,/3352.求最少添加多少边使无向图边双连通
  5. Two Sum(hashtable)
  6. 11-Js类和对象
  7. Python的环境变量设置
  8. flask-admin的学习使用
  9. UI 经常用法总结之--- UILabel UITextField (不断更新中)
  10. python爬虫(二)--了解deque