软件调试详解

本文详细介绍了Windows软件调试的各个方面,包括调试器与被调试程序的连接方式、调试事件的采集与处理、异常处理流程,特别关注了DbgkpSendApiMessage、LoadLibrary等关键函数的作用,并探讨了如何利用异常处理进行反调试。
摘要由CSDN通过智能技术生成

首发于奇安信攻防社区:https://forum.butian.net/share/1478

前言

在windows里面调试跟异常息息相关,如果想要对调试得心应手,异常处理的知识是必不可少的,本文主要介绍的是软件调试方面的有关知识,讲解调试程序和被调试程序之间如何建立联系

调试对象

调试器和被调试程序

调试器与被调试程序之间建立起联系的两种方式

  • CreateProcess

  • DebugActiveProcess

与调试器建立连接

首先看一下DebugActiveProcess

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dO1KufVt-1654001282706)(image-20220331111629799.png)]

调用ntdll.dllDbgUiConnectToDbg

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmOPjpFb-1654001282708)(image-20220331111914219.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5mb053x-1654001282708)(image-20220331112008360.png)]

再调用ZwCreateDebugObject

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnqUx2NV-1654001282709)(image-20220331112048790.png)]

通过调用号进入0环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oskvknMb-1654001282710)(image-20220331112119321.png)]

进入0环创建DEBUG_OBJECT结构体

typedef struct _DEBUG_OBJECT {
     KEVENT EventsPresent;
     FAST_MUTEX Mutex;
     LIST_ENTRY EventList;
     ULONG Flags;
} DEBUG_OBJECT, *PDEBUG_OBJECT;

然后到ntoskrnl里面看一下NtCreateDebugObject

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dipx8ard-1654001282711)(image-20220331113057515.png)]

然后调用了ObInsertObject创建DebugObject结构返回句柄

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FmWiNFR-1654001282712)(image-20220331113136955.png)]

再回到ntdll.dll,当前线程回0环创建了一个DebugObject结构,返回句柄到3环存放在了TEB的0xF24偏移处

也就是说,遍历TEB的0xF24偏移的地方,如果有值则一定是调试器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBNd1EeK-1654001282712)(image-20220331113252356.png)]

与被调试程序建立连接

还是回到kernel32.dllDebugActiveProcess,获取句柄之后调用了DbgUiDebugActiveProcess

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rFTq6Rv-1654001282713)(image-20220331114614705.png)]

调用ntdll.dllDbgUiDebugActiveProcess

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dp68Cz3e-1654001282714)(image-20220331114716677.png)]

跟到ntdll.dll里面的DbgUiDebugActiveProcess,传入两个参数,分别为调试器的句柄和被调试进程的句柄

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2G8Lte3-1654001282714)(image-20220331114846279.png)]

通过调用号进0环

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSXwVcHi-1654001282715)(image-20220331115013208.png)]

来到0环的NtDebugActiveProcess, 第一个参数为被调试对象的句柄,第二个参数为调试器的句柄

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-frQphWnq-1654001282715)(image-20220331115116879.png)]

执行ObReferenceObjectByHandle,把被调试进程的句柄放到第五个参数里面,这里eax本来存储的是调试器的EPROCESS,执行完之后eax存储的就是被调试进程的EPROCE

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值