导出表编程-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(枚举导出表)相关推荐

  1. C Primer Plus 第五章 复习题编程练习 答案

    第五章 复习题&编程练习 复习题 1. 假设所有变量的类型都是int,下列各项变量的值是多少: 2. 假设所有变量的类型都是int,下列各项变量的值是多少: 3. 对下列各表达式求值: 4. ...

  2. WindowsPE 第五章 导出表

    导出表 PE中的导出表存在于动态链接库文件里.导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用. 5.1导出表的作用 代码重用机制提供了重用代码的动态链接库,它 ...

  3. Web前端开发精品课HTML CSS JavaScript基础教程第五章课后编程题答案

    编程题: 图5-15所示为一个问卷调查的网页,请制作出来.要求:大标题用h1标签:小题目用h3标签:前两个问题使用有序列表:最后一个问题使用无序列表. 用VS2013新建ASP.NET空网站,添加新项 ...

  4. 第五章面向对象编程设计与开发

    5.1 什么是面向对象的程序设计 面向过程的程序设计 优点:复杂的问题流程化,进而简单化 缺点:一套流水线或者流程就是用来解决一个问题,扩展性极差. 应用场景:面向过程的程序设计思想一般用于那些功能一 ...

  5. 沈阳师范大学大一上册C语言PTA题目集以及答案(第五章 函数 编程题篇)

    7-1 判断素数 (10分) 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 ​31 ​​ 的需要判断的正整数 ...

  6. C++ Primer Plus 自学第五章结尾编程10题

    第一题 要求:输入两个整数,计算输出两个整数之间的所有整数和. //5.1 #include<iostream> int main() {using namespace std;cout ...

  7. java 2 实用教程(第五版)第五章课后编程题:设计一个动物声音模拟器,希望模拟器可以模拟许多的动物的叫声。

    public abstract class Animal {        abstract void cry() ;        abstract String    getAnimalName( ...

  8. python第五章课后编程题答案_Python核心编程-第五章课后习题

    5-1 整形 讲讲 Python 普通整型和长整型的区别 答:在2.7版本基本淡化了区别.真要区分的话,普通整型是32位或者64位,而长整型只与PC内存有关,很大就是了 5-2 运算符 (a) 写一个 ...

  9. 程序设计基础(CC++) 戴波、张东祥 第五章 指针 编程作业

    1最大整数(25分) 题目内容: 输入3个整数,用指针指向最大整数并输出 输入格式: 输出格式: 输入样例: 1,2,3 输出样例: 3 参考代码 #include <stdio.h> i ...

最新文章

  1. 操作系统中进程并发运行的过程_三种电磁流量计运行过程中常见故障解决详情!...
  2. 谷歌取得量子计算突破:200秒完成经典计算机10000年计算任务
  3. python requests的作用_Python爬虫第一课:requests的使用
  4. rust(13)-闭包作为参数 trait泛型
  5. 【NLP】如何清理文本数据?
  6. 我正在运行哪个版本的PostgreSQL?
  7. Linux服务器时间校准
  8. 【我的Android进阶之旅】解决Jenkins编译出现的Gradle错误:Gradle build daemon disappeared unexpectedly
  9. lua工具库penlight--06数据(二)
  10. android坐标画图软件下载,地图坐标app下载-地图坐标软件下载v4.8.15 安卓版-西西软件下载...
  11. PHPStorm 常用设置
  12. leetcode回溯算法
  13. C++ Reference: Standard C++ Library reference: C Library: cmath: erfc
  14. 图的遍历之BSF广度优先算法6.2.2(网络整理)
  15. .mdf mysql数据库,sql server mdf 数据库文件导入 mysql
  16. Qt 5.15 在线安装
  17. MT6771/Helio P60芯片处理器资料介绍
  18. 用PhantomJS来给AJAX站点做SEO优化
  19. 磁盘不见了只剩一个c盘_无损分区后 磁盘分区不见了只剩一个系统分区怎么办?...
  20. 申宝证券-中证1000指数筑头

热门文章

  1. java8入门 错误:找不到或者无法加载主类
  2. 如何利用 JConsole观察分析Java程序的运行,进行排错调优
  3. vs2015上使用github进行版本控制
  4. Documentum中关于日期时间类型字段的特殊处理
  5. 买房猛于虎《功夫熊猫无家可归》
  6. 生活随笔[2005-06-08]
  7. R语言包在linux上的安装等知识
  8. codeforces1027D
  9. 大型三甲医院管理系统源码PACS超声科室源码DICOM影像工作站
  10. 零件库管理信息系统设计--part03:管理员登录部分设计