概述
参赛网址:
1、2020腾讯游戏技术竞赛
题目要求:
初赛ring0题目:(本题共5分)
DriverDemo.sys是一个驱动程序,它内置了一些限制。
1, 不能篡改该文件,尝试使驱动成功加载。(3分)
2, 该驱动程序成功加载后,突破它的限制,但不允许patch文件或内存,使它成功打印出(用dbgview可接受)调试信息"hello world!".(2分)
请以文档方式,详细描述解题过程,如涉及编写程序,必须提供源代码。
驱动未签名,需要设置Windows 10高级启动选项,禁用驱动程序强制签名后方可答题,支持使用虚拟机。
实操:
1、dump驱动
bp MmGetSystemRoutineAddress然后再用.writemem指令将内存写到文件
然后得到最终的dump文件
2、不能篡改该文件,尝试使驱动成功加载
1、调用KdDebuggerEnabled关闭内核调试(Windbg动态调试直接跳过即可)
2、检查注册表路径\REGISTRY\MACHINE\SOFTWARE\AppDataLow\Tencent\{61B942F7-A946-4585-B624-B2C0228FFEBC}路径下的Key键名的键值为1表示合法此时驱动正常执行加载。
3、显示调试信息"hello world!"
后面的代码就是创建事件
KeResetEvent调用指定的事件对象重置为无信号状态
然后创建线程等待事件收到信号输出:hello world
结论只要我们调用KeSetEvent设置为有信号即可
4、代码编写
逻辑:
1、用IoCreateNotificationEvent 打开事件对象
2、调用KeSetEvent设置信号
#include <ntddk.h>
NTSTATUS DriverNormalDeallDispatch(struct _DEVICE_OBJECT* DeviceObject, struct _IRP* Irp)
{
UNREFERENCED_PARAMETER(DeviceObject);
Irp->IoStatus.Information = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
KdPrint(("卸载成功tn"));
return;
}
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject, //代表本驱动的驱动对象
IN PUNICODE_STRING RegistryPath //驱动的路径,在注册表中
)
{
UNICODE_STRING EventName = { 0 };
UNREFERENCED_PARAMETER(RegistryPath);
//卸载函数
DriverObject->DriverUnload = DriverUnload;
//1、通讯函数、创建设备、符号链接、初始化导出接口
for (size_t i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = DriverNormalDeallDispatch;
}
RtlInitUnicodeString(&EventName, L"\BaseNamedObjects\tp2020");
HANDLE hEvent = 0;
//如果事件对象已经存在,则 IoCreateNotificationEvent 只是打开事件对象。
PRKEVENT pEvent = IoCreateNotificationEvent(&EventName, &hEvent);
if (pEvent)
{
KeSetEvent(pEvent, 0, 0);
}
else
{
KdPrint(("IoCreateNotificationEvent Errortn"));
}
KdPrint(("驱动初始化成功tn"));
return STATUS_SUCCESS;
}
5、最终效果
最后
以上就是小巧戒指为你收集整理的2020腾讯游戏安全技术初赛pc客户端安全R0的全部内容,希望文章能够帮你解决2020腾讯游戏安全技术初赛pc客户端安全R0所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复