反病毒工具之注册表监视器

深入注册表监控 注册表是windows的重要数据库,存放了很多重要的信息以及一些应用的设置,对注册表进行监控并防止篡改是十分有必要的。在64位系统下微软提供了这个回调函数来实时监控注册表的操作,那么既然这里微软提供了这么一个方便的接口,病毒木马自然也会利用,这里我们就来探究其实现的原理和如何利用这个回调函数进行对抗。 阅读详情

核心HOOK API类,理论上可以HOOK 任何使用STDCALL声明的API函数

// HookInfo.h: interface for the CHookInfo class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HOOKINFO_H__D44F115C_76F1_4CC7_BD61_4C393417DA10__INCLUDED_)
#define AFX_HOOKINFO_H__D44F115C_76F1_4CC7_BD61_4C393417DA10__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

typedef struct _HOOKSTRUCT
{
    FARPROC pfFunAddr; //用于保存API函数地址
    BYTE    OldCode[5]; //保存原API前5个字节
    BYTE    NewCode[5]; //JMP XXXX其中XXXXJMP的地址
}HOOKSTRUCT;

class CHookInfo 
{
public:
 //HOOK 处理函数
 CHookInfo(char *strDllName, char *strFunName, DWORD dwMyFunAddr);
 virtual ~CHookInfo(); //析构函数
 HOOKSTRUCT *pHook; //HOOK结构
 void HookStatus(BOOL blnHook); //关闭/打开HOOK状态
};

CHookInfo::CHookInfo(char *strDllName, char *strFunName, DWORD dwMyFunAddr)
{
 pHook = new HOOKSTRUCT;
    HMODULE hModule = LoadLibrary(strDllName);
 //纪录函数地址
    pHook->pfFunAddr = GetProcAddress(hModule,strFunName);
 FreeLibrary(hModule);
    if(pHook->pfFunAddr == NULL)
        return ;
 //备份原函数的前5个字节,一般的WIN32 API以__stdcall声明的API理论上都可以这样进行HOOK
    memcpy(pHook->OldCode, pHook->pfFunAddr, 5);
    pHook->NewCode[0] = 0xe9; //构造JMP
    DWORD dwJmpAddr = dwMyFunAddr - (DWORD)pHook->pfFunAddr - 5; //计算JMP地址
    memcpy(&pHook->NewCode[1], &dwJmpAddr, 4);
 HookStatus(TRUE);//开始进行HOOK
}

CHookInfo::~CHookInfo()
{
 //关闭HOOK恢复原函数
 HookStatus(FALSE);
}

void CHookInfo::HookStatus(BOOL blnHook)
{
 if(blnHook)
  WriteProcessMemory((HANDLE)-1, pHook->pfFunAddr, pHook->NewCode, 5, 0);//替换函数地址
 else
  WriteProcessMemory((HANDLE)-1, pHook->pfFunAddr, pHook->OldCode, 5, 0);//还原函数地址
}
#endif // !defined(AFX_HOOKINFO_H__1967D554_7A9F_40C5_9D86_5899019EB3CD__INCLUDED_)

DLL程序代码,消息传递使用了自定义消息的方式

// RegistryInfo.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <stdlib.h>
#include "HookInfo.h"
#define STATUS_SUCCESS (0)
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
#define ObjectNameInformation (1)
#define BLOCKSIZE (0x1000)
#define CurrentProcessHandle         ((HANDLE)(0xFFFFFFFF))
#define STATUS_INFO_LEN_MISMATCH       0xC0000004

typedef unsigned long NTSTATUS;
typedef unsigned long SYSTEM_INFORMATION_CLASS;
typedef unsigned long OBJECT_INFORMATION_CLASS;

typedef struct
{
 USHORT Length;
 USHORT MaxLen;
 USHORT *Buffer;
}UNICODE_STRING, *PUNICODE_STRING;

