基本数据类型
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_STRING与UNICODE_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):驱动-基础编程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论