windbg使用实践2_使用windbg辅助逆向杀毒软件驱动(注册表操纵相关)

我们这里以腾讯的TSSysKit.sys驱动举例。金山的对应的驱动是kisapi.sys  。360对应的是bapidrv.sys

1 逆向相关的注册表底层操作相关的函数

                 (驱动的大小) 1 s -d b21c4000 L2b000  nt!cmpcallbackcount;
 2 s -d b21c4000 L2b000  nt!CmDeleteKey;
 3 s -d b21c4000 L2b000  nt!CmDeleteValueKey;
 4 s -d b21c4000 L2b000  nt!CmEnumerateKey;
 5 s -d b21c4000 L2b000  nt!CmEnumerateValueKey;
 6 s -d b21c4000 L2b000  nt!CmQueryValueKey;
 7 s -d b21c4000 L2b000  nt!CmSetValueKey    (驱动加载的基地址)
 9 kd> s -d b21c4000 L2b000  nt!cmpcallbackcount;
10 b21e7520  8067d000 80635556 80632514 8063213a  ..g.VUc..%c.:!c.
11 kd> s -d b21c4000 L2b000  nt!CmDeleteKey;
12 b21e7524  80635556 80632514 8063213a 00000000  VUc..%c.:!c.....
13 b21e75a4  80635556 e1bed7f0 8063213a 00000000  VUc.....:!c.....
14 b21e75cc  80635556 825da2d0 00000000 000000bc  VUc...].........
15 kd> s -d b21c4000 L2b000  nt!CmDeleteValueKey;
16 b21e75c0  80631f60 80633aac 00000000 80635556  `.c..:c.....VUc.
17 kd> s -d b21c4000 L2b000  nt!CmEnumerateKey;
18 b21e752c  8063213a 00000000 00000000 00000000  :!c.............
19 b21e75ac  8063213a 00000000 80638392 8001003b  :!c.......c.;...
20 kd> s -d b21c4000 L2b000  nt!CmEnumerateValueKey;
21 b21e75e0  80632212 00000001 805ea292 0000020c  ."c.......^.....
22 kd> s -d b21c4000 L2b000  nt!CmQueryValueKey;
23 b21e7528  80632514 8063213a 00000000 00000000  .%c.:!c.........
24 b21e75bc  80632514 80631f60 80633aac 00000000  .%c.`.c..:c.....
25 kd> s -d b21c4000 L2b000  nt!CmSetValueKey
26 b21e75c4  80633aac 00000000 80635556 825da2d0  .:c.....VUc...].或者使用这样的命令更简洁s -d driver_module_name L2b000  nt!cmpcallbackcount;比如说这样的。s -d bapidrv L2b000  nt!cmpcallbackcount;

当然我们也可以把一些相关的nt函数放进去比方说这样的。

s -d bapidrv L2b000  nt!NtDeleteKey;
s -d bapidrv L2b000  nt!NtDeleteValueKey;
s -d bapidrv L2b000  nt!NtEnumerateKey;
s -d bapidrv L2b000  nt!NtEnumerateValueKey;
s -d bapidrv L2b000  nt!NtQueryValueKey;
s -d bapidrv L2b000  nt!NtSetValueKey;
s -d bapidrv L2b000  nt!NtCreateKey;
s -d bapidrv L2b000  nt!NtOpenKey
 1 kd> s -d bapidrv L2b000  nt!NtDeleteKey;
 2 b179f500  80624c16 80624de6 00000000 00000001  .Lb..Mb.........
 3 kd> s -d bapidrv L2b000  nt!NtDeleteValueKey;
 4 b179f504  80624de6 00000000 00000001 00000000  .Mb.............
 5 kd> s -d bapidrv L2b000  nt!NtEnumerateKey;
 6 b179f4f8  80624fc6 80625230 80624c16 80624de6  .Ob.0Rb..Lb..Mb.
 7 kd> s -d bapidrv L2b000  nt!NtEnumerateValueKey;
 8 b179f4fc  80625230 80624c16 80624de6 00000000  0Rb..Lb..Mb.....
 9 kd> s -d bapidrv L2b000  nt!NtQueryValueKey;
