www.jybase.net - 寂涯网络学习基地

404 Error: 抱歉, 您所查找的页面不存在, 可能已被删除或您输错了网址!

404错误,没有发现你要找的页面, 经砖家仔细研究结果如下:

首 页 | 在线视频观看 | 系统综合 | 网站相关 | 教程共享 | 网赚教程共享 | 精品软件下载 | 网盘搜


























免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > windows > 在 Win64 上实现Ring3 级 HIPS(3)

在 Win64 上实现Ring3 级 HIPS(3)

时间:2011-11-06 14:35来源:未知 整理:寂涯网络 点击:


{
    ULONG len = 0;
    wchar_t *wszText=(wchar_t *)malloc(1024);
    char *pszKeyName=(char *)malloc(2048);
    memset(wszText,0,1024);
    //KeyNameInformation=3
    ZwQueryKey(KeyHandle, 3, wszText, 1024, &len); 
    WideToMultiByte(wszText+2, pszKeyName);
    return pszKeyName;
}

接下来到核心伪函数的处理部分。首先拿出我以前写好的Win64 Hook模板(已经做好
了挂钩引擎、Ring3 全局钩子和反动态调用API绕过钩子,具体代码请参考本人往期文章),
加上一个 Fake_ZwSetValueKey即可:

long Fake_ZwSetValueKey
(
    __in      HANDLE KeyHandle,
    __in      PUNICODE_STRING ValueName,
    __in_opt  ULONG TitleIndex,
    __in      ULONG Type,
    __in_opt  PVOID Data,
    __in      ULONG DataSize
)
{
    long (WINAPI
*pZwSetValueKey)(HANDLE,PUNICODE_STRING,ULONG,ULONG,PVOID,ULONG);
pZwSetValueKey=(long (WINAPI 
*)(HANDLE,PUNICODE_STRING,ULONG,ULONG,PVOID,ULONG))GetOriginalFunction( 

 ONG_PTR)Fake_ZwSetValueKey );   
//如果不是IE\\MAIN下面的键值就忽略 
if( stricmp(KeyHandleToKeyName(KeyHandle),"\\Registry\\Machine\\SOFTWARE\\
Microsoft\\Internet Explorer\\MAIN")!=0 )  
        return pZwSetValueKey(KeyHandle, ValueName, TitleIndex, Type, Data,
DataSize);
    //如果是[主页键]就警告,否则忽略
    if( wcsicmp(ValueName->Buffer,L"Start_Page")==0 ) //should be [Start Page]
    {
        int mbwr=MessageBoxA(0,cs(cs(" 进程 ID 为
",CStr(GetCurrentProcessId())),"的程序试图修改IE主页,是否允许?"),"HIPS警
告",4);
        if(mbwr!=7)
            return pZwSetValueKey(KeyHandle, ValueName, TitleIndex, Type,
Data, DataSize);
        else
            return 0xC0000022;
    }
    return pZwSetValueKey(KeyHandle, ValueName, TitleIndex, Type, Data,
DataSize);
}

在里面有一些自定义函数,如cs、CStr等,都是为了方便字符串操作的。虽然C++的
CString 都有类似的功能,但是我不喜欢CString,所以自己实现了: 

 //连接两个char*字符串
char *cs(char *str1, char *str2) 
{
    long newstrlen=strlen(str1)+strlen(str2)+1;
    char *newstr=(char*)malloc(newstrlen);
    memcpy(newstr,str1,strlen(str1));
    memcpy(newstr+strlen(str1),str2,strlen(str2)+1);
    return newstr;

//把整数转化为字符串
char *CStr(long n) 
{
    char *newstr=(char*)malloc(11);
    memset(newstr,0x0,11);
    ltoa(n,newstr,10);
    return newstr;

 文章几句话带过的东西,在研究的时候可不是那么轻易得到的。特别要注意,在伪函数
中动态调用的 MessageBoxA 必须要用 LoadLibrary,否则在 CUI 程序中会崩溃。另外在
Fake_CreatePeocessW(实现 Ring3 全局钩子)中注入 DLL 前要检查启动的进程类型,如果
是 64 位进程才注入 dll,如果是 32 位进程则不要注入,否则会导致要启动的 32 位进程无
法启动,甚至导致自身程序崩溃。实现判断是否64位进程可以用IsWow64Process来实现:

BOOL IsWow64(HANDLE hProc)
{
    BOOL bIsWow64 = FALSE;
    IsWow64Process(hProc, &bIsWow64);
    return bIsWow64;
}

测试方法:

1.复制全部文件到C盘根目录
2.使用 InjectDllx64.exe把 hookdll.dll注入到explorer.exe
3.运行 NtSetValueKey.exe
注意:测试时请关闭UAC

测试截图:
被拦截:

本页地址 http://www.jybase.net/windows/20111106577.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商