C语言编程获取PE文件导入函数

2023-11-06

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

DWORD RvaToOffset(PIMAGE_NT_HEADERS pImageNtHeaders, DWORD dwRva);


int _tmain(int argc, TCHAR *argv[])
{
	PIMAGE_DOS_HEADER pImageDOSHeader;
	PIMAGE_NT_HEADERS pImageNTHeader;
	PIMAGE_IMPORT_DESCRIPTOR pImageImportDescriptor;
	PIMAGE_IMPORT_BY_NAME pImageImportByName;
	DWORD dwCount;
	DWORD dwCount2;
	DWORD *Thunks;
	DWORD dwFileOffset;
	HANDLE hFile;
	HANDLE hMapObject;
	PUCHAR uFileMap;

	if(argc<2)
		return -1;
	if(!(hFile=CreateFile(argv[1],GENERIC_READ,0,NULL,OPEN_EXISTING,0,0)))
		return -1;
	if (!(hMapObject = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL)))
		return (-1);
	if (!(uFileMap = MapViewOfFile(hMapObject, FILE_MAP_READ, 0, 0, 0)))
		return (-1);
	pImageDOSHeader=(PIMAGE_DOS_HEADER)uFileMap;
	if(pImageDOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
		return -1;
	pImageNTHeader = (PIMAGE_NT_HEADERS)((PUCHAR)uFileMap + pImageDOSHeader->e_lfanew);
	if(pImageNTHeader->Signature != IMAGE_NT_SIGNATURE)
		return -1;
	if (!(pImageNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress))
	{
		printf("No import function!")
			return 0;
	}
	dwFileOffset = RvaToOffset(pImageNTHeader,pImageNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
	pImageImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((PUCHAR)uFileMap+dwFileOffset);
	dwCount = 0;
	while(pImageImportDescriptor[dwCount].FirstThunk)
	{
		printf("\nModule Name: %s\n\n",((PUCHAR)uFileMap+RvaToOffset(pImageNTHeader,pImageImportDescriptor[dwCount].Name)));
		Thunks = (DWORD *)((PUCHAR)uFileMap+RvaToOffset(pImageNTHeader,pImageImportDescriptor[dwCount].OriginalFirstThunk));
		dwCount2=0;
		while(Thunks[dwCount2])
		{
			pImageImportByName=(PIMAGE_IMPORT_BY_NAME)((PUCHAR)uFileMap+RvaToOffset(pImageNTHeader,Thunks[dwCount2]));
			printf("Name: %s\n",pImageImportByName->Name);
			dwCount2++;
		}
		dwCount++;
	}
	
	UnmapViewOfFile(uFileMap);
	CloseHandle(hMapObject);
	CloseHandle(hFile);
	return 0;
}

DWORD RvaToOffset(PIMAGE_NT_HEADERS pImageNtHeaders, DWORD dwRva)
{
	PIMAGE_SECTION_HEADER pImageSectionHeader;
	DWORD dwCount;
	DWORD dwFileOffset;
	pImageSectionHeader = IMAGE_FIRST_SECTION(pImageNtHeaders);
	dwFileOffset = dwRva;
	for (dwCount=0;dwCount<pImageNtHeaders->FileHeader.NumberOfSections;dwCount++)
	{
		if(dwRva>=pImageSectionHeader[dwCount].VirtualAddress && dwRva<(pImageSectionHeader[dwCount].VirtualAddress+pImageSectionHeader[dwCount].SizeOfRawData))
		{
			dwFileOffset-=pImageSectionHeader[dwCount].VirtualAddress;
			dwFileOffset+=pImageSectionHeader[dwCount].PointerToRawData;
			return dwFileOffset;
		}
	}

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言编程获取PE文件导入函数 的相关文章

  • 释放内存总结

    1 用new malloc显式分配在堆上的内存才需要用delete free释放 而在栈上分配的如int array 80 在子程序结束时自动释放 分配与释放都和数据类型无关 2 delete一个指针的时候 一定要检查是否为null 否则是
  • GDI和GDI+的应用场合思考

    GDI是微软公司的著名的二维图形引擎 GDI 则是微软公司为了提高显示效果而推出的一种新型图形引擎 下面我就我的一些使用经验阐述二者适用的应用场合 GDI基本能满足一般的绘图要求 我觉得GDI最令人诟病的是它画出来的线显示的锯齿实在比较厉害
  • VC++ HBITMAP保存文件

    请先看下面这段代码 BOOL SaveBmp HBITMAP bmp string path FILE f fopen path c str wb if f return 0 BITMAP bmpinfo GetObject bmp siz
  • 在Windows上使用clang编译器

    在Stackoverflow等网站上 经常出现各种编译器的对比的结果 其中clang是很常见的 那么 怎样在Windows上使用clang呢 没那么直观 直接去llvm官网上下载clang的发行包 解压 到bin下面 看到应该是我们想要的工
  • VC++ 获取文件版本号

    源码实现 pragma comment lib Version lib typedef struct VS VERSIONINFO WORD wLength WORD wValueLength WORD wType WCHAR szKey
  • 如何在VC++IDE 环境下生成.MAK文件

    转载自以下 同样只适用于EVC VC6 不适用于VS2003及以上 http blog csdn net lantian1099 article details 1833253 通过VC IDE 环境中的 TOOLS gt OPTIONS
  • c#使用钩子拦截鼠标键盘事件

    窗体本身带的键盘鼠标事件函数只能响应窗体自己的事件 窗体之外的事件是不会响应的 比如当窗体最小化的时候也响应就要用全局钩子拦截消息来处理了 大概过程就是在窗体初始化时加载钩子 等待事件消息 事件触发后调用响应函数处理 using Syste
  • VC6.0 MFC点击编辑框弹出对话框

    在写界面的用于触屏时 往往需要编辑框弹出盘来进行输入 下面就将我思路写一下吧 1 刚开始在网让找一些这方面的资料 结果在论坛中有发现这样一个帖子 见面的链接 http topic csdn net u 20100630 15 728f2d7
  • VC++ 制作滤镜效果(底片效果、雕刻效果、黑白效果)

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的请单独与我联系 滤镜是一种改变图像相貌的程序 其本身并不属于图像处理研究的范畴 滤镜程序的核心算法源自数字图像处理
  • VC++判断CheckBox控件是否被勾选

    图示为CheckBox控件 控件重映射为m timed send 控件默认状态为未勾选 0 状态 所以勾选时取反即可 代码如下 void CHCCOMDlg OnTimedSend TODO Add your control notific
  • 程序计算精确圆周率Pai的方法

    一些参考资料 http www guokr com blog 444081 大家都知道 3 1415926 无穷多位 历史上很多人都在计算这个数 一直认为是一个非常复杂的问题 现在有了电脑计算机 这个问题就简单了 最简单高效用Python
  • MFC视频教程(孙鑫)学习笔记2-掌握C++

    这一集中 主要总结了C 经典语法与应用 1 C 的三大特性 封装 继承 多态 2 C 中提供了一套输入输出流类的对象 它们是cin cout和cerr 对应c语言中的三个文件指针stdin stdout stderr 分别指向终端输入 终端
  • windows上bug崩溃定位分析(Qt或者VS)

    任何情况下 都不能保证自己写的代码不会发生崩溃 崩溃不可怕 可怕的是无法定位哪里崩溃 特别是客户那边崩溃 开发者这边不崩溃 问题陷入僵局 自从有了下面这个神奇的代码 再也不怕了 以下代码亲自测试没问题 1 如果是在VC 中 那么只需要将下列
  • VC编程获取MSN口令的代码

    MSN Messenger uses Windows Credential UI credui dll on WinXP 2003 Password Storage mechanism differs in these OSes so th
  • MFC窗口销毁过程

    MFC窗口销毁过程 考虑单窗口情况 假设自己通过new创建了一个窗口对象pWnd 然后pWnd gt Create 则销毁窗口的调用次序 1 手工调用pWnd gt DestroyWindow 2 DestroyWin
  • VC++中窗口过程函数及其消息发送、响应机制介绍

    在VC 中 窗口过程函数是应用程序定义的一个函数 主要功能是处理发送给窗口的消息 窗口过程函数的定义是 virtual LRESULT WindowProc UINT message WPARAM wParam LPARAM lParam
  • win7安装了vc++6.0打开已保存文件项目就会崩溃

    我用win7安装了vc 6 0的英文完整版 绿色中文版 发现当运行程序时 要打开已保存文件项目就会崩溃 系统对话筐就说 Microsoft R Developer Studio已停止工作 选择调试或者关闭 office 2010 与vc 6
  • VC++ FTP文件下传(断点续传)

    include
  • 如何编译火狐浏览器的源代码

    以下摘录于 http zhidao baidu com question 33214960 html 源代码编译安装Firefox linux下 http forums mozine cn index php showtopic 601 W
  • 源文件字符集,编译器内部字符集,执行字符集,控制台乱码问题,Qt中文问题

    源文件字符集 源文件本身也是文本文件 所以源文件字符集是指源文件保存时采用哪种字符集编码 VC 下源文件默认是gbk编码 如果想要更改 可以通过 文件 高级保存选项 修改某个源文件的编码方式 似乎没有什么选项能够设置创建项目时的源文件编码

随机推荐

  • C语言快速排序算法

    今天要分享的是快速排序 快速排序的原理 用一个flag记录数组里面的一个值 一般是第一个 定义left为第一个元素的下标 right为最后一个元素的下标 从最后一个元素开始与flag比较 如果比flag大 那就right 否则arr lef
  • ADS1_2,JLINK,GIVEIO的安装

    ADS1 2 JLINK GIVEIO的安装 1 ADS1 2 2 JLINK 3 GIVEIO 4 使用 1 ADS1 2 由于老师发的是1 2版本 在win10上太老旧 网上步骤很零碎 所以找到大佬的帖子 如何在win10 安装ADS1
  • failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED

    电脑cudn版本12 机器学习框架要求cudn版本11 最初因为提示缺少对应的文件 缺少cublas64 11 dll cublasLt64 11 dll等等文件 然后把对应的cublas64 12 dll cublasLt64 12 dl
  • torchtext默认安装版本太低的原因及解决

    本文使用conda管理包 如果你使用pip 需要手动改变一下指令 问题 最近安装torchtext 老是给我安装成0 6版本 这个史前版本很多函数接口都是老的 甚至文档都找不到了 使用的安装指令如下 导致失败的安装指令 conda inst
  • ICCV 2023

    导读 TL DR 本文提出了一种新的置换自注意力 PSA 用于图像超分辨率任务 可以在保持计算成本较低的同时 处理大窗口自注意力 并基于PSA构建了一个新的超分辨率网络 SRFormer 在各项基准测试中取得了最先进的性能 先简单介绍一下图
  • OpenAI时却提示“OpenAI‘s services are not available in your country”

    OpenAI的官网址如下 https openai com blog chatgpt 进入官网后点击下图中红框中的按钮 进入注册页面 上面这句提示的英文很简单 翻译过来 就是OpenAI不允许中国用户使用 那OpenAI允许哪些国家的用户使
  • 用C语言求平均数的四种方法

    1 常规操作 两个数的平均数等于两数之和除以二 int main int a 10 int b 5 int c a b printf d n c system pause return 0 这种方法有一定的缺陷 当a或b的值够大时 以至于超
  • vim编辑器格式化代码

    他丫儿的搞啥子嘛 乱七八糟的 在vim中其实也有像Eclipse中的ctrl shift F 的自动格式化代码的操作 尽管非常强大 但是通常会破坏代码的原有的缩进 所以不建议在python这样缩进代替括号的语言中和源程序已经缩进过的代码中使
  • rabbitMQ 概念及特点

    Solr rabbitMQ rabbitMQ 特点 可靠性 Reliability RabbitMQ 使用一些机制来保证可靠性 如持久化 传输确认 发布确认 灵活的路由 Flexible Routing 在消息进入队列之前 通过 Excha
  • 【ONNX】使用 C++ 调用 ONNX 格式的 PyTorch 深度学习模型进行预测(Windows, C++, PyTorch, ONNX, Visual Studio, OpenCV)

    文章目录 1 安装依赖 2 导出 ONNX 格式的 PyTorch 模型 3 安装 Windows 平台 OpenCV 4 C 下 OpenCV 接口调用 ONNX 模型 1 安装依赖 要使用 ONNX 模型进行预测 就需要使用 onnx
  • C# 当前不会命中断点(调试时不能进入断点)

    相信大家都会遇到这个问题的 而且在我的项目经验中 发生主这个问题的原因特别多 本文把我遇到过的情况都记录下 供大家参考 1 运行调试时模式不对 应该选Debug才能进入断点 如果选择Release是不能的 注意项目属性里的配置也选择成Deb
  • java的背景

    要想学好一门语言 首先得了解这门语言的有什么用 优缺点是什么 才能更好的理解运用 所以 我在此介绍java的基础简介 1 java是以javaee后台开发 java web前台界面构成的体系结构 2 java的优点有 java的平台无关性
  • 用java实现打印功能

    用java实现打印 java awt中提供了一些打印的API 要实现打印 首先要获得打印对象 然后继承Printable实现接口方法print 以便打印机进行打印 最后用用Graphics2D直接输出直接输出 下面代码实现了简单的打印功能
  • android自动点击的实现流程记录

    一个android下自动点击触屏的程序 类似于windows下的按键精灵 自动帮我玩捕鱼达人 目标 用户可以通过配置脚本文件 自定义一系列的操作 例如 点击 长按 拖动 延时 颜色判断 循环 然后用音量 键启动 关闭脚本 思路 1 linu
  • PSO粒子群算法优化BP神经网络(PSO-BPNN)回归预测MATLAB代码

    PSO粒子群算法优化BP神经网络 PSO BPNN 回归预测MATLAB代码 有优化前后的对比 代码注释清楚 main为运行主程序 可以读取本地EXCEL数据 也可以加载本地数据 mat 使用换自己数据集 很方便 容易上手 以电厂运行数据为
  • 网页版音频播放器,歌词随音乐而动

    制作不易 多多支持 谢谢 我的博客里面还有关于视频播放器的 感兴趣的小伙伴可以来看看 这个是效果图 这是利用audio做的一个歌词随音乐而动的html页面 这个简单的音频播放器是用ajax请求本地服务器的lrc文件 lrc文件就是歌词文件
  • Visual Studio 2019 安装并创建运行C++项目

    Visual Studio 2019 安装并创建运行C 项目 一 安装Visual Studio 2019 在官网下载社区版本的VS2019 https visualstudio microsoft com zh hans rr https
  • LeetCode(力扣)63. 不同路径 IIPython

    LeetCode63 不同路径 II 题目链接 代码 题目链接 https leetcode cn problems unique paths ii 代码 class Solution def uniquePathsWithObstacle
  • 2017-2018-1 20155319 《信息安全系统设计基础》第4周学习总结

    2017 2018 1 20155319 信息安全系统设计基础 第4周学习总结 课堂实践内容 1 参考教材第十章内容 2 用Linux IO相关系统调用编写myod c 用myod XXX实现Linux下od tx tc XXX的功能 注意
  • C语言编程获取PE文件导入函数

    include