首页
社区
课程
招聘
[原创]win7 x64内核调试函数逆向还原C代码,自建调试体系
发表于: 2020-6-10 20:53 17112

[原创]win7 x64内核调试函数逆向还原C代码,自建调试体系

2020-6-10 20:53
17112

一、前言
网上公开的自建调试体系大都是基于wrk xp的,其中mengwuji的为win7 x86,想把该项目用于x64,于是自给自足陆陆续续花了一个月时间成功在win7 x64 sp1上跑起来,该项目参考了前面所述开源代码,在看雪白嫖了这么多干货,不敢藏私,取之于看雪开源于看雪。

 

二、项目概述
采用Vs2019+WDK,提供完整的解决方案,下载即可编译运行。注意事项:
1、PsGetNextProcessThread DbgkDebugObjectType这两个常用的函数、变量采用特征码定位,其余采用解析pdb符号定位函数地址

 

2、采用InlinHook替换以下内核函数:
NtDebugActiveProcess
NtCreateDebugObject
NtRemoveProcessDebug
NtWaitForDebugEvent
NtDebugContinue
DbgkExitProcess
DbgkExitThread
DbgkCopyProcessDebugPort
DbgkForwardException
DbgkMapViewOfSection
DbgkUnMapViewOfSection
DbgkClearProcessDebugObject
DbgkCreateThread
DbgkDebugObjectType-调试对象类型
DbgkpQueueMessage-这换这个的原因是由于偷懒没有重写DbgkpPostModuleMessages,而这个函数内部有调用DbgkpQueueMessage
3、基于win7 x64不负责过PG,有需要的项目里带了老v的时光倒流过pg代码.
4、
图片描述
DebugPort除了在函数内部使用的还需要替换这几处的偏移,我只是做了简单处理把DebugPort移位到ExitTime,这种方案不保险,因为EPROCESS里的其他未使用的成员也可能被列入关照对象,在x64这样干的反调试驱动估计少,为了完美解决可以参考看雪大老xiaofu的这篇帖子扩充EPROCESS结构体https://bbs.pediy.com/thread-246625.htm,使用这种方法也有缺陷,只对之后的新进程有效,使用之前需要创建进程回调记录新加载的进程,自己维护判断进程EPROCESS是否经过扩充。
三、其他
1、由于异常相关函数不能windbg下断调试,嫌麻烦没有处理,只是简单的在KiDispatchException里改了DebugPort偏移,后面有时间会把异常相关的一起处理掉
2、由于在代码里面直接对PEB里的BeingDebugged调试标志写False,所以在进程附加的时候不会被断下。

 

管杀不管埋,蓝屏概不负责!
其他的自己参照代码改吧


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 12
支持
分享
最新回复 (26)
雪    币: 433
活跃值: (1910)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
沙发
2020-6-10 21:22
0
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就是嫖了一下mengwuji呗
2020-6-10 22:17
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢分享,花了不少时间吧
2020-6-10 23:54
0
雪    币: 1525
活跃值: (3422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
yy虫子yy 谢谢分享,花了不少时间吧
技术不到家,花了一个月
2020-6-11 00:10
0
雪    币: 1790
活跃值: (3786)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
支持。
2020-6-11 08:50
0
雪    币: 66
活跃值: (2746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这尼玛全是体力活啊  感谢楼主
2020-6-11 09:11
0
雪    币: 6
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
F5都按烂了 终于等来了
2020-6-11 09:41
0
雪    币: 20
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
前排支持下。。。
2020-6-11 10:30
0
雪    币: 6095
活跃值: (5510)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
10
这个看着就好历害,感谢分享,收藏一波
2020-6-11 10:51
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
牛逼
2020-6-11 15:55
0
雪    币: 19
活跃值: (205)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢分享!
2020-6-14 18:49
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mark  3q
2020-6-14 20:50
0
雪    币: 2466
活跃值: (4561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark
2020-6-14 21:46
0
雪    币: 1485
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主有玩过X64内核重载吗
2020-6-16 17:06
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
2020-6-17 11:54
0
雪    币: 1525
活跃值: (3422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
Ps:  看了下已经有150多次下载了,不得不说一句,源码里面有处坑,有几处需要判断进程是否为64位进程,是的话就写入64位数据否则写入32位数据,而源码里面的把这步判断忽略了,遇到32位进程的时候会写入64位数据造成覆盖其他成员。
2020-6-18 19:49
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
大佬重写X64的NtReadVirtualMemory 为什么会卡死
2020-6-19 17:58
0
雪    币: 75
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
借鉴代码,开始搞win10x64
2020-7-1 10:00
0
雪    币: 75
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20

在 Windows Vista 版本的 WDK 之前,用于驱动程序开发的主要头文件为 Wdm.h、Ntddk.h 和 Ntifs.h,它们包含很多重复声明。
从 Windows Vista 版本的 WDK 开始,Wdm.h、Ntddk.h 和 Ntifs.h 将按层次结构来组织并且不包含重复信息。上层的文件将包含下层的文件。每个函数和结构声明仅出现一次。
Ntifs.h 包含 Ntddk.h,而 Ntddk.h 又包含 Wdm.h。下图显示了此结构。

在这里插入图片描述

最后于 2020-7-1 19:21 被gaojunxin编辑 ,原因:
2020-7-1 19:21
0
雪    币: 3
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
来个 老弟
2020-8-10 14:40
0
雪    币: 1067
活跃值: (627)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
Mark
2020-9-1 02:05
0
雪    币: 1810
活跃值: (4025)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
不错,感谢分享
2020-9-2 11:26
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
tmflxw Ps: 看了下已经有150多次下载了,不得不说一句,源码里面有处坑,有几处需要判断进程是否为64位进程,是的话就写入64位数据否则写入32位数据,而源码里面的把这步判断忽略了,遇到32位进程的时候会 ...
哪几处要判断
2021-12-15 13:55
0
雪    币: 493
活跃值: (1808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
太感谢了
2022-4-7 08:06
0
游客
登录 | 注册 方可回帖
返回
//