调用自实现MyGetProcAddress获得CreateFileA函数并调用创建写入文件

写文件如下

#include <iostream>
#include <Windows.h>

typedef HANDLE(WINAPI* CreateFileAFunc)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);

DWORD MyGetProcAddress(
	_In_ HMODULE hModule,
	_In_ LPCSTR lpProcName
)

{
	PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;
	PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头
	PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)

	PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pIMAGE_EXPORT_DIRECTORYRVA + (DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的

	DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;
	//可以看到底下地址都需要写成指针形式
	DWORD* pAddressOfFunction = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions + (DWORD)hModule);
	//printf("%s", ModuleName);
	DWORD* NameAddress = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNames + (DWORD)hModule);
	WORD* pAddressOfNameOrdinals = (WORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals + (DWORD)hModule);



	for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++)
	{
		DWORD FunNameRVA = NameAddress[i];
		char* FunName = (char*)(FunNameRVA + (DWORD)hModule);
		if (strcmp(lpProcName, FunName) == 0)
		{
			return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);
		}
		printf("%s\n", FunName);
	}
	printf("%s\n", ModuleName);
	return NULL;
}
int main()
{
    std::cout << "Hello World!\n";
    // 加载 Kernel32.dll
    HMODULE hModule = LoadLibraryA("Kernel32.dll");
    if (hModule == NULL) {
        printf("Failed to load Kernel32.dll\n");
        return 1;
    }

    // 获取 CreateFileA 函数地址
    DWORD p1 = MyGetProcAddress(hModule, "CreateFileA");
    if (p1 == 0) {
        printf("Failed to get address of CreateFileA\n");
        return 1;
    }

    // 创建函数指针
    CreateFileAFunc pCreateFileA = (CreateFileAFunc)p1;




    DWORD dwBytesWritten;
    const char* lpFileName = "E:\\myfile.txt";
    const char* lpData = "Hello, World!";
    DWORD dwDataSize = strlen(lpData);
    // 调用 CreateFileA 函数

    HANDLE hFile = pCreateFileA(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE) {
        // 写入文件内容
        if (WriteFile(hFile, lpData, dwDataSize, &dwBytesWritten, NULL)) {
            printf("文件写入成功!\n");
        }
        else {
            printf("写入文件时发生错误!\n");
        }
        // 关闭文件句柄
        CloseHandle(hFile);
    }
    else
    {
        printf("创建文件时发生错误!\n");
    }


    return 0;
}

在这里插入图片描述
读文件如下

#include <iostream>
#include <Windows.h>

typedef HANDLE(WINAPI* CreateFileAFunc)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);

DWORD MyGetProcAddress(
	_In_ HMODULE hModule,
	_In_ LPCSTR lpProcName
)

