找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4496|回复: 0

[开源] 【开源】反病毒工具之注册表监视器(VC DLL源码)

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2009-5-9 14:18:43 | 显示全部楼层 |阅读模式
<p>核心HOOK API类,理论上可以HOOK 任何使用STDCALL声明的API函数</p>
<p>// HookInfo.h: interface for the CHookInfo class.<br/>//<br/>//////////////////////////////////////////////////////////////////////</p>
<p>#if !defined(AFX_HOOKINFO_H__D44F115C_76F1_4CC7_BD61_4C393417DA10__INCLUDED_)<br/>#define AFX_HOOKINFO_H__D44F115C_76F1_4CC7_BD61_4C393417DA10__INCLUDED_</p>
<p>#if _MSC_VER &gt; 1000<br/>#pragma once<br/>#endif // _MSC_VER &gt; 1000</p>
<p>typedef struct _HOOKSTRUCT<br/>{<br/>&nbsp;&nbsp;&nbsp; FARPROC pfFunAddr; //用于保存API函数地址<br/>&nbsp;&nbsp;&nbsp; BYTE&nbsp;&nbsp;&nbsp; OldCode[5]; //保存原API前5个字节<br/>&nbsp;&nbsp;&nbsp; BYTE&nbsp;&nbsp;&nbsp; NewCode[5]; //JMP XXXX其中XXXXJMP的地址<br/>}HOOKSTRUCT;</p>
<p>class CHookInfo&nbsp; <br/>{<br/>public:<br/>&nbsp;//HOOK 处理函数<br/>&nbsp;CHookInfo(char *strDllName, char *strFunName, DWORD dwMyFunAddr);<br/>&nbsp;virtual ~CHookInfo(); //析构函数<br/>&nbsp;HOOKSTRUCT *pHook; //HOOK结构<br/>&nbsp;void HookStatus(BOOL blnHook); //关闭/打开HOOK状态<br/>};</p>
<p>CHookInfo::CHookInfo(char *strDllName, char *strFunName, DWORD dwMyFunAddr)<br/>{<br/>&nbsp;pHook = new HOOKSTRUCT;<br/>&nbsp;&nbsp;&nbsp; HMODULE hModule = LoadLibrary(strDllName);<br/>&nbsp;//纪录函数地址<br/>&nbsp;&nbsp;&nbsp; pHook-&gt;pfFunAddr = GetProcAddress(hModule,strFunName);<br/>&nbsp;FreeLibrary(hModule);<br/>&nbsp;&nbsp;&nbsp; if(pHook-&gt;pfFunAddr == NULL)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br/>&nbsp;//备份原函数的前5个字节,一般的WIN32 API以__stdcall声明的API理论上都可以这样进行HOOK<br/>&nbsp;&nbsp;&nbsp; memcpy(pHook-&gt;OldCode, pHook-&gt;pfFunAddr, 5);<br/>&nbsp;&nbsp;&nbsp; pHook-&gt;NewCode[0] = 0xe9; //构造JMP<br/>&nbsp;&nbsp;&nbsp; DWORD dwJmpAddr = dwMyFunAddr - (DWORD)pHook-&gt;pfFunAddr - 5; //计算JMP地址<br/>&nbsp;&nbsp;&nbsp; memcpy(&amp;pHook-&gt;NewCode[1], &amp;dwJmpAddr, 4); <br/>&nbsp;HookStatus(TRUE);//开始进行HOOK<br/>}</p>
<p>CHookInfo::~CHookInfo()<br/>{<br/>&nbsp;//关闭HOOK恢复原函数<br/>&nbsp;HookStatus(FALSE);<br/>}</p>
<p>void CHookInfo::HookStatus(BOOL blnHook)<br/>{<br/>&nbsp;if(blnHook)<br/>&nbsp;&nbsp;WriteProcessMemory((HANDLE)-1, pHook-&gt;pfFunAddr, pHook-&gt;NewCode, 5, 0);//替换函数地址<br/>&nbsp;else<br/>&nbsp;&nbsp;WriteProcessMemory((HANDLE)-1, pHook-&gt;pfFunAddr, pHook-&gt;OldCode, 5, 0);//还原函数地址<br/>}<br/>#endif // !defined(AFX_HOOKINFO_H__1967D554_7A9F_40C5_9D86_5899019EB3CD__INCLUDED_)</p>
<p>DLL程序代码,消息传递使用了自定义消息的方式</p>
<p>// RegistryInfo.cpp : Defines the entry point for the DLL application.<br/>//</p>
<p>#include "stdafx.h"<br/>#include &lt;stdlib.h&gt;<br/>#include "HookInfo.h"<br/>#define STATUS_SUCCESS (0)<br/>#define NT_SUCCESS(Status) ((NTSTATUS)(Status) &gt;= 0) <br/>#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)<br/>#define ObjectNameInformation (1)<br/>#define BLOCKSIZE (0x1000)<br/>#define CurrentProcessHandle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((HANDLE)(0xFFFFFFFF))<br/>#define STATUS_INFO_LEN_MISMATCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xC0000004</p>
<p>typedef unsigned long NTSTATUS;<br/>typedef unsigned long SYSTEM_INFORMATION_CLASS;<br/>typedef unsigned long OBJECT_INFORMATION_CLASS;</p>
<p>typedef struct<br/>{<br/>&nbsp;USHORT Length;<br/>&nbsp;USHORT MaxLen;<br/>&nbsp;USHORT *Buffer;<br/>}UNICODE_STRING, *PUNICODE_STRING;</p>
<p>typedef struct _OBJECT_NAME_INFORMATION { // Information Class 1<br/>&nbsp;UNICODE_STRING Name;<br/>} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;</p>
<p>typedef struct _OBJECT_ATTRIBUTES <br/>{<br/>&nbsp;&nbsp;&nbsp; ULONG Length;<br/>&nbsp;&nbsp;&nbsp; HANDLE RootDirectory;<br/>&nbsp;&nbsp;&nbsp; PUNICODE_STRING ObjectName;<br/>&nbsp;&nbsp;&nbsp; ULONG Attributes;<br/>&nbsp;&nbsp;&nbsp; PVOID SecurityDescriptor;<br/>&nbsp;&nbsp;&nbsp; PVOID SecurityQualityOfService;<br/>} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; </p>
<p>typedef NTSTATUS (WINAPI *NTSETVALUEKEY)(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName,IN ULONG TitleIndex,IN ULONG type1,IN PVOID Data,IN ULONG DataSize);<br/>NTSETVALUEKEY NtSetValueKey = NULL;</p>
<p>typedef NTSTATUS (WINAPI *NTDELETEVALUEKEY)(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName);<br/>NTDELETEVALUEKEY NtDeleteValueKey = NULL;</p>
<p>typedef NTSTATUS (WINAPI *NTDELETEKEY)(IN HANDLE KeyHandle);<br/>NTDELETEKEY NtDeleteKey = NULL;</p>
<p>typedef NTSTATUS (WINAPI *NTCREATEKEY)(OUT PHANDLE pKeyHandle,IN ACCESS_MASK DesiredAccess,<br/>&nbsp;IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,<br/>&nbsp;IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);<br/>NTCREATEKEY NtCreateKey = NULL;</p>
<p><br/>typedef NTSTATUS (WINAPI *NTQUERYOBJECT)(IN HANDLE ObjectHandle,IN OBJECT_INFORMATION_CLASS ObjectInformationClass,OUT PVOID ObjectInformation,IN ULONG ObjectInformationLength,OUT PULONG ReturnLength);<br/>NTQUERYOBJECT NtQueryObject = NULL;<br/>NTSTATUS WINAPI NtSetValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName,IN ULONG TitleIndex,IN ULONG type1,IN PVOID Data,IN ULONG DataSize);<br/>NTSTATUS WINAPI NtDeleteValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName);<br/>NTSTATUS WINAPI NtDeleteKeyCallback(IN HANDLE KeyHandle);<br/>NTSTATUS WINAPI NtCreateKeyCallback(OUT PHANDLE pKeyHandle,IN ACCESS_MASK DesiredAccess,<br/>&nbsp;IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,<br/>&nbsp;IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);<br/>CHookInfo *ChookNtSetValueKey;<br/>CHookInfo *ChookNtDeleteKey;<br/>CHookInfo *ChookNtCreateKey;<br/>CHookInfo *ChookNtDeleteValueKey;<br/>HINSTANCE m_hinstDll;<br/>HWND m_hWnd;<br/>char *GetSidString(char *strUserName);<br/>char *mstrMachinePath="<a href="file://registry//machine//software//microsoft//windows//currentversion//run">\\registry\\machine\\software\\microsoft\\windows\\currentversion\\run</a>";<br/>char mstrUserPath[400];<br/>char *mstrLogonPath="<a href="file://registry//machine//software//microsoft//windows">\\registry\\machine\\software\\microsoft\\windows</a> nt\\currentversion\\winlogon";<br/>char mstrWinRegPath[260];<br/>HHOOK m_hHook;<br/>DWORD m_ProcessId;</p>
<p>//初始NT系列的函数<br/>VOID LoadNtDll()<br/>{<br/>&nbsp;HMODULE hMod = LoadLibrary("ntdll.dll");<br/>&nbsp;NtDeleteKey = (NTDELETEKEY)GetProcAddress(hMod,"NtDeleteKey");<br/>&nbsp;NtSetValueKey = (NTSETVALUEKEY)GetProcAddress(hMod,"NtSetValueKey");<br/>&nbsp;NtDeleteValueKey = (NTDELETEVALUEKEY)GetProcAddress(hMod,"NtDeleteValueKey");<br/>&nbsp;NtCreateKey = (NTCREATEKEY)GetProcAddress(hMod,"NtCreateKey");<br/>&nbsp;NtQueryObject = (NTQUERYOBJECT)GetProcAddress(hMod,"NtQueryObject");<br/>&nbsp;FreeLibrary(hMod);<br/>}</p>
<p>//DLL入口点函数<br/>BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)<br/>{<br/>&nbsp;m_hinstDll=hInstance;<br/>&nbsp;if (dwReason == DLL_PROCESS_ATTACH)<br/>&nbsp;{<br/>&nbsp;&nbsp;m_hWnd=FindWindow(NULL,"注册表监视");<br/>&nbsp;&nbsp;if (!m_hWnd) <br/>&nbsp;&nbsp;&nbsp;return FALSE;<br/>&nbsp;&nbsp;GetWindowThreadProcessId(m_hWnd,&amp;m_ProcessId);<br/>&nbsp;&nbsp;char strUserName[260],strSID[200];<br/>&nbsp;&nbsp;DWORD dwSize;<br/>&nbsp;&nbsp;dwSize=260;<br/>&nbsp;&nbsp;GetUserName(strUserName,&amp;dwSize);<br/>&nbsp;&nbsp;strcpy(mstrUserPath,"<a href="file://registry//user//">\\registry\\user\\</a>");<br/>&nbsp;&nbsp;strcpy(strSID,GetSidString(strUserName));<br/>&nbsp;&nbsp;strcat(mstrUserPath,strlwr(strSID));<br/>&nbsp;&nbsp;strcat(mstrUserPath,"\\");<br/>&nbsp;&nbsp;strcpy(mstrWinRegPath,mstrUserPath);<br/>&nbsp;&nbsp;strcat(mstrUserPath,"software\\microsoft\\windows\\currentversion\\run");<br/>&nbsp;&nbsp;strcat(mstrWinRegPath,"software\\microsoft\\windows nt\\currentversion\\windows");<br/>&nbsp;&nbsp;//初始NTDLL<br/>&nbsp;&nbsp;LoadNtDll();<br/>&nbsp;&nbsp;if (GetCurrentProcessId()!=m_ProcessId)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;ChookNtSetValueKey = new CHookInfo("ntdll.dll","NtSetValueKey",(DWORD)NtSetValueKeyCallback);<br/>&nbsp;&nbsp;&nbsp;ChookNtDeleteKey = new CHookInfo("ntdll.dll","NtDeleteKey",(DWORD)NtDeleteKeyCallback);<br/>&nbsp;&nbsp;&nbsp;ChookNtCreateKey = new CHookInfo("ntdll.dll","NtCreateKey",(DWORD)NtCreateKeyCallback);<br/>&nbsp;&nbsp;&nbsp;ChookNtDeleteValueKey = new CHookInfo("ntdll.dll","NtDeleteValueKey",(DWORD)NtDeleteValueKeyCallback);<br/>&nbsp;&nbsp;}<br/>&nbsp;}<br/>&nbsp;else if (dwReason == DLL_PROCESS_DETACH)<br/>&nbsp;{<br/>&nbsp;&nbsp;if (GetCurrentProcessId()!=m_ProcessId)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;delete ChookNtSetValueKey;<br/>&nbsp;&nbsp;&nbsp;delete ChookNtDeleteKey;<br/>&nbsp;&nbsp;&nbsp;delete ChookNtCreateKey;<br/>&nbsp;&nbsp;&nbsp;delete ChookNtDeleteValueKey;<br/>&nbsp;&nbsp;}<br/>&nbsp;}<br/>&nbsp;return TRUE;&nbsp;&nbsp; // ok<br/>}</p>
<p>//卸载钩子<br/>BOOL WINAPI UninstallRegHook()//输出卸在钩子函数<br/>{<br/>&nbsp;return(UnhookWindowsHookEx(m_hHook));<br/>} </p>
<p>//钩子函数<br/>LRESULT WINAPI Hook(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数<br/>{<br/>&nbsp;return(CallNextHookEx(m_hHook,nCode,wParam,lParam));<br/>}</p>
<p>//安装API钩子<br/>BOOL WINAPI InstallRegHook(LPCTSTR strCheck)<br/>{<br/>&nbsp;if (strcmpi(strCheck,"<a href="http://blog.csdn.net/chenhui530/%22)!=0">http://blog.csdn.net/chenhui530/")!=0</a>)<br/>&nbsp;&nbsp;return FALSE;<br/>&nbsp;m_hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)Hook,m_hinstDll,0);<br/>&nbsp;if (!m_hHook)<br/>&nbsp;{<br/>&nbsp;&nbsp;MessageBoxA(NULL,"安装钩子失败","失败",MB_OK);<br/>&nbsp;&nbsp;return FALSE;<br/>&nbsp;}<br/>&nbsp;return TRUE;<br/>}</p>
<p>//通过句柄获取注册表路径<br/>void GetPath(char *strPath,HANDLE hHandle)<br/>{<br/>&nbsp;HANDLE hHeap = GetProcessHeap();<br/>&nbsp;DWORD dwSize = 0;<br/>&nbsp;POBJECT_NAME_INFORMATION pName = (POBJECT_NAME_INFORMATION)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 0x1000);&nbsp;&nbsp; <br/>&nbsp;NTSTATUS ns = NtQueryObject(hHandle, ObjectNameInformation, (PVOID)pName, 0x1000, &amp;dwSize);<br/>&nbsp;DWORD i = 1;<br/>&nbsp;while(ns == STATUS_INFO_LEN_MISMATCH)<br/>&nbsp;{<br/>&nbsp;&nbsp;pName = (POBJECT_NAME_INFORMATION)HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, (LPVOID)pName, 0x1000 * i);<br/>&nbsp;&nbsp;ns = NtQueryObject(hHandle, ObjectNameInformation, (PVOID)pName, 0x1000, NULL);<br/>&nbsp;&nbsp;i++;<br/>&nbsp;}<br/>&nbsp;wsprintf(strPath, "%S", pName-&gt;Name.Buffer);<br/>&nbsp;HeapFree(hHeap,0,pName);<br/>}</p>
<p>NTSTATUS WINAPI NtSetValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName,IN ULONG TitleIndex,IN ULONG type1,IN PVOID Data,IN ULONG DataSize)<br/>{<br/>&nbsp;char strName[512];<br/>&nbsp;GetPath(strName,KeyHandle);<br/>&nbsp;char strObjectPath[512] = {'\0'};<br/>&nbsp;//获取注册表完整路径包括创建的键名<br/>&nbsp;if(type1 == 4 || type1 == 5 || type1 == 11)<br/>&nbsp;&nbsp;wsprintf(strObjectPath, "%s\\%S*value:%d,0x%X", strName, ValueName-&gt;Buffer, *(DWORD*)Data, *(DWORD*)Data);<br/>&nbsp;else if(type1 == 3)<br/>&nbsp;&nbsp;wsprintf(strObjectPath, "%s\\%S", strName, ValueName-&gt;Buffer);<br/>&nbsp;else if(type1 == 8)<br/>&nbsp;&nbsp;wsprintf(strObjectPath, "%s\\%S", strName, ValueName-&gt;Buffer);<br/>&nbsp;else<br/>&nbsp;&nbsp;wsprintf(strObjectPath, "%s\\%S*value:%S", strName, ValueName-&gt;Buffer, Data);<br/>&nbsp;char strTmp[512];<br/>&nbsp;strcpy(strTmp,strObjectPath);<br/>&nbsp;char *strLwr=strlwr(strObjectPath);<br/>&nbsp;//只监视启动项,这里大家可以自己设置<br/>&nbsp;if (strstr(strLwr,mstrMachinePath) || strstr(strLwr,mstrUserPath) ||<br/>&nbsp;&nbsp;strstr(strLwr,mstrLogonPath) || strstr(strLwr,mstrWinRegPath))<br/>&nbsp;{<br/>&nbsp;&nbsp;COPYDATASTRUCT cds;<br/>&nbsp;&nbsp;//构造字符串好让监管程序分离,这里是按我自己特定的格式传过去的,大家可以根据自己的格式构造<br/>&nbsp;&nbsp;char strInt[10];<br/>&nbsp;&nbsp;itoa(type1,strInt,10);<br/>&nbsp;&nbsp;char strMsg[512];<br/>&nbsp;&nbsp;strcpy(strMsg,"设置值:");<br/>&nbsp;&nbsp;strcat(strMsg,strTmp);<br/>&nbsp;&nbsp;strcat(strMsg,"**");<br/>&nbsp;&nbsp;strcat(strMsg,strInt);<br/>&nbsp;&nbsp;strcat(strMsg,"^^");<br/>&nbsp;&nbsp;char strPath[260];<br/>&nbsp;&nbsp;GetModuleFileName(NULL,strPath,sizeof(strPath));<br/>&nbsp;&nbsp;strcat(strMsg,strPath);<br/>&nbsp;&nbsp;strcat(strMsg,"进程ID&lt;");<br/>&nbsp;&nbsp;itoa(::GetCurrentProcessId(),strInt,10);<br/>&nbsp;&nbsp;strcat(strMsg,strInt);<br/>&nbsp;&nbsp;strcat(strMsg,"&gt;");<br/>&nbsp;&nbsp;cds.lpData = strMsg;<br/>&nbsp;&nbsp;cds.cbData = sizeof(strMsg);<br/>&nbsp;&nbsp;cds.dwData = 0;<br/>&nbsp;&nbsp;//发送消息给监管程序,如果同意就执行<br/>&nbsp;&nbsp;LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&amp;cds);<br/>&nbsp;&nbsp;if (l==1000)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;ChookNtSetValueKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;&nbsp;NTSTATUS hReturn = NtSetValueKey(KeyHandle,ValueName,TitleIndex,type1,Data,DataSize);<br/>&nbsp;&nbsp;&nbsp;ChookNtSetValueKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;&nbsp;return hReturn;<br/>&nbsp;&nbsp;}<br/>&nbsp;}<br/>&nbsp;else<br/>&nbsp;{<br/>&nbsp;&nbsp;//没有监控的就让函数执行<br/>&nbsp;&nbsp;ChookNtSetValueKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;NTSTATUS hReturn = NtSetValueKey(KeyHandle,ValueName,TitleIndex,type1,Data,DataSize);<br/>&nbsp;&nbsp;ChookNtSetValueKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;return hReturn;<br/>&nbsp;}<br/>&nbsp;//不同意的返回拒绝访问<br/>&nbsp;return STATUS_ACCESS_DENIED;<br/>}</p>
<p>//注册表删除键值代理函数<br/>NTSTATUS WINAPI NtDeleteValueKeyCallback(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName)<br/>{<br/>&nbsp;char strName[512];<br/>&nbsp;GetPath(strName,KeyHandle);<br/>&nbsp;char strObjectPath[512] = {'\0'};<br/>&nbsp;//获取注册表完整路径包括创建的键名<br/>&nbsp;wsprintf(strObjectPath, "%s\\%S", strName, ValueName-&gt;Buffer);<br/>&nbsp;char strTmp[512];<br/>&nbsp;strcpy(strTmp,strObjectPath);<br/>&nbsp;strlwr(strObjectPath);<br/>&nbsp;//只监视启动项,这里大家可以自己设置<br/>&nbsp;if (strstr(strObjectPath,mstrMachinePath) || strstr(strObjectPath,mstrUserPath) ||<br/>&nbsp;&nbsp;strstr(strObjectPath,mstrLogonPath) || strstr(strObjectPath,mstrWinRegPath))<br/>&nbsp;{<br/>&nbsp;&nbsp;COPYDATASTRUCT cds;<br/>&nbsp;&nbsp;//构造字符串好让监管程序分离,这里是按我自己特定的格式传过去的,大家可以根据自己的格式构造<br/>&nbsp;&nbsp;char strMsg[512];<br/>&nbsp;&nbsp;strcpy(strMsg,"删除值:");<br/>&nbsp;&nbsp;strcat(strMsg,strTmp);<br/>&nbsp;&nbsp;strcat(strMsg,"^^");<br/>&nbsp;&nbsp;char strPath[260];<br/>&nbsp;&nbsp;GetModuleFileName(NULL,strPath,sizeof(strPath));<br/>&nbsp;&nbsp;strcat(strMsg,strPath);<br/>&nbsp;&nbsp;strcat(strMsg,"进程ID&lt;");<br/>&nbsp;&nbsp;char strInt[10];<br/>&nbsp;&nbsp;itoa(::GetCurrentProcessId(),strInt,10);<br/>&nbsp;&nbsp;strcat(strMsg,strInt);<br/>&nbsp;&nbsp;strcat(strMsg,"&gt;");<br/>&nbsp;&nbsp;cds.lpData = strMsg;<br/>&nbsp;&nbsp;cds.cbData = sizeof(strMsg);<br/>&nbsp;&nbsp;cds.dwData = 0;<br/>&nbsp;&nbsp;//发送消息给监管程序,如果同意就执行<br/>&nbsp;&nbsp;LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&amp;cds);<br/>&nbsp;&nbsp;if (l==1000)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;ChookNtDeleteValueKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;&nbsp;NTSTATUS hReturn = NtDeleteValueKey(KeyHandle,ValueName);<br/>&nbsp;&nbsp;&nbsp;ChookNtDeleteValueKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;&nbsp;return hReturn;<br/>&nbsp;&nbsp;}<br/>&nbsp;}<br/>&nbsp;else<br/>&nbsp;{<br/>&nbsp;&nbsp;//没有监控的就让函数执行<br/>&nbsp;&nbsp;ChookNtDeleteValueKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;NTSTATUS hReturn = NtDeleteValueKey(KeyHandle,ValueName);<br/>&nbsp;&nbsp;ChookNtDeleteValueKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;return hReturn;<br/>&nbsp;}<br/>&nbsp;//不同意的返回拒绝访问<br/>&nbsp;return STATUS_ACCESS_DENIED;<br/>}</p>
<p>//注册表删除项代理函数<br/>NTSTATUS WINAPI NtDeleteKeyCallback(IN HANDLE KeyHandle)<br/>{<br/>&nbsp;char strObjectPath[512] = {'\0'};<br/>&nbsp;GetPath(strObjectPath,KeyHandle);<br/>&nbsp;char strTmp[512];<br/>&nbsp;strcpy(strTmp,strObjectPath);<br/>&nbsp;strlwr(strObjectPath);<br/>&nbsp;//排除非启动项<br/>&nbsp;if (strstr(strObjectPath,mstrMachinePath) || strstr(strObjectPath,mstrUserPath) ||<br/>&nbsp;&nbsp;strstr(strObjectPath,mstrLogonPath) || strstr(strObjectPath,mstrWinRegPath))<br/>&nbsp;{<br/>&nbsp;&nbsp;COPYDATASTRUCT cds;<br/>&nbsp;&nbsp;//构造字符串好让监管程序分离,这里是按我自己特定的格式传过去的,大家可以根据自己的格式构造<br/>&nbsp;&nbsp;char strMsg[512];<br/>&nbsp;&nbsp;strcpy(strMsg,"删除项:");<br/>&nbsp;&nbsp;strcat(strMsg,strTmp);<br/>&nbsp;&nbsp;strcat(strMsg,"^^");<br/>&nbsp;&nbsp;char strPath[260];<br/>&nbsp;&nbsp;GetModuleFileName(NULL,strPath,sizeof(strPath));<br/>&nbsp;&nbsp;strcat(strMsg,strPath);<br/>&nbsp;&nbsp;char strInt[10];<br/>&nbsp;&nbsp;strcat(strMsg,"进程ID&lt;");<br/>&nbsp;&nbsp;itoa(::GetCurrentProcessId(),strInt,10);<br/>&nbsp;&nbsp;strcat(strMsg,strInt);<br/>&nbsp;&nbsp;strcat(strMsg,"&gt;");<br/>&nbsp;&nbsp;cds.lpData = strMsg;<br/>&nbsp;&nbsp;cds.cbData = sizeof(strMsg);<br/>&nbsp;&nbsp;cds.dwData = 0;<br/>&nbsp;&nbsp;//发送消息给监管程序,如果同意就执行<br/>&nbsp;&nbsp;LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&amp;cds);<br/>&nbsp;&nbsp;if (l==1000)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;ChookNtDeleteKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;&nbsp;NTSTATUS hReturn = NtDeleteKey(KeyHandle);<br/>&nbsp;&nbsp;&nbsp;ChookNtDeleteKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;&nbsp;return hReturn;<br/>&nbsp;&nbsp;}&nbsp;<br/>&nbsp;}<br/>&nbsp;else<br/>&nbsp;{&nbsp;<br/>&nbsp;&nbsp;//没有监控的让它继续执行<br/>&nbsp;&nbsp;ChookNtDeleteKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;NTSTATUS hReturn = NtDeleteKey(KeyHandle);<br/>&nbsp;&nbsp;ChookNtDeleteKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;return hReturn;<br/>&nbsp;}<br/>&nbsp;//不同意的返回拒绝访问<br/>&nbsp;return STATUS_ACCESS_DENIED;<br/>}</p>
<p>//注册表创建项代理函数<br/>NTSTATUS WINAPI NtCreateKeyCallback(OUT PHANDLE pKeyHandle,IN ACCESS_MASK DesiredAccess,<br/>&nbsp;IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,<br/>&nbsp;IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL)<br/>{<br/>&nbsp;char strName[512];<br/>&nbsp;//获取创建的路径<br/>&nbsp;GetPath(strName,ObjectAttributes-&gt;RootDirectory);<br/>&nbsp;char strObjectPath[512];<br/>&nbsp;//获取注册表完整路径包括创建的键名<br/>&nbsp;wsprintf(strObjectPath, "%s\\%S",strName, ObjectAttributes-&gt;ObjectName-&gt;Buffer);<br/>&nbsp;if (lstrcmpi(strObjectPath,mstrMachinePath)==0 || lstrcmpi(strObjectPath,mstrUserPath)==0 ||<br/>&nbsp;&nbsp;lstrcmpi(strObjectPath,mstrLogonPath)==0 || lstrcmpi(strObjectPath,mstrWinRegPath)==0)<br/>&nbsp;{<br/>&nbsp;&nbsp;ChookNtCreateKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;NTSTATUS hReturn = hReturn = NtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);<br/>&nbsp;&nbsp;ChookNtCreateKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;return hReturn;<br/>&nbsp;}<br/>&nbsp;char strTmp[260];<br/>&nbsp;strcpy(strTmp,strObjectPath);<br/>&nbsp;strlwr(strObjectPath);<br/>&nbsp;//只监视启动项,这里大家可以自己设置<br/>&nbsp;if (strstr(strObjectPath,mstrMachinePath) || strstr(strObjectPath,mstrUserPath) ||<br/>&nbsp;&nbsp;strstr(strObjectPath,mstrLogonPath) || strstr(strObjectPath,mstrWinRegPath))<br/>&nbsp;{<br/>&nbsp;&nbsp;COPYDATASTRUCT cds;<br/>&nbsp;&nbsp;//构造字符串好让监管程序分离<br/>&nbsp;&nbsp;char strMsg[512];<br/>&nbsp;&nbsp;strcpy(strMsg,"新增项:");<br/>&nbsp;&nbsp;strcat(strMsg,strTmp);<br/>&nbsp;&nbsp;strcat(strMsg,"^^");<br/>&nbsp;&nbsp;char strPath[260];<br/>&nbsp;&nbsp;GetModuleFileName(NULL,strPath,sizeof(strPath));<br/>&nbsp;&nbsp;strcat(strMsg,strPath);<br/>&nbsp;&nbsp;strcat(strMsg,"进程ID&lt;");<br/>&nbsp;&nbsp;char strInt[10];<br/>&nbsp;&nbsp;itoa(::GetCurrentProcessId(),strInt,10);<br/>&nbsp;&nbsp;strcat(strMsg,strInt);<br/>&nbsp;&nbsp;strcat(strMsg,"&gt;");<br/>&nbsp;&nbsp;cds.lpData = strMsg;<br/>&nbsp;&nbsp;cds.cbData = sizeof(strMsg);<br/>&nbsp;&nbsp;cds.dwData = 0;<br/>&nbsp;&nbsp;//发送消息给监管程序,当返回1000表示同意<br/>&nbsp;&nbsp;LRESULT l=::SendMessage(m_hWnd,WM_COPYDATA,0,(LPARAM)&amp;cds);<br/>&nbsp;&nbsp;if (l==1000)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;ChookNtCreateKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;&nbsp;NTSTATUS hReturn = NtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);<br/>&nbsp;&nbsp;&nbsp;ChookNtCreateKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;&nbsp;return hReturn;<br/>&nbsp;&nbsp;}<br/>&nbsp;}<br/>&nbsp;else<br/>&nbsp;{&nbsp;<br/>&nbsp;&nbsp;//没有监控的就让函数执行<br/>&nbsp;&nbsp;ChookNtCreateKey-&gt;HookStatus(FALSE);<br/>&nbsp;&nbsp;NTSTATUS hReturn = hReturn = NtCreateKey(pKeyHandle,DesiredAccess,ObjectAttributes,TitleIndex,Class,CreateOptions,Disposition);<br/>&nbsp;&nbsp;ChookNtCreateKey-&gt;HookStatus(TRUE);<br/>&nbsp;&nbsp;return hReturn;<br/>&nbsp;}<br/>&nbsp;//不同意的返回拒绝访问<br/>&nbsp;return STATUS_ACCESS_DENIED;<br/>}</p>
<p>//获取指定用户的SID<br/>char *GetSidString(char *strUserName)<br/>{<br/>&nbsp;char szBuffer[200];<br/>&nbsp;&nbsp;&nbsp; BYTE sidBuffer[100];<br/>&nbsp;&nbsp;&nbsp; PSID pSid=(PSID)&amp;sidBuffer;<br/>&nbsp;&nbsp;&nbsp; DWORD sidBufferSize = 100;<br/>&nbsp;&nbsp;&nbsp; char domainBuffer[80];<br/>&nbsp;&nbsp;&nbsp; DWORD domainBufferSize = 80;<br/>&nbsp;&nbsp;&nbsp; SID_NAME_USE snu;<br/>&nbsp;LookupAccountName(NULL,strUserName,pSid,&amp;sidBufferSize,domainBuffer,&amp;domainBufferSize,&amp;snu);</p>
<p>&nbsp;SID_IDENTIFIER_AUTHORITY *psia = GetSidIdentifierAuthority(pSid);<br/>&nbsp;DWORD dwTopAuthority = psia-&gt;Value[5];<br/>&nbsp;wsprintf(szBuffer, "S-1-%lu", dwTopAuthority);<br/>&nbsp;TCHAR szTemp[32];<br/>&nbsp;int iSubAuthorityCount = *(GetSidSubAuthorityCount(pSid));<br/>&nbsp;for (int i = 0; i&lt;iSubAuthorityCount; i++) <br/>&nbsp;{<br/>&nbsp;&nbsp;DWORD dwSubAuthority = *(GetSidSubAuthority(pSid, i));<br/>&nbsp;&nbsp;wsprintf(szTemp, "%lu", dwSubAuthority);<br/>&nbsp;&nbsp;strcat(szBuffer, "-");<br/>&nbsp;&nbsp;strcat(szBuffer, szTemp);<br/>&nbsp;}<br/>&nbsp;return &amp;szBuffer[0];<br/>}</p>
<p>//来源 :<font face="Verdana">http://blog.csdn.net/chenhui530/archive/2008/02/02/2079118.aspx</font><br/>&nbsp;</p>
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表