安全内核初探(二)

简介: 安全内核初探

编写加载驱动软件


我们知道dll加载进入程序需要loadlibrary。而安装驱动等于创建服务,CreateSever把驱动信息记录注册表。


CreateServiceA


SC_HANDLE hService=CreateServiceA(
hSCM,       // handle to SCM database
"CR33",      // name of service to start
"CR33Display",      // display name
SERVICE_ALL_ACCESS,      // type of access to service
SERVICE_KERNEL_DRIVER,        // type of service
SERVICE_DEMAND_START,          // when to start service
SERVICE_ERROR_NORMAL,       // severity of service failure
strPath.toStdString().c_str(),   // name of binary file sys路径
NULL,   // name of load ordering group
NULL,          // tag identifier
NULL,     // array of dependency names
NULL, // account name
NULL        // account password
);

就这几个参数比较重要

6c664b30e16801382e36ff216a50f247_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


dwServiceType

选这个就表示写内核程序

3f44637305b39b57401409f8c88d6c61_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


dwStartType

这个是驱动方式

第一个是系统启动后就会启动

第二个会开机就启动

第三个只有调用startSever才会启动

第四个不能启动

第五个系统初始化之前启动

0a3244fea875cfefb6811614eb795a29_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


lpBinaryPathName


sys路径

StartService(开启驱动)

ControlService(停止)

DeleteService(卸载)


SERVICE_STATUS status;
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
//check
//1.安装 CreateService
SC_HANDLE  hService = CreateService(hSCM,
"cr33Hello",
"cr33Hello",
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER, //内核驱动
SERVICE_DEMAND_START,  /*启动方式*/
SERVICE_ERROR_NORMAL,
"C:\\Documents and Settings\\Administrator\\桌面\\Hello.sys",  //驱动路径
NULL, NULL, NULL, NULL, NULL);
if (hService == NULL)
{
printf("CreateService Error:%d\n", GetLastError());
CloseServiceHandle(hSCM);
system("pause");
return 0;
}
else
{
printf("CreateService OK\n");
}
//2.启动 StartService
if (StartService(hService, NULL, NULL) == 0)
{
printf("StartService Error:%d\n", GetLastError());
DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
system("pause");
return 0;
}
else
{
printf("StartService OK\n");
}
//3.停止 ControlService
ControlService(hService, SERVICE_CONTROL_STOP, &status);
//4.卸载 DeleteService
//OpenService();
DeleteService(hService);
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
system("pause");
return 0;


调试驱动程序


蓝屏保存DUM

当系统出错后会dump内存保存下来

ac681fbfe43089d068ee8392c341d2c5_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


为了看到蓝屏把这个取消

3eba867e8cdced91766bad4ba302341a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


现在编写一个有问题的驱动程序

05fed9af560848c83c7aa61ee2363952_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


启动运行后出错了,可以看到里面有错误驱动名,错误类型还有代码位置

如果真的蓝屏,上面也写了,可以进入安全模式,然后把驱动删除,因为安全模式,只会加载基础的驱动,第三方的都不会加载。

581a8b63e9546dbf57ff5247b5a2e24c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


这个就是我们DUM的文件

8124e532f6a1cdac037b5860a694f7de_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


拷贝出来用windbg打开

4268a67b3957d7b999baab363c679a06_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


点击自动分析

3df73ed7342bfcd38890db3c649a677f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


能分析错误位置,和错误类型,还能调试,有源码的话还能判断哪行出错

836fe295e17d667a508776d30a266aaa_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

679daab768e7aa1435f803f9fee080a8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png



双机调式

我系统64位的所以打开这个

9f25dd44bab909161c69a056e40efb31_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


然后重启虚拟机里面的xp系统

156925af1e0f96bc86cee0db2f1215bb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


最后打开windbg

42040474db273164a32bf622073278fc_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


819a1f63f0b07b082f1b00bac9556a0a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


然后输入g,系统就能正常跑起来

5460d641bab1d4b9d841d10d60b9bcd5_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


现在可以编写驱动的调试代码了,用代码给下断点,我们一般不用int 3

用DbgBreakPoint()

DbgBreakPoint()

_asm int 3

编译好,用加载器启动

694dfa5f9a6e14dad9e689b34e2d66fe_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


触发断点就能调试了


49625d3a8d0565db83682d394c3930b3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


相关文章
|
7月前
|
算法 网络协议 安全
C语言在网络编程中有何重要作用
C语言在网络编程中有何重要作用
75 1
|
JavaScript Java 关系型数据库
Springboot+vue的校园新闻管理系统。Javaee项目,springboot vue前后端分离项目。
Springboot+vue的校园新闻管理系统。Javaee项目,springboot vue前后端分离项目。
|
小程序 Java 开发工具
vc6.0_cn_full(完整绿色版+安装步骤)(支持XP、Win7、Win8、Win10)
VC++6.0中文版(完整绿色精简版) 06-30 VC++6.0中文版(完整绿色精简版) 企业版集成SP6,小巧实用,用于编译VC6.0工程很合适 vc6.0_cn_full(完
604 0
|
7月前
|
数据采集 存储 大数据
Python爬虫:数据获取与解析的艺术
本文介绍了Python爬虫在大数据时代的作用,重点讲解了Python爬虫基础、常用库及实战案例。Python因其简洁语法和丰富库支持成为爬虫开发的优选语言。文中提到了requests(发送HTTP请求)、BeautifulSoup(解析HTML)、Scrapy(爬虫框架)、Selenium(处理动态网页)和pandas(数据处理分析)等关键库。实战案例展示了如何爬取电商网站的商品信息,包括确定目标、发送请求、解析内容、存储数据、遍历多页及数据处理。最后,文章强调了遵守网站规则和尊重隐私的重要性。
98 2
|
存储 NoSQL MongoDB
MongoDB3.4下载教程
MongoDB3.4下载教程
511 0
|
算法 数据挖掘
点球成金:数据分析对抗传统经验的超级案例 | 彭文华
点球成金:数据分析对抗传统经验的超级案例 | 彭文华
|
Java Python
Python模块Typing.overload的使用
Python模块Typing.overload的使用
75 0
|
SQL 运维 测试技术
SQL调优指南—智能索引推荐
索引优化通常需要依赖运维或开发人员对数据库引擎内部优化和执行原理的深入理解。为优化体验和降低操作门槛,PolarDB-X推出了基于代价优化器的索引推荐功能,可根据查询语句分析并推荐索引,帮助您降低查询耗时,提升数据库性能。
SQL调优指南—智能索引推荐
|
弹性计算
阿里云学生机快捷购买
阿里云学生机快捷购买
2422 0