首页 > 其他分享 >IAT 隐藏和混淆

IAT 隐藏和混淆

时间:2025-01-21 14:35:15浏览次数:1  
标签:混淆 pBase 函数 DLL 获取 IAT 隐藏 PEB

一、介绍

导入地址表 (IAT) 包含有关 PE 文件的信息,例如使用过的函数和导出它们的 DLL。此类信息可用于对二进制文件进行签名和检测,如下图所示PE 文件导入被认为高度可疑的函数

二、隐藏混淆方法

(1)IAT 隐藏和混淆—方法 1 自定义函数

  可以在运行时使用 GetProcAddressGetModuleHandle 或 LoadLibrary 动态加载这些函数。下面的代码段将动态加载 VirtualAllocEx,因此在检查时它不会出现在 IAT 中

typedef LPVOID (WINAPI* fnVirtualAllocEx)(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);
fnVirtualAllocEx pVirtualAllocEx = GetProcAddress(GetModuleHandleA("KERNEL32.DLL"), "VirtualAllocEx");

 但该方法有个缺点,VirtualAllocEx字符串存在于二进制文件中,GetProcAddress 和 GetModuleHandleA 会出现在 IAT 中。

(2)IAT 隐藏和混淆 - 方法 2 自定义GetProcAddress

通过解析PE结构当中的导出表获取函数的地址,代码当中

FunctionNameArray:包含函数名称的地址数组。
FunctionAddressArray:包含函数地址的数组。
FunctionOrdinalArray:包含每个函数的序号。
对于每个函数,首先获取它的名字(通过 FunctionNameArray)。
然后通过它的序号在 FunctionOrdinalArray 中找到它的序号。
使用序号在 FunctionAddressArray 中查找它的地址。

#include <windows.h>
#include <iostream>


PVOID GetProcAddressReplacement(IN HMODULE hModule, IN LPCSTR lpApiName) {

	// 这样做是为了避免每次使用 hModule 时进行强制转换
	PBYTE pBase = (PBYTE)hModule;

	// 获取 DOS 头并进行签名检查
	PIMAGE_DOS_HEADER	pImgDosHdr = (PIMAGE_DOS_HEADER)pBase;
	if (pImgDosHdr->e_magic != IMAGE_DOS_SIGNATURE)
		return NULL;

	// 获取 NT 头并进行签名检查
	PIMAGE_NT_HEADERS	pImgNtHdrs = (PIMAGE_NT_HEADERS)(pBase + pImgDosHdr->e_lfanew);
	if (pImgNtHdrs->Signature != IMAGE_NT_SIGNATURE)
		return NULL;

	// 获取可选头
	IMAGE_OPTIONAL_HEADER	ImgOptHdr = pImgNtHdrs->OptionalHeader;

	// 获取映像导出表
	PIMAGE_EXPORT_DIRECTORY pImgExportDir = (PIMAGE_EXPORT_DIRECTORY)(pBase + ImgOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

	// 获取函数名数组指针
	PDWORD FunctionNameArray = (PDWORD)(pBase + pImgExportDir->AddressOfNames);

	// 获取函数地址数组指针
	PDWORD FunctionAddressArray = (PDWORD)(pBase + pImgExportDir->AddressOfFunctions);

	// 获取函数序号数组指针
	PWORD  FunctionOrdinalArray = (PWORD)(pBase + pImgExportDir->AddressOfNameOrdinals);


	// 遍历所有导出的函数
	for (DWORD i = 0; i < pImgExportDir->NumberOfFunctions; i++) {

		// 获取函数名
		CHAR* pFunctionName = (CHAR*)(pBase + FunctionNameArray[i]);

		// 通过其序号获取函数地址
		PVOID pFunctionAddress = (PVOID)(pBase + FunctionAddressArray[FunctionOrdinalArray[i]]);

		// 查找指定的函数
		if (strcmp(lpApiName, pFunctionName) == 0) {
		//	printf("[ %0.4d ] FOUND API -\t NAME: %s -\t ADDRESS: 0x%p  -\t ORDINAL: %d\n", i, pFunctionName, pFunctionAddress, FunctionOrdinalArray[i]);
			return pFunctionAddress;
		}
	}

	return NULL;
}


int main() {
   
	LPVOID lpadder = GetProcAddressReplacement(GetModuleHandleA("ntdll.DLL"), "NtAllocateVirtualMemory");
	printf("GetProcAddressReplacement is: %p\n", lpadder);
	LPVOID lpPadder = GetProcAddress(GetModuleHandleA("ntdll.DLL"), "NtAllocateVirtualMemory");
	printf("GetProcAddress is: %p\n", lpPadder);
	
}

 (3)IAT 隐藏和混淆-自定义 GetModuleHandle

GetModuleHandle 函数获取指定 DLL 的句柄。此函数返回 DLL 的句柄,如果调用进程中不存在此 DLL,则返回 NULL

HMODULE 数据类型是加载的 DLL 的基地址,表示 DLL 在进程地址空间中的位置。可以利用进程环境块 (PEB) 获取加载的 DLL 相关的信息,特别是 PEB 结构的 PEB_LDR_DATA Ldr 成员。因此,第一步是通过 PEB 结构访问此成员。

在 64 位系统中获取 PEB

64 位系统中的 PEB结构的指针位于线程环境块 (TEB) 结构中

可以使用 Visual Studio 中的 __readgsqword(0x60)宏从 GS 寄存器读取 0x60 字节)来直接获取 PEB 结构