typedef struct _OBJECT_NAME_INFORMATION { // Information Class 1
 UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;

typedef struct _OBJECT_ATTRIBUTES
{
    ULONG Length;
    HANDLE RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG Attributes;
    PVOID SecurityDescriptor;
    PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;

typedef NTSTATUS (WINAPI *NTSETVALUEKEY)(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName,IN ULONG TitleIndex,IN ULONG type1,IN PVOID Data,IN ULONG DataSize);
NTSETVALUEKEY NtSetValueKey = NULL;

typedef NTSTATUS (WINAPI *NTDELETEVALUEKEY)(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName);
NTDELETEVALUEKEY NtDeleteValueKey = NULL;

typedef NTSTATUS (WINAPI *NTDELETEKEY)(IN HANDLE KeyHandle);
NTDELETEKEY NtDeleteKey = NULL;

typedef NTSTATUS (WINAPI *NTCREATEKEY)(OUT PHANDLE pKeyHandle,IN ACCESS_MASK DesiredAccess,
 IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,
 IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);
NTCREATEKEY NtCreateKey = NULL;


typedef NTSTATUS (WINAPI *NTQUERYOBJECT)(IN HANDLE ObjectHandle,IN OBJECT_INFORMATION_CLASS ObjectInformationClass,OUT PVOID ObjectInformation,IN ULONG ObjectInformationLength,OUT PULONG ReturnLength);
NTQUERYOBJECT NtQueryObject = NULL;
NTSTATUS WINAPI NtSetValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName,IN ULONG TitleIndex,IN ULONG type1,IN PVOID Data,IN ULONG DataSize);
NTSTATUS WINAPI NtDeleteValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName);
NTSTATUS WINAPI NtDeleteKeyCallback(IN HANDLE KeyHandle);
NTSTATUS WINAPI NtCreateKeyCallback(OUT PHANDLE pKeyHandle,IN ACCESS_MASK DesiredAccess,
 IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,
 IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);
CHookInfo *ChookNtSetValueKey;
CHookInfo *ChookNtDeleteKey;
CHookInfo *ChookNtCreateKey;
CHookInfo *ChookNtDeleteValueKey;
HINSTANCE m_hinstDll;
HWND m_hWnd;
char *GetSidString(char *strUserName);
char *mstrMachinePath="//registry//machine//software//microsoft//windows//currentversion//run";
char mstrUserPath[400];
char *mstrLogonPath="//registry//machine//software//microsoft//windows nt//currentversion//winlogon";
char mstrWinRegPath[260];
HHOOK m_hHook;
DWORD m_ProcessId;

//初始NT系列的函数
VOID LoadNtDll()
{
 HMODULE hMod = LoadLibrary("ntdll.dll");
 NtDeleteKey = (NTDELETEKEY)GetProcAddress(hMod,"NtDeleteKey");
 NtSetValueKey = (NTSETVALUEKEY)GetProcAddress(hMod,"NtSetValueKey");
 NtDeleteValueKey = (NTDELETEVALUEKEY)GetProcAddress(hMod,"NtDeleteValueKey");
 NtCreateKey = (NTCREATEKEY)GetProcAddress(hMod,"NtCreateKey");
 NtQueryObject = (NTQUERYOBJECT)GetProcAddress(hMod,"NtQueryObject");
 FreeLibrary(hMod);
}

