我想学习一下逆向,是从IDA开始学习。今天把自己写的一个很简单的驱动DUMP下来放IDA里,发现DriverEntry竟然出错。先检查了一遍代码,确定DriverEntry不是放在INIT节中,而是放在正常的TEXT节中,节的属性也是“Text Not pageable Executable Readable”。可是DriverEntry的代码就变成下面这个样子,百思不得其解,请教这是什么缘故?
; NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
.text:F8881000 DriverEntry dd 80h dup(0)
.text:F8881200 dd 380h dup(?)
.text:F8881200 _text ends
补充:我用windbg可以正常uf出驱动入口的代码。
我的代码很简单:
NTSTATUS DriverEntry(
PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pRegistryPath
)
{
PVOID Object = NULL;
HANDLE SystemHandle; //ProcessId != HANDLE
NTSTATUS status;
CLIENT_ID ClientId;
/************************************************************************
typedef struct _CLIENT_ID
{
PVOID UniqueProcess;
PVOID UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
*************************************************************************/
OBJECT_ATTRIBUTES attr={
sizeof(OBJECT_ATTRIBUTES),
0,
NULL,
OBJ_CASE_INSENSITIVE // 对象名不区分大小写
};
ClientId.UniqueProcess = (PVOID)0x4; // System进程的PID
ClientId.UniqueThread = 0;
//根据PID获取进程句柄
status = ZwOpenProcess(
&SystemHandle,
PROCESS_QUERY_INFORMATION,
&attr, //这个参数必须提供,不能为NULL
&ClientId
);
if(!NT_SUCCESS(status))
{
KdPrint(("open process failed!"));
return STATUS_DEVICE_CONFIGURATION_ERROR;
}
// 通过句柄获取对象指针
status = ObReferenceObjectByHandle(
SystemHandle, //IN 对象的句柄
PROCESS_QUERY_INFORMATION, //IN 访问权限
NULL, //IN 对象类型
KernelMode, //IN 内核模式还是用户模式
&Object, //OUT 指向对象指针的指针
NULL //OUT OBJECT_HANDLE_INFORMATION 指针
);
if(NT_SUCCESS(status))
{
ObDereferenceObject(Object); //减少引用计数
}
/************************************************************************/
KdPrint(("Object: %X", Object));
return STATUS_SUCCESS;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)