科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道从Ollydbg说起-----WinDbg用户态调试教程(6)

从Ollydbg说起-----WinDbg用户态调试教程(6)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我假设你已经掌握Ollydbg的使用,并且希望用WinDbg进行内核级的调试。这篇教程将会以Ollydbg为线索,帮助你尽快掌握WinDbg的使用,并简单介绍它的一些特性。我把这篇文章定位为Ollydbg到WinDbg内核调试之间的过渡。

作者:论坛整理 来源:zdnet网络安全 2008年1月9日

关键字: 破解 加密 OllyDBG

  • 评论
  • 分享微博
  • 分享邮件
现在可以知道call dword ptr ss:[ebp+8]的最后是调用TLSCALLBACK,所以结束时必须代替系统释放堆栈,通过这次调试,我们可以用汇编写TLSCALLBACK,并把ANTI DEBUG代码放在这里欺负新人了: P

我们来看看,如果在WinDbg中,应该怎么做。为了让WinDbg看起来容易用一点,我又写了个SCRIPT,它在附件里的名字是gs。复制到程序安装目录,输入$><gs,然后按ENTER。如果程序有TLSCALLBACK,将会断在那里(用了bp设断,然后g的方法,以后也会自动断在那里),没有就断在EP。 
--------------------------------------------------------------gs的注释------------------------------------------------------------
r @$t0=@$peb+8
r @$t0=poi(@$t0)                     ;$通过peb获得基址
r @$t1=@$t0+3c
r @$t1=poi(@$t1)+@$t0
r @$t1=@$t1+c0
r @$t1=poi(@$t1)            ;$取得TLS表基址
.if (@$t1!=0){                         ;$判断TLS表是否存在
r @$t1=@$t1+@$t0
r @$t1=@$t1+c
r @$t1=poi(@$t1)
r @$t1=poi(@$t1)
.if(@$t1!=0){                         ;$判断TLSCALLBACK是否存在
r @$t0=0                ;$是否有TLSCALLBACK的标记
bp @$t1
g
}
}
.if (@$t0!=0){                         ;$没有TLSCALLBACK就GO EP
g $exentry
}
-------------------------------------------------------------注释结束------------------------------------------------------------

现在程序停在入口点了。我用OD的时候习惯静态分析,然后分析到我感兴趣的地方,设断,F9,看寄存器看堆栈。这在WinDbg中不可能,它的反汇编功能真的不怎么样。例如我单步到这里:

call    dword ptr [beta+0x3a3ac (0043a3ac)] ds:0023:0043a3ac={KERNEL32!GetCommandLineW (77e7386f)}

才会显示这个是API调用,在反汇编窗口里面只是单纯显示call    dword ptr [beta+0x3a3ac (0043a3ac)]。你必须跟进那个call,调用栈才有反应,还不如直接用db esp查看堆栈。而且进去之后也不会提示那些是什么参数。所以我一般在使用的时候,同时打开MSDN的搜索页面,当然还有IDA。

0040c7cf 0f85e4010000    jne     beta+0xc9b9 (0040c9b9)                  [br=0]

后面br=0代表没有跳转成功,如果是1,那么就是成功跳转。当然WinDbg也有方便的地方。在Ollydbg的例子中,我是下拉反汇编窗口直接看后面用什么API。而在WinDbg中,你可以使用pc命令,现在直接自动单步到CALL,然后停下来,而不需要关心在这中间遇到多少个条件跳转。

第二次较量,在进行代码分析时WinDbg要逊色一点,它的SCRIPT功能倒是不错,可以弥补一些差距。

关于目标程序:现在我们知道程序通过参数/q启动一个新的进程。用Ollydbg和WinDbg带参数/q重新载入程序。开始的时候,我们曾经用WinDbg双进程调试过,当时新进程产生了一个错误,忽略错误运行之后,我们能停在EP。我希望知道系统是怎么处理这个错误的。

