刚才那帖我问的不够详细 抱歉噢 再开个帖请教如何用DDK编写一个恢复HOOK NTOPENPROCESS的驱动?
非硬编码 在网上找到的都是硬编码。请问哪位大神可以指教一下非硬编码的应该怎么写?
我想表达的是SSDT HOOK 对抗Inline hook 我参考过一篇文章 上面是
__declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(PHANDLE ProcessHandle,
ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes,
PCLIENT_ID ClientId) 
{
DbgPrint("NtOpenProcess() called");
__asm{
push 0C4h //xp sp2
push 804eb410h 
jmp [JmpAddress] 
}
}NTOPENPROCESS +10字节处 jmp到MyNtOpenProcess 但是MyNtOpenProcess里面为硬编码 此代码为XP SP2里面的值 我是想怎么能让他所有系统都适用 XP系统都适用也OK

解决方案 »

  1.   

    68    c4000000   push    0C4h
    68    60b54e80   push    804eb560
    |         |                 |
    opcode 操作数          这里的数字,即前面的操作数。
      

  2.   

    首先定位到NtOpenProcess函数处,读取前10个字节(memcpy)
    文章中的例子,你读取到的10个字节为
    68 c4 00 00 00 68 60 b5 4e 80
      

  3.   

    #include<ntddk.h>
    typedef unsigned char BYTE;
    VOID Hook();
    VOID Unhook();
    ULONG OldServiceAddress;
    ULONG JmpAddress;
    typedef struct _SERVICE_DESCRIPTOR_TABLE
    {
      PVOID   ServiceTableBase;
      PULONG  ServiceCounterTableBase;
      ULONG   NumberOfService;
      ULONG   ParamTableBase;
    }SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项
    extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数VOID Hook()
    {
    ULONG  Address;
    BYTE data[20] = {0};
    Address= (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为;
    OldServiceAddress=*(ULONG*)Address;
    JmpAddress = (ULONG)NtOpenProcess + 15;   __asm{//去掉内存保护
        cli
        mov  eax,cr0
        and  eax,not 10000h
        mov  cr0,eax
      }
    memcpy(NtOpenProcess,data,15);
    *((ULONG*)Address) = (ULONG)data;//HOOK SSDT
      __asm{//恢复内存保护  
        mov  eax,cr0
        or   eax,10000h
        mov  cr0,eax
        sti
      }
    }
    VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
    {
      DriverObject->DriverUnload = OnUnload;
      Hook();
      return STATUS_SUCCESS;
    }VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
    {
      DbgPrint("Unhooker unload!");}此代码会蓝屏 请各位指点一二
      

  4.   

    windbg打开蓝屏dump,分析。
      

  5.   

    蓝屏时要生成dump。
    windbg直接打开生成的dump就会有提示了。