调用自实现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.dllHMODULE 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.dllHMODULE 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;
}

相关文章:
调用自实现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_HEADE…...
Leetcode 191.位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中…...
安防监控视频平台EasyCVR视频汇聚平台调用接口出现跨域现象的问题解决方案
视频监控汇聚EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视…...
Python中的一些常用操作
文章目录 一. Python操作之-- 使用Python 提取PDF文件中的表格数据!二:三: Python中的 staticmethodclassmethod方法四: 反斜杠 \五: 终端的解释器提示符号修改六: python使用json.dumps输出中文七…...
go语言调用python脚本
文章目录 代码gopython 在 go语言中调用 python 程序,你可能会用到 代码 亲测 go 测试 go 文件 func TestR(t *testing.T) {// 设置要执行的Python脚本和参数scriptPath : "../nansen.py"arg1 : "nansen"// 执行Python脚本cmd : exec.Comm…...
2.3 【MySQL】命令行和配置文件中启动选项的区别
在命令行上指定的绝大部分启动选项都可以放到配置文件中,但是有一些选项是专门为命令行设计的,比方说defaults-extra-file 、 defaults-file 这样的选项本身就是为了指定配置文件路径的,再放在配置文件中使用就没啥意义了。 如果同一个启动选…...
外部库/lib/maven依赖项 三者关系
外部库(存放项目初始配置的jar包)(它的文件夹里并没有包含lib文件夹的引的外部的依赖的jar包) lib(存放外部导入到项目的依赖的jar包) maven依赖项(管理项目所有的jar包依赖) 三者存放jar包的关系 项目所依赖的全部的jar包 maven依赖项的jar包 外部库中的jar包 lib中的…...
在线制作作息时间表
时光荏苒,岁月如梭,人们描述时光易逝的句子,多如星河。 一寸光阴一寸金,寸金难买寸光阴。 人生就是一段时间而已,所以我明白了一个道理 人生之中最大的浪费就是时间的浪费 因此我想我们教给我们孩子重要的一课应该也是…...
他们朝我扔泥巴(scratch)
前言 纯~~~属~~~虚~~~构~~~(同学看完短视频要我做,蟹蟹你) 用scratch做的,幼稚得嘞( ̄_ ̄|||)呵呵(强颜欢笑) 完成视频 视频试了好久,就是传不上来,私信我加我…...
docker部署前端项目保姆级教程
本地启动docker(有不会启动的吗?下载docker(小海豚)双击起来就行) 准备阿里云账号(免费) 没有就去注册一个,记住密码后面要用到 官网地址:阿里云登录 - 欢迎登录阿里云…...
《C和指针》笔记13: static关键字总结
这里对static关键字做一下总结,可以回顾一下前面两篇博客的文章。 《C和指针》笔记11: external和internal链接属性 《C和指针》笔记12: 存储类型(自动变量、静态变量和寄存器变量) 当它用于函数定义时,或用于代码块之外的变量声…...
Docker harbor私有仓库部署与管理
一、搭建本地私有仓库二、Harbor私有仓库部署与管理1、Harbor概述2、Harbor的特性3、Harbor的核心组件3.1 Proxy3.2 Registry3.3 Core services3.3.1 UI(harbor-ui)3.3.2 WebHook3.3.3 Token 服务 3.4 Database(harbor-db)3.5 Log…...
解锁Selenium的力量:不仅仅是Web测试
Selenium简介 Selenium,作为Web应用测试的领军者,已经成为了无数开发者和测试人员的首选工具。它不仅仅是一个自动化测试工具,更是一个强大的Web应用交互框架。 Selenium的起源与发展 Selenium的历史可以追溯到2004年,由Jason Hu…...
[SQLITE_ERROR] SQL error or missing database (near “=“: syntax error)【已解决】
这个报的错误是语法错误,但是我并没有看出来这行代码有什么错。 通过排除掉下边两个问题解决的 从增加记录方法复制的下来的代码,只删除了关闭自动提交事务,但是connection.commit忘记删除executeQuery和executeUpdate方法的用法忘记了&…...
【视觉系统】笔芯内径机器视觉测量软硬件方案-康耐德智能
检测内容 笔芯内径机器视觉测量系统 检测要求 精度0.03mm,速度120~180个/分钟 视觉可行性分析 对样品进行了光学实验,并进行图像处理,原则上可以使用机器视觉系统进行测试测量。 结果: 对所有样品进行分析,可以在不…...
将文件夹的名称写到Excel中
查看文件夹名称 os.listdir()函数会返回指定路径下的所有文件和文件夹的名称列表,包括隐藏文件和文件夹 import osfolder_path . # 文件夹路径 # . is当前路径 files os.listdir(folder_path) # 获取文件夹内所有文件的名称列表for filename in files:print(fi…...
关于Vue CLI项目 运行发生了 less-lorder错误的解决方案
Module node found :Error: Can’t resolve ‘less-loader’ 报错 文章目录 Module node found :Error: Cant resolve less-loader 报错解决方案:安装 webpack 和 less安装 less-loader 问题: 在运行vue项目的时候发生: Module not found: Er…...
【Qt学习】02:信号和槽机制
信号和槽机制 OVERVIEW 信号和槽机制一、系统自带信号与槽二、自定义信号与槽1.基本使用student.cppteacher.cppwidget.cppmain.cpp 2.信号与槽重载student.cppteacher.cppwidget.cppmain.cpp 3.信号连接信号4.Lambda表达式5.信号与槽总结 信号槽机制是 Qt 框架引以为豪的机制之…...
软件工程(十三) 设计模式之结构型设计模式(一)
前面我们记录了创建型设计模式,知道了通过各种模式去创建和管理我们的对象。但是除了对象的创建,我们还有一些结构型的模式。 1、适配器模式(Adapter) 简要说明 将一个类的接口转换为用户希望得到的另一个接口。它使原本不相同的接口得以协同工作。 速记关键字 转换接…...
Node与Express后端架构:高性能的Web应用服务
在现代Web应用开发中,后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台,以及Express作为一个流行的Node.js框架,共同构建了高性能的Web应用服务。 在本文中,我们将深入探讨Node与Express后端架构…...
Qwen3-0.6B-FP8与STM32开发联动:生成嵌入式系统控制逻辑伪代码
Qwen3-0.6B-FP8与STM32开发联动:生成嵌入式系统控制逻辑伪代码 1. 引言 如果你是一位嵌入式开发者,或者正在学习STM32,下面这个场景你一定不陌生:拿到一个传感器模块,比如温湿度传感器,想用它来控制一个风…...
猫抓插件深度解析:浏览器资源嗅探的终极实战指南
猫抓插件深度解析:浏览器资源嗅探的终极实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓插件是一款功能强大的开源浏览器扩…...
5块钱的国产RISC-V芯片CH32V103能干啥?我用它复刻了一个STM32F103的小项目
5元国产RISC-V芯片实战:用CH32V103复刻STM32经典项目 在电子DIY领域,成本始终是创客们无法回避的现实问题。当我在某电商平台发现CH32V103这颗标价仅5元的RISC-V芯片时,第一反应是怀疑它的实用性——毕竟同级别的STM32F103C8T6价格通常在15-2…...
Python 3.14 JIT为何在ARM64上降频17%?源码级定位_pyltopt_arch.c中2个未对齐的寄存器分配bug(已提交CPython PR#12894)
第一章:Python 3.14 JIT编译器性能降频现象概览Python 3.14 引入的实验性 JIT 编译器(基于 Pyjion 与新式 AST 优化管道)在部分工作负载下表现出非预期的性能降频现象——即启用 JIT 后,某些计算密集型循环或 I/O 绑定协程的执行耗…...
实战避坑:在Windows上用C++/WinRT搞定双模蓝牙(EDR+Ble)通信的完整流程
实战避坑:在Windows上用C/WinRT搞定双模蓝牙(EDRBle)通信的完整流程 蓝牙技术在现代设备中无处不在,但对于开发者而言,实现Windows桌面应用与双模蓝牙设备(同时支持经典蓝牙EDR和低功耗蓝牙BLE)…...
3PEAK思瑞浦 TPT1051V-SO1R SOP8 CAN收发器
特性 符合IS011898标准支持CAN FD和最高达5 Mbps的数据速率典型环路延迟:110纳秒5V电源供应,3.0V~5.5VI0接口接收器共模输入电压:士30V总线故障保护:42VCAN网络最多支持110个节点结温范围从-40C到150C闩锁性能超过500mA总线引脚ESD保护:-8kV人体模型 -1.5kV充电设备…...
从《阵列天线分析与综合》到HFSS实战:手把手教你仿真4x1微带天线阵(含相位扫描设置)
从理论到实践:HFSS中4x1微带天线阵的建模与相位扫描全解析 微带天线阵列因其低剖面、易集成和成本优势,在现代通信系统中扮演着重要角色。对于刚接触天线设计的工程师和学生而言,如何将《阵列天线分析与综合》等经典教材中的理论概念转化为可…...
从Solid模块到轨迹规划:一个完整机械臂SimMechanics仿真项目的保姆级拆解
从Solid模块到轨迹规划:一个完整机械臂SimMechanics仿真项目的保姆级拆解 机械臂仿真一直是工业自动化和机器人研究中的核心课题。不同于传统Adams等专业仿真软件,SimMechanics凭借其与Matlab/Simulink的无缝集成,为工程师提供了从建模到控制…...
seo白帽优化会不会被搜索引擎识别和惩罚_网站使用seo白帽优化会有什么风险
SEO白帽优化会不会被搜索引擎识别和惩罚 在当今互联网时代,网站的流量和排名直接关系到企业的市场竞争力。作为提升网站排名的重要手段,SEO优化被广泛应用。其中,SEO白帽优化是最为推崇的一种方法。SEO白帽优化会不会被搜索引擎识别和惩罚呢…...
独立站页面结构优化的注意事项是什么_独立站 SEO 与品牌建设的关系是什么
独立站页面结构优化的注意事项是什么 在当今的数字化时代,独立站(独立网站)已经成为个人品牌和企业展示自我、推广产品和服务的重要平台。单凭一个美观的独立站,难以在竞争激烈的网络环境中脱颖而出。因此,独立站页面…...