//DLL入口点函数
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
 m_hinstDll=hInstance;
 if (dwReason == DLL_PROCESS_ATTACH)
 {
  m_hWnd=FindWindow(NULL,"注册表监视");
  if (!m_hWnd)
   return FALSE;
  GetWindowThreadProcessId(m_hWnd,&m_ProcessId);
  char strUserName[260],strSID[200];
  DWORD dwSize;
  dwSize=260;
  GetUserName(strUserName,&dwSize);
  strcpy(mstrUserPath,"//registry//user//");
  strcpy(strSID,GetSidString(strUserName));
  strcat(mstrUserPath,strlwr(strSID));
  strcat(mstrUserPath,"//");
  strcpy(mstrWinRegPath,mstrUserPath);
  strcat(mstrUserPath,"software//microsoft//windows//currentversion//run");
  strcat(mstrWinRegPath,"software//microsoft//windows nt//currentversion//windows");
  //初始NTDLL
  LoadNtDll();
  if (GetCurrentProcessId()!=m_ProcessId)
  {
   ChookNtSetValueKey = new CHookInfo("ntdll.dll","NtSetValueKey",(DWORD)NtSetValueKeyCallback);
   ChookNtDeleteKey = new CHookInfo("ntdll.dll","NtDeleteKey",(DWORD)NtDeleteKeyCallback);
   ChookNtCreateKey = new CHookInfo("ntdll.dll","NtCreateKey",(DWORD)NtCreateKeyCallback);
   ChookNtDeleteValueKey = new CHookInfo("ntdll.dll","NtDeleteValueKey",(DWORD)NtDeleteValueKeyCallback);
  }
 }
 else if (dwReason == DLL_PROCESS_DETACH)
 {
  if (GetCurrentProcessId()!=m_ProcessId)
  {
   delete ChookNtSetValueKey;
   delete ChookNtDeleteKey;
   delete ChookNtCreateKey;
   delete ChookNtDeleteValueKey;
  }
 }
 return TRUE;   // ok
}

//卸载钩子
BOOL WINAPI UninstallRegHook()//输出卸在钩子函数
{
 return(UnhookWindowsHookEx(m_hHook));
}

//钩子函数
LRESULT WINAPI Hook(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数
{
 return(CallNextHookEx(m_hHook,nCode,wParam,lParam));
}

//安装API钩子
BOOL WINAPI InstallRegHook(LPCTSTR strCheck)
{
 if (strcmpi(strCheck,"http://blog.youkuaiyun.com/chenhui530/")!=0)
  return FALSE;
 m_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,m_hinstDll,0);
 if (!m_hHook)
 {
  MessageBoxA(NULL,"安装钩子失败","失败",MB_OK);
  return FALSE;
 }
 return TRUE;
}

//通过句柄获取注册表路径
void GetPath(char *strPath,HANDLE hHandle)
{
 HANDLE hHeap = GetProcessHeap();
 DWORD dwSize = 0;
 POBJECT_NAME_INFORMATION pName = (POBJECT_NAME_INFORMATION)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 0x1000);  
 NTSTATUS ns = NtQueryObject(hHandle, ObjectNameInformation, (PVOID)pName, 0x1000, &dwSize);
 DWORD i = 1;
 while(ns == STATUS_INFO_LEN_MISMATCH)
 {
  pName = (POBJECT_NAME_INFORMATION)HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, (LPVOID)pName, 0x1000 * i);
  ns = NtQueryObject(hHandle, ObjectNameInformation, (PVOID)pName, 0x1000, NULL);
  i++;
 }
 wsprintf(strPath, "%S", pName->Name.Buffer);
 HeapFree(hHeap,0,pName);
}

