首页
论坛
课程
招聘
[原创]IAT随便HOOK+反检测方法
2011-10-15 04:42 18910

[原创]IAT随便HOOK+反检测方法

2011-10-15 04:42
18910
防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;
}

[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (15)
雪    币: 1628
活跃值: 活跃值 (459)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nekaxi 活跃值 2011-10-15 11:03
2
0
标记,以后学习,附检测内存块的代码:
BOOL TestRangeAddr(ULONG VirtualAddress,ULONG Size)
{
                ULONG Addr,i;
        if (VirtualAddress==0||Size==0)
        {
                return FALSE;
        }       
                Addr=VirtualAddress;
        Addr%=0x1000;
                i=Addr+Size+0x0FFF;
        VirtualAddress/=0x1000;
               VirtualAddress*=0x1000;
        i/=0x1000;
        while(TRUE==MmIsAddressValid(VirtualAddress))
        {
                i--;
                VirtualAddress+=0x1000;
                if(i<=0)
                        return TRUE;
        }
        return FALSE;
}
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-10-15 11:33
3
0
邓韬周末还在整这些,也不出去 HAPPY一下
雪    币: 142
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiejienet 活跃值 2011-10-16 14:08
4
0
第一段话就没看懂
读起来怎么就那么费劲呢?
雪    币: 3650
活跃值: 活跃值 (1014)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 活跃值 1 2011-10-16 19:13
5
0
不错,学习了.
雪    币: 266
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪妖 活跃值 2011-10-17 11:13
6
0
不错 强力mark
雪    币: 136
活跃值: 活跃值 (35)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
robey 活跃值 1 2011-10-17 11:38
7
0
过来学习。。
雪    币: 130
活跃值: 活跃值 (218)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Nermor 活跃值 1 2011-10-23 11:32
8
0
~学习涛哥的hook
雪    币: 79
活跃值: 活跃值 (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
moonflow 活跃值 2 2011-10-23 11:57
9
0
不错不错,
雪    币: 893
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
jasonnbfan 活跃值 8 2011-10-24 12:36
10
0
mark 记录下
雪    币: 224
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gamefox 活跃值 2011-10-24 17:31
11
0
同感,LZ的文字狗屁不通,怎么语文就这么差呢
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-10-24 17:41
12
0
不知道你们理解没有,反正我是理解了。
雪    币: 85
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
黑箜 活跃值 2011-10-24 18:30
13
0
.下载学习...
雪    币: 306
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tfzxyinhao 活跃值 2011-11-17 12:20
14
0
目标文件都修改了? 系统dll都修改 ?
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
imdemon 活跃值 2011-11-17 13:20
15
0
雪    币: 130
活跃值: 活跃值 (218)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Nermor 活跃值 1 2012-7-2 21:30
16
0
while(TRUE==MmIsAddressValid(VirtualAddress))
{
i--;
VirtualAddress+=0x1000;
if(i<=0)
return TRUE;
}


方法不够猥琐的说。 而且不是很精准
游客
登录 | 注册 方可回帖
返回