WindowsPE 第五章 导出表编程-1(枚举导出表)
导出表编程-1-枚举导出表
开始前先回忆一下导出表:
1.枚举dll函数的导出函数名字:
思路:
(1)加载dll到内存里。
(2)获取PE头,逐步找到可选头部。
(3)然后找到里面的第一个结构(导出表)地址,这个地址指向一个IMAGE_EXPORT_DIRECTORY,然后找到里面的
这个地址是一个数组(DWORD),每个值都指向一个导出函数的名字字符串所在地址,然后根据
确定个数,直接枚举就行了。
代码如下:
#include "stdafx.h"
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <tchar.h>
#include <imagehlp.h>
#include <vector>
#include <iostream>
#include <string>
using namespace std;typedef PVOID (CALLBACK* PFNEXPORTFUNC)(PIMAGE_NT_HEADERS,PVOID,ULONG,PIMAGE_SECTION_HEADER*);BOOL printAllFuncName(WCHAR* wcFileName ,vector<string> &vcFuncName){vcFuncName.clear();LPWIN32_FIND_DATA lpwfd_first=new WIN32_FIND_DATA;//接受findfirstfile的结构指针HANDLE hFile,hFileMap;//文件句柄和内存映射文件句柄DWORD fileAttrib=0;//存储文件属性用,在createfile中用到。void* mod_base;//内存映射文件的起始地址,也是模块的起始地址PFNEXPORTFUNC ImageRvaToVax=NULL;HMODULE hModule=::LoadLibrary(L"DbgHelp.dll");if(hModule!=NULL){ImageRvaToVax=(PFNEXPORTFUNC)::GetProcAddress(hModule,"ImageRvaToVa");if(ImageRvaToVax==NULL){::FreeLibrary(hModule);//printf("取得函数失败\n");return FALSE; } }else{//printf("加载模块失败\n");return FALSE;}if(FindFirstFile(wcFileName,lpwfd_first)==NULL){//返回值为NULL,则文件不存在,退出//printf("文件不存在: %s ",wcFileName);return FALSE;}else{DWORD fileAttrib=lpwfd_first->dwFileAttributes;}hFile=CreateFile(wcFileName,GENERIC_READ,0,0,OPEN_EXISTING,fileAttrib,0);if(hFile==INVALID_HANDLE_VALUE){//printf("打开文件出错!");return FALSE; }hFileMap=CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);if(hFileMap==NULL){CloseHandle(hFile);//printf("建立内存映射文件出错!");return FALSE;}mod_base=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);if (mod_base==NULL){//printf("建立内存映射文件出错!");CloseHandle(hFileMap);CloseHandle(hFile);return FALSE;}IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)mod_base;IMAGE_NT_HEADERS * pNtHeader =(IMAGE_NT_HEADERS *)((BYTE*)mod_base+ pDosHeader->e_lfanew);//得到NT头首址IMAGE_OPTIONAL_HEADER * pOptHeader =(IMAGE_OPTIONAL_HEADER *)((BYTE*)mod_base + pDosHeader->e_lfanew + 24);//optional头首址IMAGE_EXPORT_DIRECTORY* pExportDesc = (IMAGE_EXPORT_DIRECTORY*)ImageRvaToVax(pNtHeader,mod_base,pOptHeader->DataDirectory[0].VirtualAddress,0);//导出表首址PDWORD nameAddr=(PDWORD)ImageRvaToVax(pNtHeader,mod_base,pExportDesc->AddressOfNames,0);//函数名称表首地址每个DWORD代表一个函数名字字符串的地址PCHAR func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[0],0);DWORD i=0;DWORD unti=pExportDesc->NumberOfNames;for(i=0;i<unti;i++){func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[i],0);//printf("%s\n",func_name);vcFuncName.push_back(string(func_name));}::FreeLibrary(hModule);CloseHandle(hFileMap);CloseHandle(hFile);return TRUE;
}int main(int argc, char* argv[]){vector<string>vcFuncName;printAllFuncName(L"C:\\A.dll" ,vcFuncName);for(vector<string>::iterator it = vcFuncName.begin(); it != vcFuncName.end();it++){ cout<<*(it)<<endl; } getchar();return 0;
}
下面两个不去实现了,和上面的差不多。
2.根据编号查找函数地址
3.根据名字查找函数地址
WindowsPE 第五章 导出表编程-1(枚举导出表)相关推荐
- C Primer Plus 第五章 复习题编程练习 答案
第五章 复习题&编程练习 复习题 1. 假设所有变量的类型都是int,下列各项变量的值是多少: 2. 假设所有变量的类型都是int,下列各项变量的值是多少: 3. 对下列各表达式求值: 4. ...
- WindowsPE 第五章 导出表
导出表 PE中的导出表存在于动态链接库文件里.导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用. 5.1导出表的作用 代码重用机制提供了重用代码的动态链接库,它 ...
- Web前端开发精品课HTML CSS JavaScript基础教程第五章课后编程题答案
编程题: 图5-15所示为一个问卷调查的网页,请制作出来.要求:大标题用h1标签:小题目用h3标签:前两个问题使用有序列表:最后一个问题使用无序列表. 用VS2013新建ASP.NET空网站,添加新项 ...
- 第五章面向对象编程设计与开发
5.1 什么是面向对象的程序设计 面向过程的程序设计 优点:复杂的问题流程化,进而简单化 缺点:一套流水线或者流程就是用来解决一个问题,扩展性极差. 应用场景:面向过程的程序设计思想一般用于那些功能一 ...
- 沈阳师范大学大一上册C语言PTA题目集以及答案(第五章 函数 编程题篇)
7-1 判断素数 (10分) 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 31 的需要判断的正整数 ...
- C++ Primer Plus 自学第五章结尾编程10题
第一题 要求:输入两个整数,计算输出两个整数之间的所有整数和. //5.1 #include<iostream> int main() {using namespace std;cout ...
- java 2 实用教程(第五版)第五章课后编程题:设计一个动物声音模拟器,希望模拟器可以模拟许多的动物的叫声。
public abstract class Animal { abstract void cry() ; abstract String getAnimalName( ...
- python第五章课后编程题答案_Python核心编程-第五章课后习题
5-1 整形 讲讲 Python 普通整型和长整型的区别 答:在2.7版本基本淡化了区别.真要区分的话,普通整型是32位或者64位,而长整型只与PC内存有关,很大就是了 5-2 运算符 (a) 写一个 ...
- 程序设计基础(CC++) 戴波、张东祥 第五章 指针 编程作业
1最大整数(25分) 题目内容: 输入3个整数,用指针指向最大整数并输出 输入格式: 输出格式: 输入样例: 1,2,3 输出样例: 3 参考代码 #include <stdio.h> i ...
最新文章
- 操作系统中进程并发运行的过程_三种电磁流量计运行过程中常见故障解决详情!...
- 谷歌取得量子计算突破:200秒完成经典计算机10000年计算任务
- python requests的作用_Python爬虫第一课:requests的使用
- rust(13)-闭包作为参数 trait泛型
- 【NLP】如何清理文本数据?
- 我正在运行哪个版本的PostgreSQL?
- Linux服务器时间校准
- 【我的Android进阶之旅】解决Jenkins编译出现的Gradle错误:Gradle build daemon disappeared unexpectedly
- lua工具库penlight--06数据(二)
- android坐标画图软件下载,地图坐标app下载-地图坐标软件下载v4.8.15 安卓版-西西软件下载...
- PHPStorm 常用设置
- leetcode回溯算法
- C++ Reference: Standard C++ Library reference: C Library: cmath: erfc
- 图的遍历之BSF广度优先算法6.2.2(网络整理)
- .mdf mysql数据库,sql server mdf 数据库文件导入 mysql
- Qt 5.15 在线安装
- MT6771/Helio P60芯片处理器资料介绍
- 用PhantomJS来给AJAX站点做SEO优化
- 磁盘不见了只剩一个c盘_无损分区后 磁盘分区不见了只剩一个系统分区怎么办?...
- 申宝证券-中证1000指数筑头