首页
社区
课程
招聘
[求助]关于inlinehook问题--为什么会蓝
发表于: 2008-5-30 20:20 5491

[求助]关于inlinehook问题--为什么会蓝

2008-5-30 20:20
5491
下面代码实现的是对notepad进程的插入APC的监控,
使用的是naked约定
跟了一下,在堆栈平衡中,发现调用的函数strcmp,等,是自己实现堆栈平衡,不是说cdecl的调用约定是调用者实现的吗

然后改了一下,驱动编译通过,加载,运行,但是一打开目标进程(记事本),就会蓝,为什么会这样?
请大牛指点一下


_declspec(naked) Translate_KiInsertQueueApc(PKAPC Apc, KPRIORITY Increment)
{
    KAPC *pApc;
    ULONG pTargetThread;
    //PKTHREAD pTargetThread;
    ULONG pTargetProcess;
    //PEPROCESS pTargetProcess;
    UCHAR *pTargetProcessName;
    DWORD dwTargetProcessId;
   
   
    PEPROCESS pCurrentEprocess;  
    UCHAR *pCurrentProcessName;
    DWORD dwCurrentProcessId;

    _asm{
            //int 3
            nop
            nop
            nop
            nop
            nop
            
            push ebp
            mov ebp,esp
            sub esp,__LOCAL_SIZE
            pushad
            mov edi,ecx
            mov pApc,edi

    }
    pTargetThread=*((PULONG)((ULONG)pApc+0x008));//currentthread是_kthread结构
    pTargetProcess =*((PULONG)((ULONG)pTargetThread + 0x044 ));        
    pTargetProcessName=(UCHAR *)(pTargetProcess+0x174);
    dwTargetProcessId = *((DWORD*)((ULONG)pTargetProcess+0x084));
        
    //当前调用KI函数的进程信息
    pCurrentEprocess=PsGetCurrentProcess();//自己完成恢复堆栈操作
    pCurrentProcessName=(UCHAR *)((ULONG)pCurrentEprocess+0x174);
    dwCurrentProcessId=(DWORD)((ULONG)pCurrentEprocess+0x084);
    //DbgPrint("\nCurrent process name is:%s",pCurrentProcessName);
    //DbgPrint("\nCurrent process id is:%d",dwCurrentProcessId);

    //将进程名转换成小写
    _strlwr(pCurrentProcessName);
   //_asm add esp,4,这里不用恢复堆栈,strlwr(不是cdecl的约定吗)自己恢复,为什么会这样

    _strlwr(pTargetProcessName);
    //_asm add esp,4

   
    //如果是对我们关注的进程进行插入APC
   
    if(strcmp(pTargetProcessName,"notepad.exe")==0)
    {
        //如果不是target进程自己发起的插入APC
        //_asm add esp,8

        if(strcmp(pCurrentProcessName,"notepad.exe")!=0)
        {   
            //恢复上一个strcmp的堆栈
            //_asm add esp,8
            _asm{
                    
                    //popfd
                    popad
                    mov esp,ebp
                    pop ebp
                    
                    ret 8
            }
        }
    }
    //_asm add esp,8
   
    _asm{
            popad
            mov esp,ebp
            pop ebp
    }
    //实现原API的前5个字节
    _asm{
            mov    edi,edi
            push    ebp
            mov    ebp,esp
    }

    //跳转到原API的第六个字节处执行
    _asm{
            mov eax,g_KiInsertQueueApc
            add eax,5
            jmp eax
    }

}

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 709
活跃值: (2575)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
jjgogo同学,

code 发你邮箱了,注意查收。
2008-5-30 20:51
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好的
多谢dami
2008-5-31 15:14
0
雪    币: 149
活跃值: (379)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
//将进程名转换成小写
    _strlwr(pCurrentProcessName);
   //_asm add esp,4,这里不用恢复堆栈,strlwr(不是cdecl的约定吗)自己恢复,为什么会这样

是调用者实现,但是调用者指的是编译器吧
2008-5-31 21:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
sudami可以给我一份源代码么?绝对不会乱散布
loien@163.com
2008-6-1 13:13
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
偶觉得要代码是件挺难为情的事情!不思考,要了也没用呀
2008-6-1 17:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵,其实我也是刚刚开始研究内核
inlinehook刚懂一些,有一些还没接触。
想多看一些代码
2008-6-2 08:13
0
游客
登录 | 注册 方可回帖
返回