NTSTATUS WINAPI NtSetValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName,IN ULONG TitleIndex,IN ULONG type1,IN PVOID Data,IN ULONG DataSize)
{
 char strName[512];
 GetPath(strName,KeyHandle);
 char strObjectPath[512] = {'/0'};
 //获取注册表完整路径包括创建的键名
 if(type1 == 4 || type1 == 5 || type1 == 11)
  wsprintf(strObjectPath, "%s//%S*value:%d,0x%X", strName, ValueName->Buffer, *(DWORD*)Data, *(DWORD*)Data);
 else if(type1 == 3)
  wsprintf(strObjectPath, "%s//%S", strName, ValueName->Buffer);
 else if(type1 == 8)
  wsprintf(strObjectPath, "%s//%S", strName, ValueName->Buffer);
 else
  wsprintf(strObjectPath, "%s//%S*value:%S", strName, ValueName->Buffer, Data);
 char strTmp[512];
 strcpy(strTmp,strObjectPath);
 char *strLwr=strlwr(strObjectPath);
 //只监视启动项,这里大家可以自己设置
 if (strstr(strLwr,mstrMachinePath) || strstr(strLwr,mstrUserPath) ||
  strstr(strLwr,mstrLogonPath) || strstr(strLwr,mstrWinRegPath))
 {
  COPYDATASTRUCT cds;
  //构造字符串好让监管程序分离,这里是按我自己特定的格式传过去的,大家可以根据自己的格式构造
  char strInt[10];
  itoa(type1,strInt,10);
  char strMsg[512];
  strcpy(strMsg,"设置值:");
  strcat(strMsg,strTmp);
  strcat(strMsg,"**");
  strcat(strMsg,strInt);
  strcat(strMsg,"^^");
  char strPath[260];
  GetModuleFileName(NULL,strPath,sizeof(strPath));
  strcat(strMsg,strPath);
  strcat(strMsg,"进程ID<");
  itoa(::GetCurrentProcessId(),strInt,10);
  strcat(strMsg,strInt);
  strcat(strMsg,">");
  cds.lpData = strMsg;
  cds.cbData = sizeof(strMsg);
  cds.dwData = 0;
  //发送消息给监管程序,如果同意就执行
  LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&cds);
  if (l==1000)
  {
   ChookNtSetValueKey->HookStatus(FALSE);
   NTSTATUS hReturn = NtSetValueKey(KeyHandle,ValueName,TitleIndex,type1,Data,DataSize);
   ChookNtSetValueKey->HookStatus(TRUE);
   return hReturn;
  }
 }
 else
 {
  //没有监控的就让函数执行
  ChookNtSetValueKey->HookStatus(FALSE);
  NTSTATUS hReturn = NtSetValueKey(KeyHandle,ValueName,TitleIndex,type1,Data,DataSize);
  ChookNtSetValueKey->HookStatus(TRUE);
  return hReturn;
 }
 //不同意的返回拒绝访问
 return STATUS_ACCESS_DENIED;
}

//注册表删除键值代理函数
NTSTATUS WINAPI NtDeleteValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName)
{
 char strName[512];
 GetPath(strName,KeyHandle);
 char strObjectPath[512] = {'/0'};
 //获取注册表完整路径包括创建的键名
 wsprintf(strObjectPath, "%s//%S", strName, ValueName->Buffer);
 char strTmp[512];
 strcpy(strTmp,strObjectPath);
 strlwr(strObjectPath);
 //只监视启动项,这里大家可以自己设置
 if (strstr(strObjectPath,mstrMachinePath) || strstr(strObjectPath,mstrUserPath) ||
  strstr(strObjectPath,mstrLogonPath) || strstr(strObjectPath,mstrWinRegPath))
 {
  COPYDATASTRUCT cds;
  //构造字符串好让监管程序分离,这里是按我自己特定的格式传过去的,大家可以根据自己的格式构造
  char strMsg[512];
  strcpy(strMsg,"删除值:");
  strcat(strMsg,strTmp);
  strcat(strMsg,"^^");
  char strPath[260];
  GetModuleFileName(NULL,strPath,sizeof(strPath));
  strcat(strMsg,strPath);
  strcat(strMsg,"进程ID<");
  char strInt[10];
  itoa(::GetCurrentProcessId(),strInt,10);
  strcat(strMsg,strInt);
  strcat(strMsg,">");
  cds.lpData = strMsg;
  cds.cbData = sizeof(strMsg);
  cds.dwData = 0;
  //发送消息给监管程序,如果同意就执行
  LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&cds);
  if (l==1000)
  {
   ChookNtDeleteValueKey->HookStatus(FALSE);
   NTSTATUS hReturn = NtDeleteValueKey(KeyHandle,ValueName);
   ChookNtDeleteValueKey->HookStatus(TRUE);
   return hReturn;
  }
 }
 else
 {
  //没有监控的就让函数执行
  ChookNtDeleteValueKey->HookStatus(FALSE);
  NTSTATUS hReturn = NtDeleteValueKey(KeyHandle,ValueName);
  ChookNtDeleteValueKey->HookStatus(TRUE);
  return hReturn;
 }
 //不同意的返回拒绝访问
 return STATUS_ACCESS_DENIED;
}

