Tesla.Angela 发表于 2010-8-11 09:26:41

[半原创]Hook NtCreateKey防IFEO

本帖最后由 Tesla.Angela 于 2010-8-11 19:55 编辑

年初无聊写着玩的,大家看看吧。保护的是ANTIIFEO.EXE不被劫持。
这个写得并不好,是别人建立了键值之后我才根据KeyHandle判断是否为劫持我的项,如果是,则用ZwDeleteKey删除。
其实可以根据NtCreateKey的ObjectAttributes参数判断,不过我试过一次蓝屏了,所以害怕了,就改用KeyHandle来判断。
绕过的方法见#5。
主要代码:
PVOID GetPointer( HANDLE handle )
{
    PVOID pKey;
    if(!handle)
      return NULL;
    if(ObReferenceObjectByHandle( handle, 0, NULL, KernelMode, &pKey, NULL ) != STATUS_SUCCESS )
      pKey = NULL;
    return pKey;
}

ULONG GetFunctionAddr( IN PCWSTR FunctionName)
{
    UNICODE_STRING UniCodeFunctionName;
    RtlInitUnicodeString( &UniCodeFunctionName, FunctionName );
    return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName );   
}

ULONG GetNtCreateKeyAddr()
{
    ULONG address=0;
    address=0x80624792; //本机硬编码
    KdPrint((" address %x\n",address));
    return address;
}

//原函数
_declspec (naked) NTSTATUS OriginalNtCreateKey
(
    OUT PHANDLEKeyHandle,
    IN ACCESS_MASKDesiredAccess,
    IN POBJECT_ATTRIBUTESObjectAttributes,
    IN ULONGTitleIndex,
    IN PUNICODE_STRINGClassOPTIONAL,
    IN ULONGCreateOptions,
    OUT PULONGDispositionOPTIONAL
)
{
    _asm
    {
      //前五个字节
      push 0C4h
            mov eax,g_NtCreateKey
            add eax,5
            jmp eax
    }
}

//处理函数
NTSTATUS DetourMyNtCreateKey
(
    OUT PHANDLEKeyHandle,
    IN ACCESS_MASKDesiredAccess,
    IN POBJECT_ATTRIBUTESObjectAttributes,
    IN ULONGTitleIndex,
    IN PUNICODE_STRINGClassOPTIONAL,
    IN ULONGCreateOptions,
    OUT PULONGDispositionOPTIONAL
)
{
    PVOID pKey;
    UNICODE_STRING *pUniName;
    ULONG actualLen;
    ANSI_STRING keyname;
    NTSTATUS status;
    UNICODE_STRING uStrValueName;
    PCWSTR ValueName;
    //execute the real function
    status = OriginalNtCreateKey(KeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);
    if (NT_SUCCESS(status))
    {
      pKey = GetPointer(*KeyHandle);
      if(pKey!=NULL)
      {
            //分配内存
            pUniName = ExAllocatePool(NonPagedPool, 1024*2);
            pUniName->MaximumLength = 512*2;
            //将pUniName里的内容清空
            memset(pUniName,0,pUniName->MaximumLength);
            //得到注册表项的路径
            if(NT_SUCCESS(ObQueryNameString(pKey, pUniName, 512*2, &actualLen)))
            {
                RtlUnicodeStringToAnsiString(&keyname, pUniName, TRUE);
                keyname.Buffer=_strupr(keyname.Buffer);
                //判断是不是IFEO项
                if (strcmp(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION\\IMAGE FILE EXECUTION OPTIONS\\ANTIIFEO.EXE") == 0)
                {
                  DbgPrint(" Some one want to hijeak me!");
                  //释放内存
                  RtlFreeAnsiString(&keyname);
                  if(pUniName)
                        ExFreePool(pUniName);
                  //删除键值
                  ZwDeleteKey(*KeyHandle);
                  //关闭句柄
                  ZwClose(*KeyHandle);
                  //返回成功^_^
                  return STATUS_SUCCESS;
                }
            }
      }
    }
    return status;
}

Tesla.Angela 发表于 2010-8-11 09:31:23

本帖最后由 Tesla.Angela 于 2010-8-11 19:16 编辑

完整代码:

倒霉蛋儿 发表于 2010-8-11 18:24:05

用hiv大法就过了。。。
注册表重命名法应该也可以。。。
顺便问下TA大牛
这个论坛的阅读权限跟在线时间有关么?

Tesla.Angela 发表于 2010-8-11 18:54:58

用hiv大法就过了。。。
注册表重命名法应该也可以。。。
顺便问下TA大牛
这个论坛的阅读权限跟在线时间有 ...
倒霉蛋儿 发表于 2010-8-11 18:24 http://www.m5home.com/bbs/images/common/back.gif


首先说明我不是大牛,“大牛”在我看来是贬义词。就是“牛皮哄哄”的意思。
阅读权限和发帖数目有关,好像是50帖30权限。

Tesla.Angela 发表于 2010-8-11 19:02:48

绕过的方法太多了,根本不用什么hive操作注册表。

本网站最菜的人 发表于 2010-8-11 22:17:24

页: [1]
查看完整版本: [半原创]Hook NtCreateKey防IFEO