驱动-基础编程

admin 2023年11月7日09:35:45评论10 views字数 3736阅读12分27秒阅读模式

基本数据类型

WDK

SDK

ULONG

unsigned long

PULONG

unsigned long*

UCHAR

unsigned char

PUCHAR

unsigned char*

UINT

unsigned int

PUINT

unsigned int*

VOID

void

PVOID

void*

返回数据类型

#define STATUS_SUCCESS 0x00000000    //成功
#define STATUS_INVALID_PARAMETER 0xC000000D //参数无效
#define STATUS_BUFFER_OVERFLOW 0x80000005 //缓冲区长度不够

异常

__try{
//可能出错的代码
}
__except(filter_value) {
//出错时要执行的代码
}
/*
filter_value:
EXCEPTION_EXECUTE_HANDLER(1):代码进入except块
EXCEPTION_CONTINUE_SEARCH(0):不处理异常,由上一层调用函数处理
EXCEPTION_CONTINUE_EXECUTION(-1):回去继续执行错误处的代码
*/
//举例:
__try{
//可能出错的代码
}
__except(EXCEPTION_EXECUTE_HANDLER) {
//出错时要执行的代码
}

常用的内核内存函数

普通程序

内核中

malloc

ExAllocatePoolWithTag

memset

RtlFillMemory

memcpy

RtlMoveMemory

free

ExFreePool

非分页内存与分页内存

介绍这个之前,我们以一个内核函数入手:ExAllocatePoolWithTag

PVOID ExAllocatePoolWithTag(
_In_ POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
);
  • PoolType:即我们需要选择的内存类型

我们Windows内核为我们提供了三种,这里我们主要了解其中的两种

  • NonPagedPool:简单来说,不会被替换,不会有缺页异常,位置固定

  • PagedPool:简单来说,当页不够用,或者使用不频繁,就会被替换掉,存在文件中,当再次使用,会重新分页。

  • NonPagedPoolNx:不做了解

字符串

ANSI_STRING

UNICODE_STRING

RtlInitAnsiString

RtlInitUnicodeString

RtlCopyString

RtlCopyUnicodeString

RtlCompareString

RtlCompareUnicodeString

RtlAnsiStringToUnicodeString

RtlUnicodeStringToAnsiString

课后习题

编写驱动,申请一块内存,并在内存中存储GDT表的所有数据。然后在DebugView中显示出来,最后释放内存。

在这里,我们需要GDT表,有6个字节,前两个字节为大小Limit,后四个字节为Base,基址

// driver.c
#include <ntddk.h>

void DriverUnload(PDRIVER_OBJECT pDriverObject);

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
DbgPrint("[MyDriver] DriverEntryn");
NTSTATUS status = STATUS_SUCCESS;

UCHAR gdtr[6];
_asm
{
sgdt gdtr;
}
//Get Limit
short limit = *(short*)gdtr;
DbgPrint("limit = %xn", limit);

//Get Base
PUINT32 puBase = *(PUINT32)&gdtr[2];
DbgPrint("uBase = %xn", puBase);
PVOID pMem = ExAllocatePoolWithTag(NonPagedPool, limit, NULL);
if (pMem == NULL)
{
DbgPrint("Allocate Memory Error!n");
}
else
{
RtlMoveMemory(pMem, puBase, limit);
for (int i = 0; i < limit / 4; i+=2)
{
DbgPrint("GDT: %0.8X`%0.8Xn", ((PUINT32)pMem)[i], ((PUINT32)pMem)[i + 1]);
}
}
ExFreePool(pMem);

pDriverObject->DriverUnload = DriverUnload;

return status;
}

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
DbgPrint("[MyDriver] DriverUnloadn");

return;
}

驱动-基础编程

编写驱动,实现如下功能:

  • 初始化一个字符串;

  • 拷贝一个字符串;

  • 比较两个字符串是否相等;

  • ANSI_STRINGUNICODE_STRING字符串相互转换;

  • 第四题没写

// driver.c
#include <ntddk.h>

void DriverUnload(PDRIVER_OBJECT pDriverObject);

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
DbgPrint("[MyDriver] DriverEntryn");
NTSTATUS status = STATUS_SUCCESS;

ANSI_STRING as;
UNICODE_STRING us;

RtlInitAnsiString(&as, "Hello ANSI");
RtlInitUnicodeString(&us, L"Hello Unicode");

DbgPrint("ANSI: %Zn", &as);
DbgPrint("Unicode: %wZn", &us);


STRING dst;
char dst_buf[256];
STRING src = RTL_CONSTANT_STRING("Hello KKK");// 把目标字符串初始化为拥有缓冲区长度为256的STRING空串。
RtlInitEmptyAnsiString(&dst, dst_buf, 256 * sizeof(char));
RtlCopyString(&dst, &src);
DbgPrint("STRING: %Zn", &dst);



UNICODE_STRING udst;
WCHAR wcsBuffer[1024] = { 0 };
UNICODE_STRING usrc = RTL_CONSTANT_STRING(L"UnicodeString");
RtlInitEmptyUnicodeString(&udst, wcsBuffer, sizeof(wcsBuffer));
RtlCopyUnicodeString(&udst, &usrc);
DbgPrint("UNICODE_STRING: %wZn", &udst);

/*
* 字符串比较:
* 1.UNICODE字符默认不区分大小写,不论TRUE还是FALSE返回值都是0
* 2.相等返回值为0
* 3.如果s1小于s2,返回负值
* 4.如果s1大于s2,返回正值
*/
UNICODE_STRING s1 = RTL_CONSTANT_STRING(L"HEllo World!");
UNICODE_STRING s2 = RTL_CONSTANT_STRING(L"HelLO woRlD!");
int ret = RtlCompareUnicodeString(&s1, &s2, TRUE); //0
int ret2 = RtlCompareUnicodeString(&s1, &s2, FALSE);
DbgPrint("ret: %dn", ret);
DbgPrint("ret2: %dn", ret2);

ANSI_STRING a1 = RTL_CONSTANT_STRING("HEllo World!");
ANSI_STRING a2 = RTL_CONSTANT_STRING("HelLO woRlD!");
int ret3 = RtlCompareString(&a1, &a2, TRUE);
int ret4 = RtlCompareString(&a1, &a2, FALSE);

DbgPrint("ret3: %dn", ret3);
DbgPrint("ret4: %dn", ret4);



/*UNICODE_STRING pyUs;
RtlCopyUnicodeString(&pyUs, &us);
DbgPrint("Unicode: %Zn", &pyUs);*/




pDriverObject->DriverUnload = DriverUnload;

return status;
}

void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
DbgPrint("[MyDriver] DriverUnloadn");

return;
}

驱动-基础编程


原文始发于微信公众号(loochSec):驱动-基础编程

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月7日09:35:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   驱动-基础编程http://cn-sec.com/archives/2182274.html

发表评论

匿名网友 填写信息