安全内核初探(二)

简介: 安全内核初探

编写加载驱动软件


我们知道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


相关文章
|
11月前
|
JavaScript Java 关系型数据库
Springboot+vue的校园新闻管理系统。Javaee项目,springboot vue前后端分离项目。
Springboot+vue的校园新闻管理系统。Javaee项目,springboot vue前后端分离项目。
|
5月前
|
算法 网络协议 安全
C语言在网络编程中有何重要作用
C语言在网络编程中有何重要作用
55 1
|
小程序 Java 开发工具
vc6.0_cn_full(完整绿色版+安装步骤)(支持XP、Win7、Win8、Win10)
VC++6.0中文版(完整绿色精简版) 06-30 VC++6.0中文版(完整绿色精简版) 企业版集成SP6,小巧实用,用于编译VC6.0工程很合适 vc6.0_cn_full(完
507 0
|
5月前
|
数据采集 存储 大数据
Python爬虫:数据获取与解析的艺术
本文介绍了Python爬虫在大数据时代的作用,重点讲解了Python爬虫基础、常用库及实战案例。Python因其简洁语法和丰富库支持成为爬虫开发的优选语言。文中提到了requests(发送HTTP请求)、BeautifulSoup(解析HTML)、Scrapy(爬虫框架)、Selenium(处理动态网页)和pandas(数据处理分析)等关键库。实战案例展示了如何爬取电商网站的商品信息,包括确定目标、发送请求、解析内容、存储数据、遍历多页及数据处理。最后,文章强调了遵守网站规则和尊重隐私的重要性。
75 2
|
5月前
|
传感器 监控 供应链
自动化生产线上的应用
自动化生产线广泛应用在汽车、电子、食品和医药等领域,提高生产效率和质量,节约人力成本。其优势包括生产稳定性强、适应恶劣环境、24小时不间断生产及产品一致性高。随着技术进步,未来自动化生产线将更灵活、定制化,人机融合、绿色环保和智能监控将成为趋势。传感器和电动执行器作为关键组件,优化监控和控制,推动生产效率和质量提升,为企业带来更多机遇与挑战。
98 2
|
存储 NoSQL MongoDB
MongoDB3.4下载教程
MongoDB3.4下载教程
478 0
|
算法 数据挖掘
点球成金:数据分析对抗传统经验的超级案例 | 彭文华
点球成金:数据分析对抗传统经验的超级案例 | 彭文华
|
JavaScript 前端开发 NoSQL
【Node.js实战】一文带你开发博客项目(使用假数据处理)
【Node.js实战】一文带你开发博客项目(使用假数据处理)
103 0
|
Java Python
Python模块Typing.overload的使用
Python模块Typing.overload的使用
72 0
Linux Command printf 输出
Linux Command printf 输出