首页
社区
课程
招聘
[讨论]C与C++开始驱动的区别!钩子。。
发表于: 2009-1-14 16:20 6662

[讨论]C与C++开始驱动的区别!钩子。。

2009-1-14 16:20
6662
说个钩子:

C++:
     在钩子函数加了_declspec(naked)。。。后面加了一些处理例如:ZwQuerySystemInformation,ZwOpenProcess...
在C++中编译后,加载驱动一切正常,一段时间(30s)后在WinDbg中出现。
Access Vilocation.....0C000000000000.....

C:
    在钩子中末加_declspec(naked)....。。后面加了一些处理例如:ZwQuerySystemInformation,ZwOpenProcess...
在C中编译后,一切正常。。。。。。。。

说明一下,代码有略微不同,但是功能相同,两个驱动经IDA反汇编,结果一样。。。

高手能否拿新手一点建议。在C++和C中开发驱动。特别是钩子块,好像特容易出问题。
处理函数方面??

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
堆栈乱了吧 ....
2009-1-14 16:37
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
代码问题,跟用什么语言没关系
2009-1-14 16:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我从来都是用c++,怎么没出过问题,我好幸运啊
2009-1-14 17:12
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我的部分代码,也是出问题的代码。
_declspec(naked) NTSTATUS  HookZwOpenProcess( OUT    PHANDLE ProcessHandle,
                                                        IN    ACCESS_MASK DesiredAccess,
                                                        IN    POBJECT_ATTRIBUTES ObjectAttributes,
                                                        IN    PCLIENT_ID ClientId )
{

    if((ClientId != NULL))
    {

        if((ULONG)ClientId->UniqueProcess==548) //阻止pid为548的进程被结束
        {
            DbgPrint( "PID 548 has been accessed,need forbidden");
            ProcessHandle = 0; //返回无效句柄
__asm
{
    mov eax,0C0000022h
    ret 10h
}
//        return STATUS_ACCESS_DENIED; //返回禁止访问
        }
    }
__asm
{
  push ClientId
  push ObjectAttributes
  push DesiredAccess
  push ProcessHandle
  call RealZwOpenProcess
  ret 10h
}
//    return (NTSTATUS)(REALZWOPENPROCESS)RealZwOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );
}

VOID        MyHook_thread(IN PVOID Context)
{
        m_OFF();
        __asm
        {
                push eax
                push ecx
                push edx
                mov eax,dword ptr [ZwOpenProcess]
                mov ecx,dword ptr [KeServiceDescriptorTable]
                mov eax,[eax+1]
                mov ecx,[ecx]
                mov edx,[ecx+eax*4]
                mov g_Oldhook,edx
                mov dword ptr[ecx+eax*4],offset HookZwOpenProcess
                pop eax
                pop ecx
                pop edx

        }
m_ON();
}
//对不起,大家。。
2009-1-14 17:18
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
6
_declspec(naked) 裸函数需要自己平衡堆栈, 你的代码里面怎么没有啊...
2009-1-14 17:47
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
__stdcall
2009-1-14 17:51
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
//我这个函数不是有吗?还有哪里要加啊。。不好意思,,错了。
_declspec(naked) NTSTATUS  HookZwOpenProcess( OUT    PHANDLE ProcessHandle,
              IN    ACCESS_MASK DesiredAccess,
              IN    POBJECT_ATTRIBUTES ObjectAttributes,
              IN    PCLIENT_ID ClientId )
2009-1-14 18:08
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个。。刚刚试过也不行。。不好意思,各位,刚刚本人发错了。。
_declspec(naked) NTSTATUS  HookZwOpenProcess( OUT    PHANDLE ProcessHandle,
                                                        IN    ACCESS_MASK DesiredAccess,
                                                        IN    POBJECT_ATTRIBUTES ObjectAttributes,
                                                        IN    PCLIENT_ID ClientId )
{
        __asm pushad;
    if((ClientId != NULL))
    {
        if((ULONG)ClientId->UniqueProcess==548) //阻止pid为548的进程被结束
        {
            DbgPrint( "PID 548 has been accessed,need forbidden");
            ProcessHandle = 0; //返回无效句柄
                        __asm{
                                popad
mov eax,0C0000022h
                                ret 10h
                        }
//                        return STATUS_ACCESS_DENIED; //返回禁止访问
        }
    }
       
        __asm {
                popad
                push ClientId
                push ObjectAttributes
                push DesiredAccess
                push ProcessHandle
                call RealZwOpenProcess
                ret 10h
        }

//    return (NTSTATUS)(REALZWOPENPROCESS)RealZwOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId );
}
//希望能再次指点。。
2009-1-14 18:13
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Hook ZwOpenProcess,为什么要用_declspec(naked),不用这么麻烦吧

直接自己定义一个不行?
2009-1-14 18:27
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
11
用IDA打开看. 你会发现编译器又帮你压了3个寄存器.
push edi
push ebx
push esi

所以返回的时候都要弹出来啊~~

总之,是堆栈问题. 弄到windbg里一调,就知道了~
2009-1-14 18:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
用C写驱动的飘过.........
用naked就直接全asm的再次飘过.........
2009-1-14 18:53
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
在这先谢谢了,小弟先去调调看。
2009-1-14 18:57
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢各位大侠,问题解决了。。
2009-1-14 20:58
0
游客
登录 | 注册 方可回帖
返回
//