- 注册时间
- 2021-4-16
- 最后登录
- 2024-3-8
- 在线时间
- 3 小时
编程入门
- 龙马币
- 96
|
防IAT检测方法:IAT在指定目标文件的PE结构里面指定了的,我们把自己内存里面做了修改,没有修改目标文件,只要不让目标文件被其他文件映射,读取PE结构和我们内存中修改过的比较,保证能反一切IAT检测。
用法:
- HookImage("ZwSetInformationFile",(DWORD)MyZwSetInformationFile);
- HookImage("NtTerminateProcess",(DWORD)MyNtTerminateProcess);
- HookImage("NtTerminateThread",(DWORD)MyNtTerminateThread);
- HookImport("KERNEL32.DLL","ExitProcess",(DWORD)MyNtTerminateProcess);
- RemoveImage("NtTerminateProcess");
复制代码
- /********************************************
- 挂钩目标程序kernel32.dll里面输入的ntdll.dll的函数
- ********************************************/
- DWORD HookImage(char *szName,DWORD Newfunc)
- {
- HMODULE hMod=LoadLibrary("NTDLL");
- DWORD RealAddr=(DWORD)GetProcAddress(hMod,szName);
- UINT Size=0;
- hMod=LoadLibrary("kernel32.dll");
- PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
- (hMod,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&Size);
- if(pImport==NULL)
- {
- return FALSE;
- }
- IMAGE_THUNK_DATA32 *Pthunk=(IMAGE_THUNK_DATA32*)((DWORD)hMod+pImport->FirstThunk);
- MEMORY_BASIC_INFORMATION mbi;
- VirtualQuery(Pthunk,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
- VirtualProtect(mbi.BaseAddress,mbi.RegionSize,PAGE_READWRITE,&mbi.Protect);
- while(Pthunk->u1.Function)
- {
- if(RealAddr==Pthunk->u1.Function)
- {
- Pthunk->u1.Function=Newfunc;
- break;
- }
- Pthunk++;
- }
- DWORD protect;
- VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,&protect);
- return TRUE;
- }
- /********************************************
- 挂钩目标程序输入表里面的函数
- ********************************************/
- DWORD HookImport(char *szDLL,char *szName,DWORD Newfunc)
- {
- DWORD protect;
- UINT Size=0;
- HMODULE hMod=GetModuleHandle(NULL);
- MEMORY_BASIC_INFORMATION mbi;
- PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
- (hMod,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&Size);
- ////改写内存保护,以便转换大小写
- VirtualQuery(pImport,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
- VirtualProtect(mbi.BaseAddress,mbi.RegionSize,PAGE_READWRITE,&mbi.Protect);
- while(pImport->Name)
- {
- char *pszModName=(char*)((PBYTE)hMod+pImport->Name);
- if(_stricmp(pszModName,szDLL)==0)
- {
- break;
- }
- pImport++;
- }
- VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,&protect);
- ////改写内存保护结束,改回原来的保护
- DWORD RealAddr=(DWORD)GetProcAddress(LoadLibrary(szDLL),szName);
- if(pImport==NULL)
- {
- return FALSE;
- }
- IMAGE_THUNK_DATA32 *Pthunk=(IMAGE_THUNK_DATA32*)((DWORD)hMod+pImport->FirstThunk);
- ////改写内存保护,以便写入函数地址
- VirtualQuery(Pthunk,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
- VirtualProtect(mbi.BaseAddress,mbi.RegionSize,PAGE_READWRITE,&mbi.Protect);
- while(Pthunk->u1.Function)
- {
- if(RealAddr==Pthunk->u1.Function)
- {
- Pthunk->u1.Function=Newfunc;
- break;
- }
- Pthunk++;
- }
- VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,&protect);
- ////改写内存保护,改回原来的保护
- return TRUE;
- }
- /********************************************
- 清除目标程序的ntdll的函数名字
- ********************************************/
- BOOL RemoveImage(char *szName)
- {
- HMODULE hMod=LoadLibrary("kernel32.dll");
- UINT Size=0;
- PIMAGE_IMPORT_DESCRIPTOR pImport=(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData
- (hMod,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&Size);
- DWORD *pName=(DWORD*)((DWORD)hMod+pImport->OriginalFirstThunk);
- while(pName)
- {
- char *pAddr=(char*)(*pName+(DWORD)hMod+2);
- if(!(strcmp(pAddr,szName)))
- {
- DWORD Protect;
- VirtualProtect(pAddr,strlen(pAddr),PAGE_READWRITE,&Protect);
- memset(pAddr,0,strlen(pAddr));
- VirtualProtect(pAddr,strlen(pAddr),Protect,pName);
- break;
- }
- pName++;
- }
- return TRUE;
- }
复制代码 |
|