//注册表删除项代理函数
NTSTATUS WINAPI NtDeleteKeyCallback(IN HANDLE KeyHandle)
{
 char strObjectPath[512] = {'/0'};
 GetPath(strObjectPath,KeyHandle);
 char strTmp[512];
 strcpy(strTmp,strObjectPath);
 strlwr(strObjectPath);
 //排除非启动项
 if (strstr(strObjectPath,mstrMachinePath) || strstr(strObjectPath,mstrUserPath) ||
  strstr(strObjectPath,mstrLogonPath) || strstr(strObjectPath,mstrWinRegPath))
 {
  COPYDATASTRUCT cds;
  //构造字符串好让监管程序分离,这里是按我自己特定的格式传过去的,大家可以根据自己的格式构造
  char strMsg[512];
  strcpy(strMsg,"删除项:");
  strcat(strMsg,strTmp);
  strcat(strMsg,"^^");
  char strPath[260];
  GetModuleFileName(NULL,strPath,sizeof(strPath));
  strcat(strMsg,strPath);
  char strInt[10];
  strcat(strMsg,"进程ID<");
  itoa(::GetCurrentProcessId(),strInt,10);
  strcat(strMsg,strInt);
  strcat(strMsg,">");
  cds.lpData = strMsg;
  cds.cbData = sizeof(strMsg);
  cds.dwData = 0;
  //发送消息给监管程序,如果同意就执行
  LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&cds);
  if (l==1000)
  {
   ChookNtDeleteKey->HookStatus(FALSE);
   NTSTATUS hReturn = NtDeleteKey(KeyHandle);
   ChookNtDeleteKey->HookStatus(TRUE);
   return hReturn;
  } 
 }
 else
 { 
  //没有监控的让它继续执行
  ChookNtDeleteKey->HookStatus(FALSE);
  NTSTATUS hReturn = NtDeleteKey(KeyHandle);
  ChookNtDeleteKey->HookStatus(TRUE);
  return hReturn;
 }
 //不同意的返回拒绝访问
 return STATUS_ACCESS_DENIED;
}

//注册表创建项代理函数
NTSTATUS WINAPI NtCreateKeyCallback(OUT PHANDLE pKeyHandle,IN ACCESS_MASK DesiredAccess,
 IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,
 IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL)
{
 char strName[512];
 //获取创建的路径
 GetPath(strName,ObjectAttributes->RootDirectory);
 char strObjectPath[512];
 //获取注册表完整路径包括创建的键名
 wsprintf(strObjectPath, "%s//%S",strName, ObjectAttributes->ObjectName->Buffer);
 if (lstrcmpi(strObjectPath,mstrMachinePath)==0 || lstrcmpi(strObjectPath,mstrUserPath)==0 ||
  lstrcmpi(strObjectPath,mstrLogonPath)==0 || lstrcmpi(strObjectPath,mstrWinRegPath)==0)
 {
  ChookNtCreateKey->HookStatus(FALSE);
  NTSTATUS hReturn = hReturn = NtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);
  ChookNtCreateKey->HookStatus(TRUE);
  return hReturn;
 }
 char strTmp[260];
 strcpy(strTmp,strObjectPath);
 strlwr(strObjectPath);
 //只监视启动项,这里大家可以自己设置
 if (strstr(strObjectPath,mstrMachinePath) || strstr(strObjectPath,mstrUserPath) ||
  strstr(strObjectPath,mstrLogonPath) || strstr(strObjectPath,mstrWinRegPath))
 {
  COPYDATASTRUCT cds;
  //构造字符串好让监管程序分离
  char strMsg[512];
  strcpy(strMsg,"新增项:");
  strcat(strMsg,strTmp);
  strcat(strMsg,"^^");
  char strPath[260];
  GetModuleFileName(NULL,strPath,sizeof(strPath));
  strcat(strMsg,strPath);
  strcat(strMsg,"进程ID<");
  char strInt[10];
  itoa(::GetCurrentProcessId(),strInt,10);
  strcat(strMsg,strInt);
  strcat(strMsg,">");
  cds.lpData = strMsg;
  cds.cbData = sizeof(strMsg);
  cds.dwData = 0;
  //发送消息给监管程序,当返回1000表示同意
  LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&cds);
  if (l==1000)
  {
   ChookNtCreateKey->HookStatus(FALSE);
   NTSTATUS hReturn = NtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);
   ChookNtCreateKey->HookStatus(TRUE);
   return hReturn;
  }
 }
 else
 { 
  //没有监控的就让函数执行
  ChookNtCreateKey->HookStatus(FALSE);
  NTSTATUS hReturn = hReturn = NtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);
  ChookNtCreateKey->HookStatus(TRUE);
  return hReturn;
 }
 //不同意的返回拒绝访问
 return STATUS_ACCESS_DENIED;
}