10 b179f4f4  806229be 80624fc6 80625230 80624c16  .)b..Ob.0Rb..Lb.
11 kd> s -d bapidrv L2b000  nt!NtSetValueKey
12 b179f4f0  80622d0c 806229be 80624fc6 80625230  .-b..)b..Ob.0Rb.
13 kd> s -d bapidrv L2b000  nt!NtCreateKey;
14 b179f4e8  80624786 80625b58 80622d0c 806229be  .Gb.X[b..-b..)b.
15 kd> s -d bapidrv L2b000  nt!NtOpenKey
16 b179f4ec  80625b58 80622d0c 806229be 80624fc6  X[b..-b..)b..Ob.

得到了一些dword之后我们就完全可以通过IDA进行栈回溯定位相关的IOCTL_CODE了。变得特别简单了。

我们比较容易的就得到了下面的对应关系 以及相应的对应的ioctl_code

 1 1 BRegCloseKey
 2 2 BRegCreateKey    BRegCreateKeyEx     BRegCreateKeyW     BRegCreateKeyExW    ---?ObOpenObjectByName---?ObReferenceObjectByHandle---?TempHandle = (HANDLE)LongToHandle(KeyBody->Type);
 3 3 BregDeleteKey    BregDeleteKeyEx      BregDeleteKeyW     BregDeleteKeyExW
 4 ---? CmDeleteKey
 5 4 BRegDeleteValue  BRegDeleteValueW                                (0X889928a4)
 6 ---?CmDeleteValueKey
 7 5 BRegEnumKey     BRegEnumKeyEx     BRegEnumKeyW   BRegEnumKeyExW
 8 ---?CmEnumerateKey
 9 6 BRegEnumValue   BRegEnumValueW
10 ---?CmEnumerateValueKey
11 7 BRegOpenKey    BRegOpenKeyEx     BRegOpenKeyW   BRegOpenKeyExW        (0x8899288c)
12 ---? ObOpenObjectByName---?ObReferenceObjectByHandle---? TempHandle = (HANDLE)LongToHandle(KeyBody->Type);
13 8 BRegQueryValueEx   BRegQueryValueExW                            (0x88992890)
14 ---? CmQueryValueKey
15 9 BRegSetValueEx     BRegSetValueExW
16 ---? CmSetValueKey

我们可以使用windbg的条件断点命令来验证我们逆向得到的ioctl_code对不对

1 bp nt!NtDeviceIoControlFile+0x5  ".if (poi(@ebp+0x1c)=0x8899288c) {} .else {gc}"
2 bp nt!NtDeviceIoControlFile+0x5  ".if (poi(@ebp+0x1c)=0x88992890) {} .else {gc}"
3 bp nt!NtDeviceIoControlFile+0x5  ".if (poi(@ebp+0x1c)=0x889928a4) {} .else {gc}"
4 bp nt!NtDeviceIoControlFile+0x5  ".if (poi(@ebp+0x1c)=0x88992888) {} .else {gc}"
5 bp nt!NtDeviceIoControlFile+0x5  ".if (poi(@ebp+0x1c)=0x88992894) {} .else {gc}"

比方说我们逆向得到了 管家的删除注册表的ctl_code。 我们直接用管家删除一个文件 ,用上面的条件断点命令就可以验证我们逆向的对不对了。

我们同时可以使用下面的简单的条件断点的命令观察完整的底层注册表操纵接口栈回溯

bp /t @$thread nt!CmDeleteValueKey
bp /t @$proc     nt!CmDeleteValueKey
时间: 2024-09-30 14:33:39

windbg使用实践2_使用windbg辅助逆向杀毒软件驱动(注册表操纵相关)的相关文章

windbg使用实践1_使用windbg调试杀毒软件的弹窗

1 通过kifastcallentry或者常规的SSDT 挂钩实现的弹窗 2 文件过滤驱动引起弹窗 !process 0 0                         //列出所有进程 .reload!process fffffa800a04b3a0 f   //列出指定进程的所有的栈回溯 !irp                                    //如果是因为释放敏感文件被弹窗使用这条命令观察IRP !fileobj                        

