windows pe文件导入表隐藏

news/2024/12/31 5:59:43/

   前言

  分析过一些文件,发现里面都会对引用的api进行动态获取,然后通过内存指针调用。细细想来,这种方法还是有一定的对抗作用的,如果别人想要分析的必须的稍微深入或者动态调试一下。然后,我就想着该如何实现这种用法呢?那么多api地址该如何存放?引用的时候又应该怎么区分了?下面主要来解决一下这些问题。

   首先,存放的问题。假如,需要使用CreateFileA,WriteFileA,CloseHandle等api,我们会通过GetProcAddress来获取其地址,然后保存到自定义的函数原型指针中。但是,这样就会导致每个函数都有一个单独的变量,无法统一管理;所以,能不能统一存放到一块内存或数组了。最后就有了下面的方案:

         1,动态获取函数地址,统一保存,通过下标(来识别)

          2,调用时,对函数地址进行函数指针化,完成调用

相关代码如下:

/*
hideiat.h
*/
#pragma once
#include<Windows.h>extern PVOID* funcAddress;typedef HANDLE(WINAPI* MyCreateFileA)(LPCSTR                lpFileName,DWORD                 dwDesiredAccess,DWORD                 dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD                 dwCreationDisposition,DWORD                 dwFlagsAndAttributes,HANDLE                hTemplateFile);typedef BOOL(WINAPI* MyWriteFile)(_In_ HANDLE hFile,_In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,_In_ DWORD nNumberOfBytesToWrite,_Out_opt_ LPDWORD lpNumberOfBytesWritten,_Inout_opt_ LPOVERLAPPED lpOverlapped);typedef BOOL (WINAPI* MyCloseHandle)(_In_ _Post_ptr_invalid_ HANDLE hObject);#define MyCreateFileIndex            0
#define MyWriteFileIndex             1
#define MyCloseHandleIndex           2void initHideIat();void testhideiat();
/*
hideiat.c
*/#include<Windows.h>
#include<stdio.h>#include"hideiat.h"//PVOID funcAddress[MAX_PATH] ;
PVOID* funcAddress = NULL;void initHideIat()
{HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");funcAddress = (PVOID*)malloc(sizeof(PVOID) * MAX_PATH);if (NULL != funcAddress){if (hKernel32){funcAddress[MyCreateFileIndex] = GetProcAddress(hKernel32, "CreateFileA");funcAddress[MyWriteFileIndex] = GetProcAddress(hKernel32, "WriteFile");funcAddress[MyCloseHandleIndex] = GetProcAddress(hKernel32, "CloseHandle");}//print the func addressfor (int i = 0; i < MAX_PATH; i++){if (funcAddress[i]){printf("funcAddress[%d]:%p\n", i, funcAddress[i]);}}}}
void freeHideIat()
{//free memory
}void testhideiat()
{DWORD lpNumberOfBytesWritten = 0;//init hideiatinitHideIat();//call CreateFileAHANDLE hFile = ((MyCreateFileA)funcAddress[MyCreateFileIndex])("abc.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE != hFile){((MyWriteFile)funcAddress[MyWriteFileIndex])(hFile, "123456", 6, &lpNumberOfBytesWritten, NULL);}if (hFile){((MyCloseHandle)funcAddress[MyCloseHandleIndex])(hFile);}
}

再来看看后续的反汇编代码效果:

 

后续:

   demo里面只是调用了几个api,如果需要的话,可以将继续往函数地址数组里面添加,然后调用。

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

相关文章

python三大器,Python 入门之 Python三大器 之 生成器

Python 入门之 Python三大器 之 生成器 1、生成器 (1)什么是生成器&#xff1f; 核心&#xff1a;生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func(): print("这是一个函数") return "函数" func() def func():…

java三大器

拦截器&#xff1a;利用反射的机制实现&#xff0c;针对action、日志、未登录用户。 4.1&#xff0c;拦截器是基于java反射机制来实现的&#xff0c;而过滤器是基于函数回调来实现的。&#xff08;有人说&#xff0c;拦截器是基于动态代理来实现的&#xff09; 4.2&#xff0…

java 三大器

过滤器&#xff08;Filter&#xff09; 所谓过滤器顾名思义是用来过滤的&#xff0c;Java的过滤器能够为我们提供系统级别的过滤&#xff0c;也就是说&#xff0c;能过滤所有的web请求&#xff0c;这一点&#xff0c;是拦截器无法做到的。在Java Web中&#xff0c;你传入的requ…

python三大器_Python - 三大器 迭代器,生层器,装饰器

Python - 三大器 迭代器,生层器,装饰器 在介绍三大器之前先来了解一下容器和可迭代对象... 一. 容器 容器是一种把多个元素组织在一起的数据结构&#xff0c;容器中的元素可以逐个地迭代获取&#xff0c;可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所…

Spring三大器

Spring三大器 监听器listener Servlet的监听器Listener&#xff0c;它主要作用是随着web应用的启动而启动&#xff0c;只初始化一次&#xff0c;随着web的停止而销毁。 主要工作是&#xff1a;进行一些初始化的工作&#xff0c;例如参数或者固定一些固定对象 Spring boot框架自…

四大器

四大器 目录 一、迭代器 1.迭代协议2.一个简单的迭代器&#xff1a;3.迭代异常处理&#xff08;迭代完了&#xff0c;没有了,try&#xff09;二、生成器 yield与return的区别&#xff1a;三、装饰器 1.无参模板&#xff08;二层&#xff09;2.有参模板&#xff08;三层&#xf…

python三大,Python三大器

迭代器、天生器、装饰器 一、装饰器 1、函数工具&#xff1a;可以把函数名(不带括号)当成变量去用&#xff0c;关联的值是该函数的内存地址 2、闭包函数作用域函数嵌套函数工具 焦点点&#xff1a;内部函数传参的关系查找是以界说阶段为准 3、什么是闭包函数&#xff1f; 闭包是…

python三大器

迭代器 1.1、判断可迭代对象 from collections import Iterable # 判断对象是否是可迭代对象 result isinstance(X, Iterable) print("X是否是可迭代对象:", result) # >> X是否是可迭代对象: True1.2、自定义迭代器 自定义迭代器对象&#xff1a; 在类里面提…