IAT 隐藏和混淆

news/2025/1/21 14:23:06/文章来源:https://www.cnblogs.com/websecyw/p/18683543

一、介绍

导入地址表 (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));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872801.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React席哪个能优化

使用map + keyuseMemo,useCallbak组件Fragement异步组件lazy路由懒加载PureComponent,meno拓展时间分片,延迟加载SSR本作品采用 知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可。

【Unity游戏开发】基于xLua构建一个简单的3D游戏框架

一、xLua简介 xLua是基于Lua语言的开源插件,能够支持在Unity中嵌入Lua脚本(Lua脚本支持热更,适用于游戏的业务逻辑开发和维护) xLua源码地址 二、构建方法新建一个Unity项目(模板选择Universal 3D(URP))下载xLua源码,将Assets目录及其子目录下的全部文件拷贝到Unity项…

Windows RocketMQ 安装-截止当前最新版本(RocketMQ-5.3.1)图文教程

Windows RocketMQ 安装(图文教程) Windows RocketMQ 安装,截止当前最新版本(RocketMQ-5.3.1)图文教程,本文只是最简单的安装方法,旨在能快速使用,若需要更多的配置,则需要你自行查阅官方文档,或互联网搜索答案咯,哈哈哈哈 前言 本文中所有的路径,包括 JAVA 环境,都不…

2025年职场人常用的桌面日程管理软件有哪些?推荐这五款

在繁忙的职场生活中,一款高效的日程管理软件无疑是提升工作效率的秘密武器。 进入2025年,今天给大家介绍5款打工人常用的电脑桌面日程管理软件,它们各有优缺点,看看哪款是你需要的吧! 一、Win系统日历 作为Windows系统自带的日程管理工具,Win系统日历以其简洁易用著称。你…

大趋势下企业如何实现智能制造 | 珠海盈致

在当今全球制造业竞争日益激烈的背景下,智能制造已成为企业提升核心竞争力的关键路径。随着物联网、大数据、云计算、人工智能等技术的快速发展,智能制造正逐步从概念走向现实,为企业带来生产效率、产品质量、成本控制等方面的显著提升。那么,在大趋势下,企业如何实现智能…

【docker】如何运行没有Root权限的Docker?

以下文章来源于运维自习室 ,作者运维自习室 Rootless模式的目的是让Docker守护进程以非root用户身份运行。该方案以实验特性的方式在v19.03版本引入,并在v20.10版本成为正式功能。 实践 官方文档已经做了详细的介绍,这里仅仅做一下实践复现。 具体实践环境为: CentOS 7.2 d…

从0开始的ctf旅行之pwn篇

*最后更新时间:2025-01-21 10:17:43 星期二 * 零、前言 本篇文章是我个人从0开始打pwn的真实 坐牢 做题经验,包含了大量的参考链接和个人思考,绝大多数题目来自MoeCTF2024(https://ctf.xidian.edu.cn/) 本文默认你有以下基础:python3 会装虚拟机+基本的Linux操作 C语言一、…

识别两个表格文件,根据手机号进行匹配相同行并按照需要字段输出

python代码# -*- coding: utf-8 -*- # encoding:utf-8 from flask import Flask, render_template, request, send_file,jsonify import os, requests import pandas as pd from datetime import datetime, timedelta import time, json from log import logging import thread…

语音播报,套件多少异常的问题。(含源代码)

在工作中遇到一家工厂老板的需求:因为产品是有多个配件组成,在生产的时候,经常会多生产,少生产,在组装时,也会出现配件多少的问题,现就此问题设计一款程序。多出,少的,异常的,正常好,会开语音播报。现将全部代码给出以备。 import inspect import os import threadi…

EDMA3学习笔记1

1.1 EDMA3简介 EDMA3(Enhanced Direct Memory Access 3):增强型直接存储器访问的控制器。它是DSP中一个高级数据传输引擎,其结构适合数据的高速传输,可以在没有CPU主要参与的情况下,由控制器完成数据转移,主要服务外部内存(DDR)、片上内存(L2 SRAM)以及串口外设等。…