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

news2024/11/27 1:27:04

写文件如下

#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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

南京邮电大学《基于编译原理的表达式计算器》

文章目录 一、课题内容和要求二、课题需求分析1 过程分析2 设计分析 三、课题相关数据结构及算法设计1 主要数据结构2 主要算法流程3 词法分析4 语法分析5 中间代码生成6 LR语法分析程序6.1识别活前缀的DFA6.2 SLR(1)分析表6.3 分析过程 四、源程序代码1 源代码层次结构2.1 ana…

第十套教程序言:阻止对Sub和Functions的直接访问

【分享成果&#xff0c;随喜正能量】引擎利用后退的力量&#xff0c;引发更大的动能&#xff1b;空气经过压缩&#xff0c;更具爆破的威力。所谓"退一步想&#xff0c;海阔天空。"正可点破我们迷妄执着的盲点。。 《VBA高级应用30例》&#xff08;10178985&#xff0…

前端Excel导入数据后端数据库表未添加主键导致Excel导入数据重复

Java对Excel等文档解析上传到数据库或服务器问题记录 临时功能展示数据库表未添加主键导致Excel导入数据重复 如图,问题发现是因为Excel表中只有两千多条数据但导入数据库后却有五千多条,当时在代码中疯狂找原因也未果,最后尝试给数据库添加主键解决问题! 去除重复数据 总条…

渗透测试漏洞原理之---【CSRF跨站请求伪造】

文章目录 1、CSRF概述1.1、基本原理1.1.1、基本概念1.1.2、关键点1.1.3、目标 1.2、CSRF场景1.2.1、银行支付转账1.2.2构造虚假网站1.2.3、场景建模 1.3、CSRF类别1.3.1、POST方式 1.4、CSRF验证1.4.1、CSRF PoC Generator 2、CSRF攻防2.1、CSRF实战2.1.1、与XSS 漏洞相结合 2.…

构建简单的Node.js HTTP服务器,发布公网远程访问的快速方法

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

超实用的快递单号一键查询方法,帮你省时又省力

快递查询是我们日常生活中经常需要进行的操作&#xff0c;然而&#xff0c;当我们有多个快递单号需要查询时&#xff0c;逐个查询就显得非常繁琐和耗时。为了解决这个问题&#xff0c;今天给大家推荐一款实用的软件——【固乔快递查询助手】。 首先&#xff0c;在浏览器中搜索并…

单片机最小系统构成

51单片机最小系统构成 &#xff1a; 四部分组成 &#xff08;1&#xff09;晶振电路 &#xff08;2&#xff09;复位电路 &#xff08;3&#xff09;电源电路 &#xff08;4&#xff09;下载电路 &#xff08;1&#xff09;晶振电路干嘛的&#xff1f; 单片机需要 时钟 来…

day27 String类 正则表达式

String类的getBytes方法 String s "腻害"; byte[] bytes s.getBytes(StandardCharsets.UTF_8); String类的new String方法 String ss "ss我的"; byte[] gbks ss.getBytes("gbk"); String gbk new String(gbks, "gbk"); String类的…

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&…

bp利用CSRF漏洞(dvwa)

打开dvwa&#xff0c;将难度调为low&#xff0c;点击CSRF&#xff0c;打开后发现有一个修改密码的输入框&#xff1a; 在这里修改密码&#xff0c;并用bp抓包&#xff0c;在http history查看数据包&#xff0c;点击engagement tools中的Generate CSRF Poc根据请求包生成一个CSR…

checkstyle检查Java编程样式:工具类应该隐藏default或者public构造器

所谓工具类&#xff0c;就是在API中只有静态的方法或者属性。对工具类应该隐藏default或者public构造器&#xff0c;方法就是构造器的访问属性设为private的、或者protected&#xff08;如果希望有子类的话&#xff09;。 背后的原理&#xff1a;对工具类进行实例化没有意义。…

Redis数据类型(list\hash)

"we had our heads in the clouds" String类型 字符串类型是Redis最基础的数据类型&#xff0c;关于字符串需要特别注意的是: ● Redis中所有的键类型都是字符串类型.⽽且其他⼏种数据结构也都是在字符串类似基础上构建的&#xff0c;例如列表和集合的元素类型是字符…

社保先关事宜

个人账户实行完全积累制 在社保账户中&#xff0c;有“统筹账户”和“个人账户”&#xff0c;缴费基数均为当地上年度在岗职工平均工资&#xff0c;单位所缴费用相当于缴费基数的20%&#xff0c;进入社会统筹账户。个人所缴费用相当于缴费基数的8%&#xff0c;进入个人账户&am…

抖店总是有人给中差评怎么办?聊下抖店的运营,对你有帮助的!

我是王路飞。 做抖店的商家&#xff0c;最想要的就是店铺爆单以及客户给出好评了。 但是也只能是想想了&#xff0c;每个做抖店或者说做网店的&#xff0c;不可能没遇到过中差评&#xff0c;我们能做的就是尽量避免。 那么抖店总是有人给中差评怎么办呢&#xff1f; 给你们…

分布式锁之mysql实现

本地jvm锁 搭建本地卖票案例 package com.test.lockservice.service.impl;import com.test.lockservice.mapper.TicketMapper; import com.test.lockservice.service.TicketService; import org.springframework.beans.factory.annotation.Autowired; import org.springframew…

定时任务库的详解与魅力应用:探索schedule的无尽可能性

文章目录 摘要一些示例其他的示例向任务传递参数取消任务运行一次任务获取所有任务取消所有任务按标签获取多个任务以随机间隔运行作业运行一项作业&#xff0c;直到某个时间距离下次执行的时间立即运行所有作业&#xff0c;无论其计划如何在后台运行多个调度器 记录日志自定义…

海康机器人工业相机 Win10+Qt+Cmake 开发环境搭建

文章目录 一. Qt搭建海康机器人工业相机开发环境 一. Qt搭建海康机器人工业相机开发环境 参考这个链接安装好MVS客户端 Qt新建一个c项目 cmakeList中添加海康机器人的库&#xff0c;如下&#xff1a; cmake_minimum_required(VERSION 3.5)project(HIKRobotCameraTest LANG…

微信小程序隐私协议接入

自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后&#xff0c;方可调用微信提供的隐私接口。 相关公告见&#xff1a;关于小程序隐私保…

计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

格创校园跑腿小程序独立版v2.0.7+前端

应用介绍 格创校园跑腿SAAS管理系统小程序独立版v2.0.7前端 格创校园跑腿小程序系统独立版是一款基于ThinkPHP6框架开发的多校园专业跑腿平台&#xff0c;可应用至小区、街区、园区、厂区等。 格创校园跑腿小程序系统是校园创业版块热门应用&#xff0c;全新UI界面&#xff0c…