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(枚举导出表)的更多相关文章
- WindowsPE 第五章 导出表
导出表 PE中的导出表存在于动态链接库文件里.导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用. 5.1导出表的作用 代码重用机制提供了重用代码的动态链接库,它 ...
- #《Essential C++》读书笔记# 第五章 面向对象编程风格
基础知识 继承机制定义了父子(parent/child)关系.父类(parent)定义了所有子类(children)共通的共有接口(public interface)和私有实现(private imp ...
- 第五章 javascript编程可养成的好习惯
用户点击某个链接时弹出一个新窗口javascript使用window对象的open()方法来创建新的浏览器窗口,这个方法有三个参数:window.open(url,name,features)url: ...
- 《java编程思想》读书笔记(一)开篇&第五章(1)
2017 ---新篇章 今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...
- UNIX 网络编程第五章读书笔记
刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: #include <sys/socket.h> #incl ...
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- C#高级编程 (第六版) 学习 第五章:数组
第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...
- [书籍翻译] 《JavaScript并发编程》第五章 使用Web Workers
本文是我翻译<JavaScript Concurrency>书籍的第五章 使用Web Workers,该书主要以Promises.Generator.Web workers等技术来讲解Ja ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
随机推荐
- WIFI6 基本知识(二)
WI-FI6核心技术 WI-FI6除了继承了WI-FI5的所有MIMO特性之外,还增加了许多针对高密部署场景的特性.以下是WI-FI6的核心新特性: OFDMA频分复用技术 DL/UL MU-MIMO ...
- CF995E Number Clicker (双向BFS)
题目链接(洛谷) 题目大意 给定两个数 \(u\) , \(v\) .有三种操作: \(u=u+1(mod\) \(p)\) . \(u=u+p−1(mod\) \(p)\) . \(u=u^{p−2 ...
- 正则表达式如何直接在EXCEL中使用?
正则表达式,相信大家都不陌生.但在我们最常用的办公软件EXCEL中,目前没有可直接使用正则表达式的函数(至少10版本的EXCEL没有),那么今天我就分享下如何在EXCEL中自定义正则函数. 一.提需求 ...
- 【LeetCode】2020-04 每日一题
8. 字符串转换整数 (atoi)(中等) [分类]:模拟.正则表达式 [题解]: 解法1:直接模拟,但是在判断INT_MAX和INT_MIN上需要注意,因为直接判断会超出范围,所以可以将式子转换一下 ...
- 攻防世界 reverse secret-string-400
secret-string-400 school-ctf-winter-2015 解压文件得到html和js文件 Task.html <html> <head> <tit ...
- Android Studio中Switch控件有关 textOn 和 textOff 用法
•属性 textOn:控件打开时显示的文字 textOff:控件关闭时显示的文字 showText:设置是否显示开关上的文字(API 21及以上) •用法 <?xml version=" ...
- 面试题:Linux 中一个文件的 MAC 代表什么意思
查看文件状态 stat ls 命令能够查看文件的类型.时间.属主.属组,大小以及最近的修改时间等信息,但是还有一些文件的扩展属性,是使用 ls 命令无法查看到的 stat 命令则用于显示文件的详细属性 ...
- E. 【例题5】生日相同
解析 字符串操作,本题解采取了多关键词排序 Code #include <bits/stdc++.h> using namespace std; int f, n; struct node ...
- 【Azure Developer】Azure Graph SDK获取用户列表的问题: SDK中GraphServiceClient如何指向中国区的Endpoint:https://microsoftgraph.chinacloudapi.cn/v1.0
问题描述 想通过Java SDK的方式来获取Azure 门户中所列举的用户.一直报错无法正常调用接口,错误信息与AAD登录认证相关,提示tenant not found. 想要实现的目的,通过代码方式 ...
- mvel 配合正则表达式实现文本替换
mvel 依赖 <dependency> <groupId>org.mvel</groupId> <artifactId>mvel2</artif ...