首页
社区
课程
招聘
[原创]IAT随便HOOK+反检测方法
发表于: 2011-10-15 04:42 20507

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

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

[课程]Android-CTF解题方法汇总!

收藏
免费 6
支持
分享
最新回复 (15)
雪    币: 7039
活跃值: (4194)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
标记,以后学习,附检测内存块的代码:
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;
}
2011-10-15 11:03
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
邓韬周末还在整这些,也不出去 HAPPY一下
2011-10-15 11:33
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
第一段话就没看懂
读起来怎么就那么费劲呢?
2011-10-16 14:08
0
雪    币: 8599
活跃值: (5065)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
不错,学习了.
2011-10-16 19:13
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错 强力mark
2011-10-17 11:13
0
雪    币: 149
活跃值: (126)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
过来学习。。
2011-10-17 11:38
0
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
~学习涛哥的hook
2011-10-23 11:32
0
雪    币: 102
活跃值: (85)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
不错不错,
2011-10-23 11:57
0
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
10
mark 记录下
2011-10-24 12:36
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
同感,LZ的文字狗屁不通,怎么语文就这么差呢
2011-10-24 17:31
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
12
不知道你们理解没有,反正我是理解了。
2011-10-24 17:41
0
雪    币: 93
活跃值: (41)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
.下载学习...
2011-10-24 18:30
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
目标文件都修改了? 系统dll都修改 ?
2011-11-17 12:20
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2011-11-17 13:20
0
雪    币: 138
活跃值: (460)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
while(TRUE==MmIsAddressValid(VirtualAddress))
{
i--;
VirtualAddress+=0x1000;
if(i<=0)
return TRUE;
}


方法不够猥琐的说。 而且不是很精准
2012-7-2 21:30
0
游客
登录 | 注册 方可回帖
返回
//