// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include "..\BPHookFunction\BPHookFunction.h"
#include "..\..\testbase\Memory\Memory.h"
typedef int(WINAPI *PMESSAGEBOXA)(
__in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
typedef int(WINAPI *PMESSAGEBOXW)(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
DWORD *AddressOfFunctionOffst=0;
#ifdef UNICODE
#define PMESSAGEBOX PMESSAGEBOXW
PMESSAGEBOXW MyMessageBox = 0;//(PMESSAGEBOXW)GetFunctionAddressByDllExprot(::GetModuleHandle(_T("User32.dll")), "MessageBoxW",&AddressOfFunctionOffst);
#else
#define PMESSAGEBOX PMESSAGEBOXA
PMESSAGEBOXA MyMessageBox = 0;//(PMESSAGEBOXA)GetFunctionAddressByDllExprot(::GetModuleHandle(_T("User32.dll")), "MessageBoxA");
#endif // !UNICODE
PMESSAGEBOX HookAddress= 0;
//DWORD64 SetThreadStartAddr1(DWORD dwThreadId,DWORD64 dwStaAddr) ;
//DWORD64 GetThreadStartAddr1(DWORD dwThreadId) ;
typedef LONG NTSTATUS;
/*
typedef NTSTATUS (WINAPI *NTQUERYINFORMATIONTHREAD)(
HANDLE ThreadHandle,
ULONG64 ThreadInformationClass,
PVOID64 ThreadInformation,
ULONG64 ThreadInformationLength,
PULONG64 ReturnLength);
typedef enum _THREADINFOCLASS {
ThreadBasicInformation,
ThreadTimes,
ThreadPriority,
ThreadBasePriority,
ThreadAffinityMask,
ThreadImpersonationToken,
ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,
ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,
ThreadZeroTlsCell,
ThreadPerformanceCount,
ThreadAmILastThread,
ThreadIdealProcessor,
ThreadPriorityBoost,
ThreadSetTlsArrayAddress, // Obsolete
ThreadIsIoPending,
ThreadHideFromDebugger,
ThreadBreakOnTermination,
ThreadSwitchLegacyState,
ThreadIsTerminated,
ThreadLastSystemCall,
ThreadIoPriority,
ThreadCycleTime,
ThreadPagePriority,
ThreadActualBasePriority,
ThreadTebInformation,
ThreadCSwitchMon, // Obsolete
ThreadCSwitchPmu,
ThreadWow64Context,
ThreadGroupInformation,
ThreadUmsInformation, // UMS
ThreadCounterProfiling,
ThreadIdealProcessorEx,
MaxThreadInfoClass
} THREADINFOCLASS;
typedef NTSTATUS (*NtSetInformationThreadPtr)(HANDLE threadHandle,
THREADINFOCLASS threadInformationClass,
PVOID64 threadInformation,
ULONG threadInformationLength);
void Test2();
HANDLE hEvent = ::CreateEvent(0,0,0,0);
HANDLE hEvent1 = ::CreateEvent(0,0,0,0);*/
int
WINAPI
CallBackMessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
LONG WINAPI MessageBoxTopUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
//修改EIP 指向HOOK的过滤函数
#if _WIN64
ExceptionInfo->ContextRecord->Rip=(DWORD64)CallBackMessageBoxW;
#else
ExceptionInfo->ContextRecord->Eip=(DWORD)CallBackMessageBoxW;
#endif
return EXCEPTION_CONTINUE_EXECUTION;
}
DWORD CALLBACK Thread(PVOID)
{
return 0;
}
DWORD CALLBACK Thread3(PVOID)
{
return 0;
}
DWORD CALLBACK ThreadCreateCallBack(DWORD Tid,BOOL bCreate,LPTHREAD_START_ROUTINE lpStartAddress,PVOID ThreadData)
{
if(bCreate)//判断是否是线程创建
return lpStartAddress(ThreadData);//如果是线程创建,那么我们就需要调用线程入口函数!
return 0;//不是线程创建,我们就返回0
}//*/
int
WINAPI
CallBackMessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType)
{
TCHAR *Buffer = 0;
static int i =0;
int Return = 0;
SetHardWareBP(::GetCurrentThreadId(),(DWORD64)MyMessageBox,MessageBoxTopUnhandledExceptionFilter,1,0,1,0);
//第一次调用MessageBoxW 大家可以试着使用钩子恢复工具恢复!\nTest IAT HOOK 原函数"
if(i ==0)
{
Buffer = (TCHAR *)AllocMemory((wcslen(lpText)+wcslen(_T("第一次调用MessageBoxW 大家可以试着使用钩子恢复工具恢复!\n%s\r\n%sMessageBoxW函数已经被IAT HOOK EAX HOOK 和 inLine Hook 硬件寄存器挂钩\n")))*sizeof(WCHAR)+10);
::wsprintf(Buffer,L"第一次调用MessageBoxW 大家可以试着使用钩子恢复工具恢复!\n%s\r\n%s",lpText,L"MessageBoxW函数已经被IAT HOOK EAT HOOK 和 inLine Hook 硬件寄存器挂钩\n");
}else
{
Buffer = (TCHAR *)AllocMemory((wcslen(lpText)+wcslen(_T("第二次调用MessageBoxW 纳尼?为什么还会被挂钩?\n%s\r\n%sMessageBoxW函数已经被IAT HOOK EAX HOOK 和 inLine Hook 硬件寄存器挂钩\n")))*sizeof(WCHAR)+10);
::wsprintf(Buffer,L"调用MessageBoxW 纳尼?为什么还会被挂钩?\n%s\r\n%s",lpText,L"MessageBoxW函数已经被IAT HOOK EAT HOOK 和 inLine Hook 硬件寄存器挂钩\n");
Return= HookAddress(hWnd,Buffer,lpCaption,uType);
FreeMemory(Buffer);
if(i>1)
{
Return=HookAddress(hWnd,L"因为这是混合挂钩,同时修改了导入表,导出表,函数头5字节,修改了调试寄存器,截获了线程的创建,并且在线程开始的时候自动挂钩对应线程的入口点!",lpCaption,0);
}
i++;
SetHardWareBP(::GetCurrentThreadId(),(DWORD64)MyMessageBox,MessageBoxTopUnhandledExceptionFilter,1,0,1,1);
return Return;
}
i++;
Return= HookAddress(hWnd,Buffer,lpCaption,uType);
SetHardWareBP(::GetCurrentThreadId(),(DWORD64)MyMessageBox,MessageBoxTopUnhandledExceptionFilter,1,0,1,1);
FreeMemory(Buffer);
return Return;
}
int _tmain(int argc, _TCHAR* argv[])
{
typedef int(WINAPI *PTest)();//一个测DLL中的函数
::InitHook();//初始化寄存器HOOK
SetThreadCreateCallBack(ThreadCreateCallBack);//设置线程创建回调函数
::CreateThread(0,0,Thread,0,0,0);//创建线程
MessageBoxW(0,L"Test IAT HOOK 原函数",L"IAT HOOK",0);
char buffer[100] = {0};
//设置寄存器HOOK SetHardWareBP 用法 ThreadId =需要HOOK的线程的ID,dwAddr=需要HOOK的函数的地址,lpTopLevelExceptionFilter=
//调试陷阱回调函数指针,dwDrIndex = 需要设置的断点寄存器的序号 范围为0到3,nType = 0 保留,必须设置为0,nLen = 1保留,必须设置为1,bSet = TRUE 或者FALSE TRUE表示为需要HOOK FALSE表示需要卸载HOOK
SetHardWareBP(::GetCurrentThreadId(),(DWORD64)MessageBoxW,MessageBoxTopUnhandledExceptionFilter,1,0,1,1);
/*导入表HOOK
HookFunctionByDllImprot 用法
DllHandle=需要HOOK导入表的模块,
DllName = HOOK函数所在模块的文件名,不是文件全名,
FunctionName = 需要HOOK的函数名,不支持序号导出方式的文件名
AddressOfFunction = HOOK的过滤函数
如果成功,返回原函数地址,不成功就返回0
如果需要卸载HOOK ,只需将AddressOfFunction设置为原函数地址,然后调用HookFunctionByDllImprot就行
*/
MyMessageBox=(PMESSAGEBOX)HookFunctionByDllImprot(GetModuleHandle(0),"User32.dll","MessageBoxW",&CallBackMessageBoxW);
/*导出表HOOK
HookFunctionByDllExprot 用法
DllHandle=需要HOOK导出表的模块,
FunctionName = 需要HOOK的函数名,不支持序号导出方式的文件名
AddressOfFunction = HOOK的过滤函数
如果成功,返回原函数地址,不成功就返回0
如果需要卸载HOOK ,只需将AddressOfFunction设置为原函数地址,然后调用HookFunctionByDllExprot就行
*/
MyMessageBox=(PMESSAGEBOX)HookFunctionByDllExprot(GetModuleHandle(L"User32.dll"),"MessageBoxW",CallBackMessageBoxW);
PMESSAGEBOX HookAddress2 = 0;
HookAddress=MyMessageBox;
/*InlineHook
SetInlineHook用法
ppSystemFunction 输入被HOOK函数的地址,返回一个新的指针,调用这个新的指针,就可以调用原函数,UnInlineHook,需要用到这个指针
pHookFunction HOOK的过滤函数
返回BOOL类型
*/
SetInlineHook((PVOID*)&HookAddress,CallBackMessageBoxW);
HookAddress2=CallBackMessageBoxW;
//SetInlineHook((PVOID*)&HookAddress2,CallBackMessageBoxW2);
HMODULE m=::LoadLibrary(L"Testmsg.dll");//调用测试DLL
PTest m_Test = (PTest)::GetProcAddress(m,"Test");
MessageBoxW(0,L"Test IAT HOOK 原函数",L"IAT HOOK",0);
m_Test();
MyMessageBox(0,L"Test IAT HOOK 原函数",L"IAT HOOK",0);
//卸载InlineHook
//ppHookedFunction = SetInlineHook函数第一个参数返回的指针
UnInlineHook((PVOID*)&HookAddress);
//卸载导入表HOOK
HookFunctionByDllImprot(GetModuleHandle(0),"User32.dll","MessageBoxW",MyMessageBox);
//卸载导出表HOOK
HookFunctionByDllExprot(GetModuleHandle(L"User32.dll"),"MessageBoxW",MyMessageBox);
//卸载寄存器HOOK
SetHardWareBP(::GetCurrentThreadId(),(DWORD64)MessageBoxW,MessageBoxTopUnhandledExceptionFilter,1,0,1,0);
MessageBoxW(0,L"Test IAT HOOK 原函数",L"IAT HOOK",0);
// GetFunctionAddressByDllExprot(::GetModuleHandle(_T("User32.dll")), "MessageBoxW");
debug;//DEBUG断点调试宏
//反初始化寄存器HOOK
UnInitHook();
//::ExitThread(5);
//exit(0);
return(0);
}
各位要是下载,编译中遇到没有定义的结构或者函数,请你自己在目录下的winternl.h文件中寻找,
另外,我自己实现了GetModuleFileName(我自己实现的函数的函数名,下面的括号中,如果没有特殊说明,都是指我自己实现的函数的函数名,函数名 :GetDllModuleFileName)
LoadLibrary(OtherLoadLibrary)
GetModuleHandle(GetDllModuleHandle)
FreeLibrary(OtherFreeLibrary)
OpenProcess(OpenProcessByProcessId)
OpenThread(OpenThreadByThreadId)
GetProcAddress(GetFunctionAddressByDllExprot,这个函数比原函数多了一个参数,这个参数返回了,被寻找函数的条目在导出表中的地址,借助修改这个地址就可以进行导出表HOOK)
在FileSystem工程中使用了网上收集的WINDOWS代码
实现了部分WINDOWS文件操作函数,文件名为以FileSystem为前缀加上WINDOWS原函数的函数名!可代替WINDOWS部分函数!大家HOOK这些WINDOWS函数时,可直接调用工程中对应已经实现的函数,不必调用原函数!
被程序在WINDOWS 7 X64中实验通过,编译环境为VS2010+WDK 7,要是在别的版本中出现如没有在NTDLL中找到某函数的错误的话,请尝试动态调用,否则请删除对对应函数的调用,或者在这里将错误反馈给我,嘿嘿!有些结构和函数在VS中没有声明的,如遇到没有声明的函数和结构,请到目录下的winternl.h文件红复制,要是还没有的,请到MSDN,或者是WDK中复制!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)