//获取指定用户的SID
char *GetSidString(char *strUserName)
{
 char szBuffer[200];
    BYTE sidBuffer[100];
    PSID pSid=(PSID)&sidBuffer;
    DWORD sidBufferSize = 100;
    char domainBuffer[80];
    DWORD domainBufferSize = 80;
    SID_NAME_USE snu;
 LookupAccountName(NULL,strUserName,pSid,&sidBufferSize,domainBuffer,&domainBufferSize,&snu);

 SID_IDENTIFIER_AUTHORITY *psia = GetSidIdentifierAuthority(pSid);
 DWORD dwTopAuthority = psia->Value[5];
 wsprintf(szBuffer, "S-1-%lu", dwTopAuthority);
 TCHAR szTemp[32];
 int iSubAuthorityCount = *(GetSidSubAuthorityCount(pSid));
 for (int i = 0; i<iSubAuthorityCount; i++)
 {
  DWORD dwSubAuthority = *(GetSidSubAuthority(pSid, i));
  wsprintf(szTemp, "%lu", dwSubAuthority);
  strcat(szBuffer, "-");
  strcat(szBuffer, szTemp);
 }
 return &szBuffer[0];
}
 

(转载)反病毒引擎设计 --- 实时监控篇 反病毒引擎设计之实时监控篇作者:NJUE    文章来源:安全焦点  2004年01月15日        编者按:绪论《反病毒引擎设计之虚拟机查毒篇》我们重点对虚拟机查毒进行了阐述。下面看看如何对病毒实时监控。  目    录3.1实时监控概论3.2病毒实时监控实现技术概论3.3 WIN9X下的病毒实时监控  3.3.1实现技术详解  3.3.2程 阅读详情

相关推荐

如何才能监控查看出注册表更改情况,本地组策略设置更改了哪些注册表对应值?

Win11 专业版HP480G7。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 5202

ProcessMonitor实现进程文件和注册表监控

对于文件、网络等监控亦是如此,进程的启动和执行离不开对于文件的读写,,相信很多人都碰到DLL文件找不到但是却又不知道DLL放在哪个路径的问题,而这个工具能捕获进程的所有文件读写信息,正好解决了这种问题。一般我们监控指定进程可以使用processName和PID,以谷歌浏览器为例,它的进程名是chrome.exe,那么就可以根据 "processName is chrome.exe"来监控所有的chrome.exe进程了,因为chrome.exe一般是多进程模式,如果定位单个进程,那么就需要指定PID了。

weixin_38526093的博客 8697

使用Process Monitor工具监测进程对注册表和文件的操作(常用分析工具)

本文详细介绍了如何使用Process Monitor工具监测进程对注册表和文件的操作活动,并给出了对应的监测范例。

dvlinker的技术专栏 1万+

注册表监视的4种方式

注册表监视,总结说来,可行的方法有以下四种,有其他做法,欢迎指出: 1.使用RegNotifyChangeKeyValue 这个函数可以监视注册表某一项及其子项的变化(包括添加、删除、修改等)。 此种方法的缺点:可以直接获取的注册表改变信息少之又少,如果是要获取比如修改项、修改时间、修改方式等,要通过其他方式来获取。 优点:平台兼容性好,98以后的系统基本都适用,与RegS

yupei881027的专栏 9986

注册表监视器