PPEB pPeb2 = (PPEB)(__readgsqword(0x60));

32 位系统中的 PEB

在 32 位系统中,指向 TEB 结构的偏移量存储在 FS 寄存器中

PPEB pPeb2 = (PPEB)(__readfsdword(0x30));

标签:混淆,pBase,函数,DLL,获取,IAT,隐藏,PEB
From: https://www.cnblogs.com/websecyw/p/18683543

相关文章

  • AST反混淆学习--化简常量
    本文章是个人学习AST反混淆的笔记记录,发出来供大家参考指正,希望可以多多交流以提高个人技术!!!(注:本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!)常见的常量混淆常量混淆一直是js中最喜欢使用的一种方式之一,其形式包括计......
  • Edu邮箱福利大揭秘:Notion免费用,还有隐藏小技巧!
    作为一名学生,想要提升学习效率和工作效率,一款功能强大的笔记软件是必不可少的。Notion作为一款备受青睐的笔记软件,以其强大的自定义功能和多样的模板而闻名。但对于学生来说,Notion的付费订阅可能是一笔不小的开销。别担心!今天就来教你如何利用Edu教育邮箱,免费解锁Notion的全部......
  • Notion隐藏技巧:Edu订阅解锁无限可能!
    作为一款功能强大的笔记和知识管理工具,Notion受到了越来越多人的喜爱。但你是否知道,通过Edu教育邮箱,你可以免费申请Notion的教育订阅,解锁更多高级功能?本文将带你深入了解Notion的教育订阅福利,并分享一个鲜为人知的Notion小技巧,助你提升工作效率。Edu订阅:Notion免费升级Edu订......
  • 20221320 冯泰瑞 《信息安全综合实践》课程设计报告——基于文本文件信息隐藏和二值图
    20221320冯泰瑞《信息安全综合实践》课程设计报告——基于文本文件信息隐藏和二值图像信息隐藏的回声信息隐藏算法实现任务简介隐藏原理研究发现,HAS(HumanAudioSystem,人类听觉系统)存在感知掩蔽效应,即强信号的存在会使其附近的弱信号难以被感知。因此,当回声与原声的间隔充分......
  • MEDIATOR(中介者)—对象行为型模式
    1.意图用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。2.动机面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对......
  • Symbolic pg walkthrough Intermediate window 利用302进行文件csrf
    nmapnmap-p--A-sS-T4192.168.239.177StartingNmap7.95(https://nmap.org)at2025-01-1503:39UTCNmapscanreportfor192.168.239.177Hostisup(0.071slatency).Notshown:65533filteredtcpports(no-response)PORTSTATESERVICEVERSION22/tc......
  • Pipe pg walkthrough Intermediate
    NAMP┌──(root?kali)-[~]└─#nmap-p--A192.168.128.45StartingNmap7.95(https://nmap.org)at2025-01-1407:03UTCStats:0:00:40elapsed;0hostscompleted(1up),1undergoingScriptScanNSETiming:About99.30%done;ETC:07:04(0:00:00remainin......
  • 【邮件钓鱼】技术干货:从伪造域名到隐藏链接,攻防实战详解(中)
    0x01前言★声明:未知攻焉知防,本文以安全教育为主,不可用于违法行为,造成的一切后果,与本人无关。邮件伪造是信息安全中的常见手段之一,很多人在实践中因不了解核心原理而踩坑。本篇将结合实践经验,系统讲解邮件伪造的原理与操作方法。如果对SPF和DKIM验证原理不熟悉,请先阅读上......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......
  • 永远不要轻易设置Oracle的隐藏参数,哪怕是DRM
    这篇文章可能会存在较大争议,甚至颠覆一些人的固有思维。因为关于Oracle的隐藏参数,江湖上一直都有两派对立的观点:1.不要设置任何隐藏参数,只有当遇到特殊问题时在售后指导下临时使用,在问题解决后还要及时去掉2.这一系列隐藏参数是众多客户踩出来的最佳实践,上线前必须要设置,才能......