JavaScript网站设计实践(七)编写最后一个页面 改进表单

原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单 一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检查必填字段是否填写.填写格式是否符合要求等. 每个表单里面,当获取到输入焦点时,令提示文本消失 现在开始动手来写. 1.实现思路 (1)在这个表单里会验证的是必填字段和邮箱格式是否正确.首先,把判断必填字段和邮箱格式分别写在两个

小猪的数据结构辅助教程——2.7 线性表中的双向循环链表

小猪的数据结构辅助教程--2.7 线性表中的双向循环链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.了解引入双向循环链表的原因 2.熟悉双向循环链表的特点以及存储结构 3.掌握双向循环链表的一些基本操作的实现逻辑 4.掌握逆序输出双向循环链表元素逻辑 1.双向循环链表的引入 2.双向循环链表的存储结构 双向循环链表的特点: 上面也说了,空间换时间,比起循环链表只是多了一个指向前驱的指针 特点的话: 判断空表:L ->next = L -> prior = L; 存

小猪的数据结构辅助教程——2.4 线性表中的循环链表

小猪的数据结构辅助教程--2.4 线性表中的循环链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.了解单链表存在怎样的缺点,暴露出来的问题 2.知道什么是循环单链表,掌握单链表的特点以及存储结构 3.掌握循环链表的一些基本操作的实现逻辑,最好能手撕代码 1.循环单链表的引入 2.循环链表的特点以及存储结构 循环链表的特点: 上面也说了,比单链表稍微高比格一点的地方就是: 链表最后一个结点的指针域指向了头结点而已,这样形成所谓的环,就是循环单链表了,呵呵! 特点的话有:

小猪的数据结构辅助教程——2.1 线性表中的顺序表

小猪的数据结构辅助教程--2.1 线性表中的顺序表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.抽象数据类型(ADT)的概念,三要素:数据,数据元素间的关系和数据的操作 2.线性表的特点:按照一条线排列的数据集合,1对1,除了首元和尾元,其他元素都有直接前驱和直接后继 3.牢记线性表的存储结构,要理解并熟悉12个基本操作的逻辑,最好能徒手撕出代码 4.求并集,顺序表的经典例子,必须掌握! 1.抽象的数据类型 简单点说: 抽象:有点像我们面向对象语言中的类的思想,将事物

小猪的数据结构辅助教程——2.2 线性表中的单链表

小猪的数据结构辅助教程--2.2 线性表中的单链表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.理解顺序表以及单链表各自的有点以及缺点! 2.熟悉单链表的形式,对于头指针,头结点,尾结点,数据域和指针域这些名词要知道是什么! 3.熟悉单链表的结点结构 4.区分头指针与头结点! 5.熟悉创建单链表的两种方式:头插法和尾插法 6.了解单链表12个基本操作的逻辑 7.有趣的算法题:查找单链表的中间结点~ 1.单链表的引入(顺序表与单链表的PK) 2.单链表的结构图以及一些名

windbg脚本实践1----监控特定文件创建 删除 读写

windbg脚本方便灵活,但是语法古怪,使用的人不多.windbg扩展功能强大,但是使用的人也很少.抛砖引玉吧. 此脚本可以监控到 a 任意时机 开关机时刻  (挂shutdown 删文件 或者开机挂回调特定时刻删文件) b 任意底层穿透驱动  bapidrv  tsyskit  kisapi pchunter  对文件进行的删除 创建 粉碎等敏感操作 $$***************************************************************** $$ S

windbg脚本实践3----监控特定进程创建

$$***************************************************************** $$ Script by kms_hhl to monitor process create and show call stack $$ Create Time 2014_11 $$ nt5 NtCreateProcess->NtCreateProcessEx->PspCreateProcess $$ nt6 NtCreateUserProcess $$ E

windbg脚本实践2----监控特定注册表键值创建和删除

在Cmxxkey层面下断点,配合bp /t (/p)  命令可以监控指定线程 进程 对指定注册表键值的创建和删除. $$***************************************************************** $$ Script by kms_hhl to monitor regvalue delete set $$ Create Time 2014_11 $$ Execute by $$><D:\BaiduYunTongBu\百度云同步盘\windb