自从更换了显卡,每天必不可少的事情就是玩游戏。不过某些汉化版的游戏实在太不像
话,在安装游戏的同时,竟然还把我的IE主页给修改了!由于Win64上没有可用的HIPS (不
喜欢杀毒软件),而且游戏安装程序基本上都是32位游戏,所以我赶紧拿出以前写的Win32
Ring3 HIPS来防止游戏安装时乱改我的IE 主页。结果呢?在玩《Crysis》64位的时候,竟
然又被修改了IE 主页!经测试发现,《Crysis》64位的 EXE 文件被修改过,每次运行都会
先修改 IE主页,再执行游戏。由于是64位 EXE,原先的 Win32 Ring3 HIPS肯定是没有用
了,只好写一个Win64 Ring3 HIPS。
首先说说修改IE 主页是怎么一回事儿。IE 主页不是记录在一个ini文件里的,而是记
录在注册表里,它的具体位置是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\Start Page
修改这个键值就能改变IE主页。由于大部分人都是使用 IE,而如果一打开 IE就自动
连接到某个网站,就能给那个网站带来巨大的流量,那个网站就能获取巨额的广告利益。所
以这也就是为什么大多数游戏软件都喜欢乱改IE主页的原因。不过要利用我的电脑给它赚
钱,自然是痴心妄想,于是便有了下文。
知彼知己,百战不殆。我们写一个64 位程序,来实现修改IE主页:
#include <stdio.h>
#include <Windows.h>
#define OBJ_CASE_INSENSITIVE 0x00000040L
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef NTSTATUS (WINAPI *ZWOPENKEY)
(
__out PHANDLE KeyHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes
);
typedef NTSTATUS (WINAPI *ZWSETVALUEKEY)
(
__in HANDLE KeyHandle,
__in PUNICODE_STRING ValueName,
__in_opt ULONG TitleIndex,
__in ULONG Type,
__in_opt PVOID Data,
__in ULONG DataSize
);
typedef NTSTATUS (WINAPI *ZWCLOSE)
(
__in HANDLE Handle
);
typedef VOID (WINAPI *RTLINITUNICODESTRING)
(
__inout PUNICODE_STRING DestinationString,
__in_opt PCWSTR SourceString
);
RTLINITUNICODESTRING RtlInitUnicodeString;
ZWSETVALUEKEY ZwSetValueKey;
ZWOPENKEY ZwOpenKey;
ZWCLOSE ZwClose;
//设置 ObjectAttributes的值
VOID InitializeObjectAttributes (OUT POBJECT_ATTRIBUTES
InitializedAttributes, IN PUNICODE_STRING ObjectName, IN ULONGAttributes, IN
HANDLE RootDirectory, IN PSECURITY_DESCRIPTOR SecurityDescriptor)
{
InitializedAttributes->Length = sizeof( OBJECT_ATTRIBUTES );
InitializedAttributes->RootDirectory = RootDirectory;
InitializedAttributes->Attributes = Attributes;
InitializedAttributes->ObjectName = ObjectName;
InitializedAttributes->SecurityDescriptor = SecurityDescriptor;
InitializedAttributes->SecurityQualityOfService = NULL;
return;
}
//初始化用到的api
void InitApi()
{
//获得 ZwSetValueKey的函数指针
ZwSetValueKey=(ZWSETVALUEKEY)GetProcAddress(LoadLibraryW(L"ntdll.dll"),"ZwS
etValueKey");
//获得 ZwOpenKey的函数指针 |