a289672082 发表于 2012-11-27 23:56:35

流星大哥帮小弟看看哪里不对了。超级郁闷

:Q 蛋疼死了,按照以前学的方法写的内联HOOK,现在怎么用不了了,调试了几十次了还是蓝屏,加载过一段时间后蓝屏,到底哪里错了啊,自定义的函数找不到哪里错了:ULONG GetNt_CurAddr(LONG Suoyin/*比如 0X7A*/)//获取当前SSDT_NtOpenProcess的当前地址

    {
    LONG * SSDT_Adr;
    LONG SSDT_NtOpenProcess_Cur_Addr,t_addr;
   //读取SSDT表中索引值为0xXXX的函数
    t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
   SSDT_Adr=(PLONG)(t_addr+Suoyin*4);
   SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;       
    return SSDT_NtOpenProcess_Cur_Addr;
    }Q



HANDLE Getpid;
PEPROCESS PEPE;
ULONG ADR;
#pragma PAGECODE
//声明自己的NtOpenProcess函数
extern "C" NTSTATUS __declspec(naked) __stdcall NOWOpenProcess(
        OUT   PHANDLE ProcessHandle,
        IN   ACCESS_MASK DesiredAccess,
        IN   POBJECT_ATTRIBUTES ObjectAttributes,
        IN   PCLIENT_ID ClientId ) {
                NTSTATUS   rc;
                HANDLE OPENPID;
               
       
if (ClientId!=NULL)
{
        OPENPID=ClientId->UniqueProcess;
        KdPrint(("现在被打开的进程PID=%d",*((int*)OPENPID)));
//Getpid是在用户层传进来的进程ID
        if (OPENPID==Getpid)
        {
                KdPrint(("发现进程被打开,被保护的进程PID是:%d",(int*)Getpid));
                PEPE=PsGetCurrentProcess();
                KdPrint(("进程__%s__企图打开被保护的进程",(PTSTR)((ULONG)PEPE+0x174)));
                ProcessHandle=NULL;
                __asm{
                        retn 0x10
                }
        }
}


__asm{
                push    0x0C4
                mov eax ,ADR       
                        add eax,0x5
                jmp eax

}

}入口函数:extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS
{ //////////////////////////////////////////////////////////////////////////

pDriverObject->MajorFunction=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
pDriverObject->MajorFunction=ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数
CreateMyDevice(pDriverObject);//创建相应的设备
pDriverObject->DriverUnload=DDK_Unload;
return (1);
}case Hook_code:
                        {
                                int * InputBuffer = (int*)pIrp->AssociatedIrp.SystemBuffer;
                                _asm
                                {
                                        mov eax,InputBuffer
                                                mov ebx,
                                        mov Getpid,ebx

                                }
               
                ADR=GetNt_CurAddr(0x07a);
                           OldNtopenprocess =(NTOPENPROCESS*)ADR;
                                JMPCODE SAVECODE1;
                                PJMPCODE CODE2;
                                CODE2=(PJMPCODE)ADR;
                                ULONG JMPADR;
                                JMPADR=(ULONG)NOWOpenProcess-ADR-5;
                                __asm //去掉页面保护
                                {
                                        cli
                                                mov eax,cr0
                                                and eax,not 10000h //and eax,0FFFEFFFFh
                                                mov cr0,eax

                                }
                                CODE2->E9=0xe9;
                                CODE2->JMPADDR=JMPADR;
                                __asm //恢复页保护
                                {
                                        mov eax,cr0
                                                oreax,10000h //or eax,not 0FFFEFFFFh
                                                mov cr0,eax
                                                sti
                                }
               info = 4;
                               
                                break;
                        }

小小思维 发表于 2012-11-28 11:11:59

这要用windbg调试下,你自己会写代码就可以调试下,输出一些数值看看~

a289672082 发表于 2012-11-28 12:00:19

回复 2# 小小思维


   OPENPID输出的进程PID不正常。。不知道哪里错了,难道是函数定义错了?

a289672082 发表于 2012-11-28 12:03:25

:dizzy: 把自己写的代码全删除了,复制成了教程里的代码,居然也是这样
页: [1]
查看完整版本: 流星大哥帮小弟看看哪里不对了。超级郁闷