[半原创]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 19:16 编辑
完整代码: 用hiv大法就过了。。。
注册表重命名法应该也可以。。。
顺便问下TA大牛
这个论坛的阅读权限跟在线时间有关么? 用hiv大法就过了。。。
注册表重命名法应该也可以。。。
顺便问下TA大牛
这个论坛的阅读权限跟在线时间有 ...
倒霉蛋儿 发表于 2010-8-11 18:24 http://www.m5home.com/bbs/images/common/back.gif
首先说明我不是大牛,“大牛”在我看来是贬义词。就是“牛皮哄哄”的意思。
阅读权限和发帖数目有关,好像是50帖30权限。 绕过的方法太多了,根本不用什么hive操作注册表。
页:
[1]