注册表监视器 含注册文件。

PaddleOCR实战:给图片‘加个框’,轻松搞定小图和长图文字识别不准的难题

本文探讨了PaddleOCR在处理小图和长图时识别精度下降的问题,并提出通过图像边框预处理技术显著提升OCR识别效果。详细介绍了使用OpenCV实现智能边框添加的方法,包括核心原理、工程实践中的关键细节以及性能优化策略,帮助开发者轻松解决非常规尺寸图像的文本检测难题。

weixin_29313547的博客 186

反病毒工具之注册表监视器(VC DLL源码)

核心HOOK API类,理论上可以HOOK 任何使用STDCALL声明的API函数// HookInfo.h: interface for the CHookInfo class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_HOOKINFO_H__D44F1

chenhui530的专栏 1万+

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

反病毒工具之注册表监视器(VC DLL源码) (chenhui530)

 反病毒工具之注册表监视器(VC DLL源码)    核心HOOK API类,理论上可以HOOK 任何使用STDCALL声明的API函数// HookInfo.h: interface for the CHookInfo class.////////////////////////////////////////////////////////////////////////

onlywater的专栏 630

深入解析高通8155平台音频数据流:从HAL到DSP的完整链路

本文深入解析了高通8155平台音频数据从安卓HAL层到DSP的完整传输链路。以播放场景为例,详细阐述了音频数据如何通过ASoC DPCM框架进行路由、打包,并经由APR协议与DSP交互,最终驱动硬件发声的核心流程,为车载音频系统开发与调试提供了清晰的框架。

rust6ferris的博客 1174

C#上位机3D可视化:HelixToolkit.Wpf集成点云/模型(机器人臂姿态实时监控)

核心控件是3D可视化的核心,需搭配和网格辅助定位;模型加载:按关节拆分机械臂模型,通过组合平移+旋转实现姿态控制;姿态更新:将机器人关节角度转换为3D模型的旋转变换,工业场景需从控制器实时获取角度;点云渲染:通过实现点云加载,需注意坐标系转换和性能优化。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 713

反病毒引擎设计之实时监控篇

反病毒引擎设计之实时监控篇作者:NJUE    文章来源:安全焦点  2004年01月15日        编者按:绪论《反病毒引擎设计之虚拟机查毒篇》我们重点对虚拟机查毒进行了阐述。下面看看如何对病毒实时监控。  目    录3.1实时监控概论3.2病毒实时监控实现技术概论3.3 WIN9X下的病毒实时监控  3.3.1实现技术详解  3.3.2程

Tunix126的专栏 2584

全栈拆解华为乾崑 ADS 5:WEWA2.0智能体架构与安全风险场技术、实现多传感器全融合感知与主动安全预判、助力城市NOA/高速领航/全场景无人通行极致落地

华为乾崑ADS 5的核心颠覆性,不在于单一功能的小幅升级,而在于实现了自动驾驶从“工具式辅助驾驶”到“拟人化智能体驾驶”的全栈范式革命。通过WEWA 2.0端云协同AI智能体架构,解决了传统智驾决策僵硬、博弈能力弱、学习效率低的行业痛点;通过行业首发安全风险场技术,将自动驾驶安全体系从被动避险升级为主动预判,直接减半行车风险;通过乾崑OS专属车规系统底座,保障高阶智驾的低时延、高稳定、高可靠运行;通过多传感器超融合感知体系,实现全场景、全天候、无盲区的精细化环境理解。

getusushu的博客 287

反病毒引擎设计——实时监控篇

反病毒引擎设计之实时监控篇作者:NJUE    文章来源:安全焦点  2004年01月15日        编者按:绪论《反病毒引擎设计之虚拟机查毒篇》我们重点对虚拟机查毒进行了阐述。下面看看如何对病毒实时监控。  目    录3.1实时监控概论3.2病毒实时监控实现技术概论3.3 WIN9X下的病毒实时监控  3.3.1实现技术详解  3.3.2程序结构与流程  3.3.3 HOOKSYS.VX

feijj2002_的专栏 1849