Ollydbg中按F9到达错误处,然后按SHIFT+F7进入SEH链中的第一个例程

WinDbg中按F5到达错误处,然后还是SCRIPT,对应附件中的lseh和disasm这两个文件。一定要复制到安装目录下。$><lseh使用SCRIPT,效果如图:

 
这个SCRIPT的功能是列举所有SEH例程,可以下断,也可以反汇编该例程的前10条命令。我用DML做了一个简单的可视化界面。显然可以做一个界面,通过点鼠标来单步之类的,这样HOOK 快捷键ANTI DEBUG就不可行了。如果你点一下反汇编,你会发现系统DLL里面有很多符号标记,相反Ollydbg却认不出来。也许Micro$oft开发WinDbg就是鼓励别人调试它的产品。
-----------------------------------------------------------SCRIPT注释------------------------------------------------------------
r @$t0=poi(@$teb)                                ;$取得SEH链表的第一个元素
.for (r $t3 = 0; @$t0 !=-1; r $t3 = @$t3 + 1){            ;$到达终点则停止循环
r @$t1=poi(@$t0+4)
.printf /D "[%x]  %X   <link cmd=\"bp /1 %x\">下断</link>   <link cmd=\"r @$t2=%x;$><disasm \">反汇编</link>\n",@$t3,@$t1,@$t1,@$t1    ;$dml的标记跟HTML很象。在””中使用”你需要在”前面加\
r @$t0=poi(@$t0)                   ;$ 即\”\”=””。.printf的用法跟C语言中的一样,我希望你懂C语言 
}
.if (@$t0=-1){
.echo "已达SEH链结尾"
}

反汇编的链接命令是使用disasm这个SCRIPT,并以@$t2来传递参数,下面来看看它的代码:

u @$t2 l10                                              ;$反汇编@$t2指向的地址
.printf /D "<link cmd=\"$><Lseh\">返回</link>\n"             ;$使用lseh
--------------------------------------------------------------结束----------------------------------------------------------------
这有点花俏,我写了另外一个SCRIPT,对应附件中的SEH。它的功能是在第一个SEH例程下断了。gN,断下来。

我们看到处理错误的函数在系统区域,由于忽略错误能回到EP,也就是说该系统SEH例程可以处理错误,然后返回到某处用户代码,于是我在WinDbg中使用guc这个SCRIPT,运行到用户代码为止,结果窗体出来了还没停下来。现在换Ollydbg取消了入口处的断点之后,使用执行到用户代码,效果跟WinDbg一样。重新开始,经过层层跟踪之后发现出问题的地方是INT 2E,单步过去就变成运行。看来R3调试器跟我一样,不认识那东西。也就是说,可以用INT 2E等调用来对抗模拟跟踪,当然这需要你掌握它的使用。至于TLSCALLBACK,或者我们可以假定它出错,系统就会把控制权交回EP,有待实践证明或高手调试证明了。

第三次较量,算是平手了。

最后简单的总结一下WinDbg在R3下的表现:
1.  强大的script功能,适用于自动化完成一些任务。
2.  DML,提供一个简陋的可视化界面与用户进行简单的互动。
3.  HTML文件输出支持,这是我在学习DML的过程中发现的。“.logopen”建立HTML文件,“.printf”输出HTML标记,“.logclose”关闭文件。
4.  适合调试系统内核,它对内核的符号标记比Ollydbg要多。为了获得更多WINDOWS内核的符号支持,你需要通过菜单"File=>Symbol File Path"

然后输入
“srv*%SystemRoot%\symbols*http://msdl.microsoft.com/download/symbols”

注意:此命令行使WinDbg到micro$oft的网站下载符号文件,由于网速以及符号文件库比较大的关系,会导致初次使用时较费时(我这里校园网,等了几分钟)。此外假如程序也加载了一些非micro$oft的模块,WinDbg也会尝试在该网站查找,因此假如你对内核不感兴趣,请把路径设为空格。

 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章