|
楼主 |
发表于 2011-8-18 17:31:41
|
显示全部楼层
Tesla.Angela 发表于 2011-8-18 16:57 
干嘛要用“赐”,“高抬贵手”,“小弟”之类的词语?
纯爷们为了一份代码用这些词语,值得吗?!
如 ...
谢谢,不过已经找到了- NTSTATUS RestoreShadow()
- {
- NTSTATUS status;
- HANDLE hFile;//文件句柄
- OBJECT_ATTRIBUTES ObjAttr;
- UNICODE_STRING ustrWin32k;
- IO_STATUS_BLOCK ioStatus;
- ULONG ulShadowRaw = 0;
- ULONG ulShadowBase = 0;
- PVOID PoolArea = NULL;
- FILE_POSITION_INFORMATION fpi;
- LARGE_INTEGER Offset;
- ULONG OrigAddress = 0;
- ULONG CurAddress = 0;
- ULONG i = 0;
- ULONG ulCount = 0;
- PULONG pAddr;
- if ( pWin32kBase == NULL ||
- KeServiceDescriptorTableShadow == NULL)
- {
- dprintf("Error.");
- return STATUS_UNSUCCESSFUL;
- }
- //索引为1的项目?
- ulCount = KeServiceDescriptorTableShadow[1].Limit;//Linit就是表中函数的个数
- dprintf("Count Of Shadow : %d\n", ulCount );
- ulShadowBase = *(ULONG*)&KeServiceDescriptorTableShadow[1].Base;//得到基址
- dprintf("ulShadowBase = 0x%X\n",ulShadowBase);
- //镜像中的偏移,file offset???
- ulShadowRaw = ulShadowBase - (ULONG)pWin32kBase;
- //ulShadowRaw = RVAToRaw(pWin32kBase,ulShadowBase);
- dprintf("ulShadowRaw = 0x%X\n",ulShadowRaw);
- RtlInitUnicodeString(&ustrWin32k, L"\\SystemRoot\\System32\\win32k.sys");
- //分配空间
- PoolArea = ExAllocatePool( PagedPool, sizeof(ULONG) * ulCount );
- //分配空间,用于保存读取到的数据,因为每个地址的长度sizeof(ULONG),个数是ulCount,所以相乘
- if (!PoolArea) {
- dprintf("PoolArea is null\n");
- return STATUS_UNSUCCESSFUL;
- }
- RtlZeroMemory(&ObjAttr, sizeof(ObjAttr) );
- //获取Win32k.sys的属性
- InitializeObjectAttributes(
- &ObjAttr,
- &ustrWin32k,
- OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- //打开文件win32K.SYS
- status = IoCreateFile(
- &hFile,
- FILE_READ_ATTRIBUTES,
- &ObjAttr,
- &ioStatus,
- 0,
- FILE_ATTRIBUTE_NORMAL,
- FILE_SHARE_READ,
- FILE_OPEN,
- 0,
- NULL,
- 0,
- 0,
- NULL,
- IO_NO_PARAMETER_CHECKING);
- if ( !NT_SUCCESS(status) ) {
- dprintf("IoCreateFile Error : 0x%X", status);
- goto __exit;
- }
- //设置文件偏移
- Offset.LowPart = ulShadowRaw;
- Offset.HighPart = 0;
- //开始读取数据
- status = ZwReadFile (
- hFile,
- NULL,
- NULL,
- NULL,
- &ioStatus,
- //从文件读出到分配空间
- PoolArea,
- ulCount*sizeof(ULONG),
- //偏移
- &Offset,
- NULL);
- if ( !NT_SUCCESS(status) ) {
- dprintf("ZwReadFile Error : 0x%X");
- goto __exit;
- }
- //改变指针类型
- pAddr = (PULONG)PoolArea;
- //比较原始地址与当前的地址并且输出调试
- _asm
- {
- CLI
- MOV EAX,CR0
- AND EAX,NOT 10000H
- MOV CR0,EAX
- }
- for (i=0;i<ulCount;i++) {
- OrigAddress = *pAddr;//指向原始地址
- CurAddress = KeServiceDescriptorTableShadow[1].Base[i];//读取当前地址
- if ( OrigAddress != CurAddress ) {
- dprintf("ID:%-3d.OrigAddr : 0x%X CurAddr : 0x%X---Hooked!\n",i,OrigAddress,CurAddress);
- KeServiceDescriptorTableShadow[1].Base[i]=*pAddr;
- dprintf("Already unhook!");
- } else {
- dprintf("ID:%-3d.OrigAddr : 0x%X.CurAddr : 0x%X\n",i,OrigAddress,CurAddress);
- }
- pAddr++;//指针指向下一个函数
- }
- _asm
- {
- MOV EAX,CR0
- OR EAX,10000h
- MOV CR0,EAX
- STI
- }
- __exit:
- if (PoolArea) {
- ExFreePool(PoolArea);
- //释放空间
- }
- if (hFile) {
- ZwClose(hFile);
- //关闭句柄
- }
- return status;
- }
复制代码 |
评分
-
查看全部评分
|