概念解析 | 雷达动态范围

这里存在一个动态范围的问题:强雷达发射信号和弱目标反射信号存在非常大的功率差异,比如传统的脉冲多普勒雷达动态范围可达90dB以上。随着上述技术的发展,预计未来十年雷达接收机动态范围将达到120dB以上,届时雷达的监视能力将得到极大增强。简单来说,雷达动态范围越大,表示接收机噪声越低,对强信号过载保护能力越强,就越能检测到弱信号目标。此外,部分新概念雷达对动态范围提出新的需求,如被动雷达动态范围需大于100dB。当前,随着阵列雷达和数字雷达技术的发展,对雷达接收机动态范围提出了更高要求。

NLOS的博客 1050

【数据集】中国各类水文专业常用数据集合集

对中国各类水文专业常用数据集进行整理并总结

WW、forever的博客 9298

arc许可服务器状态,问题:许可服务器状态:无法针对 ArcGIS License Manager 10.x 运行...

问题:许可服务器状态:无法针对 ArcGIS License Manager 10.x 运行说明许可服务器状态:无法针对 ArcGIS License Manager 10.x 运行原因可能在安装 ArcGIS License Manager 10.x 软件或软件成功运行后出现“未运行”状态。 原因可能是多种问题,如防火墙、反病毒或反垃圾邮件应用程序,端口分配或可用性,环境变量,存在先前安装的残留...

weixin_42151036的博客 2548

【DRAM存储器六十八】DDR5介绍--DQS Interval Oscillator—动态时序校准利器

DDR5内存采用DQS间隔振荡器(DQSIntervalOscillator)技术应对高速数据传输中的时序漂移问题。该技术通过测量DQS信号在可编程时间窗口内的振荡次数(16位计数值),动态监测温度/电压变化导致的DQS-DQ延迟偏移。控制器通过MPC命令启停振荡器,读取MR46/MR47寄存器获取计数值,并与基准值对比来调整DQS相位,确保数据采样窗口始终处于最佳位置。该机制使DDR5在8400MT/s高速率下仍能保持数据可靠性,有效补偿±0.48tCK的时序偏移。

highman110的博客 149

恶意文件快速分析

恶意程序 快速分析手法

莫慌的博客 2422

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Windows排查恶意程序及一些工具

按下Win + R键组合打开运行对话框,然后输入"msconfig"并按Enter键。在"服务"选项卡中,勾选"隐藏所有Microsoft服务",然后排查一个个排查剩下的服务。按下Ctrl + Shift + Esc键组合打开任务管理器,然后切换到"启动"选项卡。在这里,可以看到在Windows启动时自动运行的程序。禁用不认识或不需要的项目。按下Win + R键组合打开运行对话框,然后输入"regedit"并按Enter键。

提笔忘字的帝国 2193

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IDS,恶意软件,反病毒网关,密码学,ssl

APT攻击即高级可持续威胁攻击也称为定向威胁攻击,指某组织对特定对象展开的持续有效的攻击活动。APT是黑客以窃取核心资料为目的,针对客户所发动的网络攻击和侵袭行为,是一种蓄谋已久的恶意商业间谍威胁”。这种行为往往经过长期的经营与策划,并具备高度的隐蔽性。APT的攻击手法,在于隐匿 自己,针对特定对象,长期、有计划性和组织性地窃取数据,这种发生在数字空间的偷窃资料、搜集情 报的行为,就是一种“网络间谍的行为。APT攻击是一个集合了多种常见攻击方式的综合攻击。

zkzzxh的博客 771

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

先进的反病毒引擎设计之实时监控篇(转)

先进的反病毒引擎设计之实时监控篇(转)[@more@]  3.病毒实时监控  3.1实时监控概论  实时监控技术其实并非什么新技术,早在DOS编程时代就有之。只不过那时人们没有给这项技术冠以这样专业的名字而已。早期在各大专院校机...

cuanjun1153的博客 341
上一篇: 远程线程注入技术 屏蔽ctrl alt del
下一篇: 磁碟机最新变种分析
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值