首页
社区
课程
招聘
[求助]shadow HOOK 哪里的问题
发表于: 2013-4-6 13:36 4270

[求助]shadow HOOK 哪里的问题

2013-4-6 13:36
4270

  (SSDT 代码中找的一个NtOpenProcess 下面有一段NOP NOP NOP NOP 代码段)
我用CR0
*(ULONG*)0x80572949=0;
这样没有问题,改也能改,恢复也没有问题

可是我是我换成Shadow的表就不新了,请教大神解答我的疑惑?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
shadowssdt 要挂靠到gui,亲,你attack了吗?
2013-4-6 15:21
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
先Attach 到 gui 线程 然后才可以 shadow hook
2013-4-6 21:42
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
谢谢二位的帮助,
2013-4-8 07:13
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
Attach  to  csrss.exe
2013-4-8 08:48
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
各位老大,能不能给个Demo参考一下,别逗小弟了,搞不懂
2013-4-8 13:52
0
雪    币: 121
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
感谢各位的帮助,问题已经解决,
以下给我的实现代码,再次感谢几个大哥帮忙


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;
ULONG hookAddr=0;

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
}

OrigAddress = *pAddr;//指向原始地址
_asm
{
MOV EAX,CR0
OR EAX,10000h
MOV CR0,EAX
STI
}

__exit:
if (PoolArea) {
ExFreePool(PoolArea);
//释放空间
}
if (hFile) {
ZwClose(hFile);
//关闭句柄
}
return status;
}
2013-4-9 07:27
0
游客
登录 | 注册 方可回帖
返回
//