{
	PIMAGE_DOS_HEADER pIMAGE_DOS_HEADER = (PIMAGE_DOS_HEADER)hModule;
	PIMAGE_NT_HEADERS pIMAGE_NT_HEADERS = (PIMAGE_NT_HEADERS)(pIMAGE_DOS_HEADER->e_lfanew + (DWORD)hModule);   //NT头
	PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORYRVA = (PIMAGE_EXPORT_DIRECTORY)(pIMAGE_NT_HEADERS->OptionalHeader.DataDirectory[0].VirtualAddress);  //导出表项,获得RVA  RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)

	PIMAGE_EXPORT_DIRECTORY pIMAGE_EXPORT_DIRECTORY = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pIMAGE_EXPORT_DIRECTORYRVA + (DWORD)hModule);  //这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的

	DWORD ModuleName = pIMAGE_EXPORT_DIRECTORY->Name + (DWORD)hModule;
	//可以看到底下地址都需要写成指针形式
	DWORD* pAddressOfFunction = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfFunctions + (DWORD)hModule);
	//printf("%s", ModuleName);
	DWORD* NameAddress = (DWORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNames + (DWORD)hModule);
	WORD* pAddressOfNameOrdinals = (WORD*)(pIMAGE_EXPORT_DIRECTORY->AddressOfNameOrdinals + (DWORD)hModule);



	for (size_t i = 0; i < pIMAGE_EXPORT_DIRECTORY->NumberOfNames; i++)
	{
		DWORD FunNameRVA = NameAddress[i];
		char* FunName = (char*)(FunNameRVA + (DWORD)hModule);
		if (strcmp(lpProcName, FunName) == 0)
		{
			return (pAddressOfFunction[pAddressOfNameOrdinals[i]] + (DWORD)hModule);
		}
		printf("%s\n", FunName);
	}
	printf("%s\n", ModuleName);
	return NULL;
}
int main()
{
    std::cout << "Hello World!\n";
    // 加载 Kernel32.dll
    HMODULE hModule = LoadLibraryA("Kernel32.dll");
    if (hModule == NULL) {
        printf("Failed to load Kernel32.dll\n");
        return 1;
    }

    // 获取 CreateFileA 函数地址
    DWORD p1 = MyGetProcAddress(hModule, "CreateFileA");
    if (p1 == 0) {
        printf("Failed to get address of CreateFileA\n");
        return 1;
    }

    // 创建函数指针
    CreateFileAFunc pCreateFileA = (CreateFileAFunc)p1;





    DWORD dwBytesRead;
    const char* lpFileName = "E:\\myfile.txt";
    const int BUFFER_SIZE = 1024;
    char buffer[BUFFER_SIZE];
    // 调用 CreateFileA 函数

    HANDLE hFile = pCreateFileA(lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE) {
        // 读取文件内容
        if (ReadFile(hFile, buffer, BUFFER_SIZE - 1, &dwBytesRead, NULL)) {
            buffer[dwBytesRead] = '\0';  // 添加字符串结束符
            printf("文件内容:\n%s\n", buffer);
        }
        else {
            printf("写入文件时发生错误!\n");
        }
        // 关闭文件句柄
        CloseHandle(hFile);
    }
    else
    {
        printf("创建文件时发生错误!\n");
    }


    return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业选择视频宣传片有什么好处

企业选择视频宣传片作为宣传工具有许多好处&#xff0c;视频宣传片能够通过故事情节和情感表达来打动观众的心弦。一个精心制作的宣传片能够讲述一个引人入胜的故事&#xff0c;激发观众的情感共鸣&#xff0c;从而增强品牌或产品的认知度和好感度。由深圳企业视频宣传片制作公…

开源软件的国际化和本地化

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

安卓webview,网页端生成安卓项目(极速生成)教程

安卓webview&#xff0c;网页端生成安卓项目&#xff08;极速生成&#xff09;教程 一&#xff0c;前言 当自己做了一个PC端的页面&#xff0c;也就是前端的页面&#xff0c;或者已经上服的页面&#xff0c;但也想生成一个安卓端供用户使用&#xff0c;本教程详细讲解如何把前…

ASUS华硕天选4笔记本电脑FA507XV原厂Windows11系统22H2

天选四FA507X原装系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件 华硕电脑管家、奥创控制中心等预装程序&#xff0c;恢复出厂状态W11 链接&#xff1a;https://pan.baidu.com/s/1SPoFW7wR5KawGu-yMckNzg?pwdayxd 提取码&#xff1a;ayxd

checkstyle检查Java编码样式:源文件和文本文件末尾要有一个空行

背后的原理&#xff1a; 源文件和文本文件末尾应该有一个行分隔符&#xff0c;以便于他人在后面增加新的内容&#xff0c;而“diff”命令不会将前面的行作为改动过来显示。 https://checkstyle.sourceforge.io/checks/misc/newlineatendoffile.html#NewlineAtEndOfFile 例如&a…

golang-bufio 缓冲读

缓冲 IO 计算机中我们常听到这样的两种程序优化方式&#xff1a; 以时间换空间以空间换时间 今天要来看的缓冲IO就是典型的以空间换时间&#xff0c;它的基本原理见上图。简单的解释就是&#xff1a;程序不再直接去读取底层的数据源&#xff0c;而是通过一个缓冲区来进行读取…

python scrapy框架

scrapy概述 Scrapy&#xff0c;Python开发的一个快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛&#xff0c;可以用于数据挖掘、监测和自动化测试 scrapy安装 pip install scrapy -i https://pypi.tuna.tsinghua…

探索数据湖中的巨兽:Apache Hive分布式SQL计算平台浅度剖析!

文章目录 ◆ Apache Hive 概述1.1 分布式SQL计算1.2 Hive的优势 ◆ 模拟实现Hive功能2.1 元数据管理2.2 解析器2.3 基础架构2.4 Hive架构 ◆ Hive基础架构3.1 Hive架构图3.2 Hive组件3.2.1 元数据存储3.2.2 Driver驱动程序3.2.3 用户接口 ◆ Hive部署4.1 VMware虚拟机部署步骤一…

基于微信小程序的文化宣传平台的设计与实现(Java+spring boot+微信小程序+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的文化宣传平台的设计与实现&#xff08;Javaspring boot微信小程序MySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java…

Qt之进程通信-IPC(QLocalServer,QLocalSocket 含源码+注释)

文章目录 一、IPC通信示例图1.1 设置关键字并连接的示例图1.2 进程间简单的数据通信示例图1.3 断开连接的示例图1.3.1 由Server主动断开连接1.3.2 由Socket主动断开连接 1.4 Server停止监听后的效果二、个人理解与一些心得三、一些疑问&#xff08;求教 家人们&#x1f602;&am…

算法设计 || 第6题:基于最小成本检索的分支界限算法求解15谜问题

用基于最小成本检索的分支界限算法求解15谜问题 要求利用成本估计函数C^(X)&#xff0c; C^(X)为节点x排列中不在其目标位置上的牌的总张数&#xff08;不包括空格牌&#xff09;。 现定义空格牌的上下左右四种活动&#xff0c; 按四种活动分别生成其状态空间树&#xff0c;…

Node.js @zurmokeeper/exceljs 如何快速导出多表头的excel文件

Node.js 如何快速导出嵌套列&#xff08;多表头&#xff09;的excel文件。效果图如下&#xff1a; 1&#xff1a;使用 zurmokeeper/exceljs&#xff0c; V4.4.1以上 安装&#xff1a; npm i zurmokeeper/exceljs 2: 有一个 worksheet.makeColumns 方法&#xff0c;API文档&am…

​LeetCode解法汇总57. 插入区间

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个 …

指针进阶详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.字符指针 2.指针数组 3.数组指针 4.数组传…

Mysql--技术文档--B树-数据结构的认知

阿丹解读&#xff1a; B树&#xff08;B tree&#xff09;和B树&#xff08;B-tree&#xff09;都是常见的自平衡搜索树数据结构&#xff0c;用于在存储和检索大量数据时提供高效的操作。 基本概念-B树/B树 B树&#xff08;B-tree&#xff09;和B树&#xff08;B tree&#x…

【如何对公司网络进行限速?一个案例详解】

有不少朋友问到了关于企业网络QoS配置&#xff0c;这个确实在实际网络应用中非常多&#xff0c;基本上大部分企业或个人都用到这个功能&#xff0c;本期我们详细了解下QoS如何对宽带进行限制&#xff0c;QoS如何企业中应用。 一、什么是QoS? Qos是用来解决网络延迟和阻塞等问…

基于Java swing和mysql实现学生信息管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于Java swing和mysql实现学生信息管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过…

【日常积累】Linux下ftp服务安装

概述 FTP是一种在互联网中进行文件传输的协议&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21号端口&#xff0c;其中端口20用于进行数据传输&#xff0c;端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中&#xff0c;具有容易搭建、方…

供应链 | 大数据报童模型:基于机器学习的实践见解

论文解读&#xff1a;李欣 马玺渊 作者&#xff1a;Gah-Yi Ban, Cynthia Rudin 引用&#xff1a;Ban, Gah-Yi and Cynthia Rudin. The big data newsvendor: Practical insights from machine learning. Operations Research 67.1 (2019): 90-108. 文章链接&#xff1a;https…

Visual Studio软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Visual Studio是微软公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于Windows平台上的应用程序和Web应用程序的开发。以下是Visual Studio软件的主要特点和功能&#xff1a; 集成开发环境&#x…