有驱动锁定IE主页的源码吗?
有驱动锁定IE主页的源码吗? 这还不简单?一般来说直接ZwSetValueKey就行了。 Tesla.Angela 发表于 2011-8-19 13:42 static/image/common/back.gif
这还不简单?
一般来说直接ZwSetValueKey就行了。
亲,这种方法无法锁定哦~ Tesla.Angela 发表于 2011-8-19 13:42 static/image/common/back.gif
这还不简单?
一般来说直接ZwSetValueKey就行了。
亲,hook的话,貌似好可以锁 汗。。。这玩意难点就是加载驱动啦。能加载驱动。爱怎么搞就怎么搞吧。 ywledoc 发表于 2011-8-19 14:19 static/image/common/back.gif
亲,这种方法无法锁定哦~
什么意思? 求解释!~~:( ZwSetValueKey是设置注册表值,改主页的必经之路.
HOOK了它,就能让其它进程对它的调用都由你控制,是否允许.:lol 不如hook ZwOpenKey好用 我现在用的 是用time 控件循环刷新 写入注册表 能被360或者其他软件拦截 能有效的躲过拦截的 代码吗? jackqiang 发表于 2011-8-23 11:37 static/image/common/back.gif
我现在用的 是用time 控件循环刷新 写入注册表 能被360或者其他软件拦截 能有效的躲过拦截的 代码吗?
很明显是不行的。只会把你自己的程序搞死。 你能想到的36蛋也能想到
你想加载驱动。。貌似不行吧,过的了他的驱动检测吗:lol sunshinebean 发表于 2011-9-10 22:43 static/image/common/back.gif
你能想到的36蛋也能想到
你想加载驱动。。貌似不行吧,过的了他的驱动检测吗
哈哈,笑死我了,怎么创造出新名词“36蛋”了!!! Tesla.Angela 发表于 2011-9-11 00:09 static/image/common/back.gif
哈哈,笑死我了,怎么创造出新名词“36蛋”了!!!
360最后那个0不也可以喊蛋嘛{:1_129:}
以前喜欢叫二百五{:1_103:} sunshinebean 发表于 2011-9-11 12:49 static/image/common/back.gif
360最后那个0不也可以喊蛋嘛
以前喜欢叫二百五
二百五、三百六、丧六灵等等名字都是群众耳熟能详的。;P 我也不知道:( baidu得到:
先修改主页,加载驱动就基本OK了吧!!!!*++
HookZwSetValueKey
编译以及调试环境:
Win2K3-sp1 DDK 2003 sp1
By : M80
--*/
实现类似反黑精英的注册表启动项实时监控(我这里只实现了针对某个键值).
测试的参数硬编码的,需要的朋友可以自己修改成用户态下交互的功能.
#include "ntddk.h"
#include <stdio.h>
extern NTSTATUS
ObQueryNameString(void *,
void *,
int size,
int *);
extern NTSYSAPI NTSTATUS NTAPI
ZwSetValueKey( IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize);
// 声明原有函数
typedef NTSTATUS (*REALZWSETVALUEKEY)(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize
);
// 定义一个原函数指针
REALZWSETVALUEKEY RealZwSetValueKey;
// 定义HOOK注册表设置内容的函数
NTSTATUS HookZwSetValueKey(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize
);
// SYSTEMSERVICE 的定义
typedef struct ServiceDescriptorEntry
{
unsigned int * ServiceTableBase; // 关键字段, 指向系统服务分发例程的基地址
unsigned int * ServiceCounterTableBase;
unsigned int NumberOfServices;
unsigned char * ParamTableBase;
}
ServiceDescriptorTableEntry_t, * PServiceDescriptorTableEntry_t;
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)
_function+1)]
void Driver_Unload(PDRIVER_OBJECT ) ;
PVOID GetPointer( HANDLE ) ;
NTSTATUS HookZwSetValueKey(
IN HANDLE ,
IN PUNICODE_STRING ,
IN ULONG TitleIndex ,
IN ULONG ,
IN PVOID ,
IN ULONG ) ;
void Driver_Unload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING usDosDeviceName;
//恢复原来的函数指针
(REALZWSETVALUEKEY)(SYSTEMSERVICE(ZwSetValueKey)) = RealZwSetValueKey;
DbgPrint("HideFile_Unload Called\r\n");
RtlInitUnicodeString(&usDosDeviceName, L"\\DosDevices\\MonitorReg");
IoDeleteSymbolicLink(&usDosDeviceName);
IoDeleteDevice(DriverObject->DeviceObject);
}
//驱动的入口函数
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
NTSTATUS NtStatus = STATUS_SUCCESS;
PDEVICE_OBJECT pDeviceObject = NULL;
UNICODE_STRING usDriverName, usDosDeviceName;
DbgPrint("DriverEntry Called\r\n");
RtlInitUnicodeString(&usDriverName, L"\\Device\\MonitorReg");
RtlInitUnicodeString(&usDosDeviceName, L"\\DosDevices\\MonitorReg");
NtStatus = IoCreateDevice(pDriverObject,
0,
&usDriverName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pDeviceObject);
if (STATUS_SUCCESS == NtStatus)
{
pDriverObject->DriverUnload = Driver_Unload;
}
IoCreateSymbolicLink(&usDosDeviceName, &usDriverName);
// 保存 ZwSetValueKey 函数的入口地址
RealZwSetValueKey = (REALZWSETVALUEKEY)(SYSTEMSERVICE(ZwSetValueKey));
(REALZWSETVALUEKEY)(SYSTEMSERVICE(ZwSetValueKey)) = HookZwSetValueKey;
return NtStatus ;
}
PVOID GetPointer( HANDLE handle )
{
PVOID pKey;
if(!handle)
return NULL;
// ObReferenceObjectByHandle函数来获得这个Handle对应的FileObject, 得到的指针转换成文件对象的
指针
if( ObReferenceObjectByHandle( handle, 0, NULL, KernelMode, &pKey, NULL ) != STATUS_SUCCESS )
{
pKey = NULL;
}
return pKey;
}
//HOOK设置注册表键值的函数
NTSTATUS HookZwSetValueKey(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize)
{
NTSTATUS rc;
UNICODE_STRING *pUniName; //定义得到修改注册表的UNI路径
ULONG actualLen;
ANSI_STRING keyname,
akeyname,
m_keyname,
m_akeyname; //定义得到修改注册表的UNI路径
PVOID pKey;
RtlUnicodeStringToAnsiString( &akeyname, ValueName, TRUE);
RtlUnicodeStringToAnsiString( &m_akeyname, ValueName, TRUE);
RtlUpperString(&akeyname,&m_akeyname);
RtlFreeAnsiString(&m_akeyname);
// 得到文件对象的指针
if( pKey = GetPointer( KeyHandle))
{
// 分配内存
pUniName = ExAllocatePool( NonPagedPool, 512*2+2*sizeof(ULONG));
pUniName->MaximumLength = 512*2;
// 保证空间内没有不干净的数据
memset(pUniName,0,pUniName->MaximumLength);
if( NT_SUCCESS( ObQueryNameString( pKey, pUniName, 512*2, &actualLen) ) )
{
RtlUnicodeStringToAnsiString( &keyname, pUniName, TRUE);
keyname.Buffer=_strupr(keyname.Buffer);
akeyname.Buffer=_strupr(akeyname.Buffer);
RtlUnicodeStringToAnsiString( &m_keyname, pUniName, TRUE);
RtlUpperString(&keyname,&m_keyname);
RtlFreeAnsiString(&m_keyname);
if (strcmp
(keyname.Buffer,"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN") == 0)
{
if(strcmp(akeyname.Buffer,"TE_REGPROTECT") ==0 )
{
DbgPrint("试图修改键值:%s的数据,已被拦截",akeyname.Buffer);
RtlFreeAnsiString(&akeyname);
RtlFreeAnsiString(&keyname);
// 释放内存
if(pUniName)
{
ExFreePool(pUniName);
}
return 0;
}
}
}
}
RtlFreeAnsiString(&akeyname);
rc=RealZwSetValueKey(KeyHandle,ValueName,TitleIndex,Type,Data,DataSize);
// 释放内存
if(pUniName)
{
ExFreePool(pUniName);
}
return (rc);
}
oopww 发表于 2011-9-21 19:27 static/image/common/back.gif
baidu得到:
先修改主页,加载驱动就基本OK了吧!!!!
用CmRegisterCallback来监控也不错!
页:
[1]