打印文件夹中所有dll输出表中函数名称

今天逆向破解firefox浏览器中保存的账号及密码,因为firefox对账号的信息不断的提高安全性,所以之前破解中需要用到的一个导出函数不知被封装到那个dll中了,但firefox安装目录下又有许多的dll,一个一个的使用loadPe工具去查找太麻烦了,于是就编写了一个小程序去遍历文件夹下所有的dll的导出表中的函数名称并打印出来。

头文件:

#include <Windows.h>
#include <stdio.h>
#include <imagehlp.h>
#pragma comment(lib, "imagehlp.lib ")

实现函数:

void ShowExportFuncsInfo( char* szName )
{
	HANDLE hFile;
	HANDLE hMapping;
	LPVOID ImageBase;
	DWORD dwDataStartRVA;
	PIMAGE_DOS_HEADER  pDH;
	PIMAGE_NT_HEADERS pNtH= NULL;
	PIMAGE_OPTIONAL_HEADER pOH= NULL;
	PIMAGE_EXPORT_DIRECTORY pExportDir= NULL;
	PDWORD                  pdwRvas, pdwNames;
	PWORD                   pwOrds;
	UINT                    iNumOfName=0;
	char					*szFuncName;
	BOOL                    bIsByName=FALSE;;

	hFile=CreateFile(szName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,0);
	if (!hFile)
		return ;
	hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
	if(!hMapping)
	{
		CloseHandle(hFile);
		return ;
	}
	ImageBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
    if(!ImageBase)
	{
		CloseHandle(hMapping);
		CloseHandle(hFile);
		return ;
	}

	pDH=(PIMAGE_DOS_HEADER)ImageBase;
	if(pDH->e_magic!=IMAGE_DOS_SIGNATURE)
		return ;

    pNtH=(PIMAGE_NT_HEADERS32)((DWORD)pDH+pDH->e_lfanew);
    if (pNtH->Signature != IMAGE_NT_SIGNATURE )
        return ;

	pOH=&pNtH->OptionalHeader;
	if(!pOH)
		return ;
    dwDataStartRVA=pOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
	if(!dwDataStartRVA)
        return ;

	pExportDir=(PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa(pNtH,ImageBase,dwDataStartRVA, NULL);
	if(!pExportDir)
		return ;

	pwOrds    = (PWORD)ImageRvaToVa(pNtH,  ImageBase,pExportDir->AddressOfNameOrdinals, NULL);
	pdwRvas   = (PDWORD)ImageRvaToVa(pNtH, ImageBase,pExportDir->AddressOfFunctions, NULL);
	pdwNames  = (PDWORD)ImageRvaToVa(pNtH, ImageBase,pExportDir->AddressOfNames, NULL);

	iNumOfName=pExportDir->NumberOfNames;
	for(int i=0;i<pExportDir->NumberOfFunctions;i++)
	{
		if(*pdwRvas)
		{
			for(int j=0;j<iNumOfName;j++)
			{
				if(i==pwOrds[j])
				{
					bIsByName=TRUE;
					szFuncName=(char*)ImageRvaToVa(pNtH,ImageBase,pdwNames[j], NULL);
					break;
				}

				bIsByName=FALSE;
			}

			printf("%04lX\t%08lX\t%s\n", (UINT)(pExportDir->Base+i), (*pdwRvas), szFuncName);
		}
		++pdwRvas;
	}

	if(ImageBase)
		UnmapViewOfFile(ImageBase);

	if(hMapping)
		CloseHandle(hMapping);

	if(hFile)
		CloseHandle(hFile);

}

调用函数:

int main()
{
	WIN32_FIND_DATA FindData;
	HANDLE hFind;
	char FilePathName[MAX_PATH];
	char FullPathName[MAX_PATH];

	if (__argc !=2)
	{
		return 0;
	}

	strcpy(FilePathName, __argv[1]);
	strcat(FilePathName, "\\*.dll");
	hFind = FindFirstFile(FilePathName, &FindData);
	if (hFind == INVALID_HANDLE_VALUE)
	{
		return 0;
	}
	while(::FindNextFile(hFind, &FindData))
	{
		if (strcmp(FindData.cFileName, ".") == 0
			|| strcmp(FindData.cFileName, "..") == 0 )
		{
			continue;
		}

		if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			continue;
		}

		sprintf(FullPathName, "%s\\%s", __argv[1],FindData.cFileName);
		printf("\n%s\n", FullPathName);

		ShowExportFuncsInfo(FullPathName);
	}

	getchar();
	return 0;
}

打印文件夹中所有dll输出表中函数名称

时间: 2024-12-20 07:36:37

打印文件夹中所有dll输出表中函数名称的相关文章

用面向对象实现打印文件夹目录等相关操作

package com.study;/** * 用面向对象方法实现打印文件夹目录.输出每个文件和文件夹大小 * 计算此文件夹下共有多少个子文件夹和文件 */ import java.io.File; public class DirLength { private long len; private String path; private File src; public int getFileLength() { return fileLength; } public int getDirL

c#用NPOI将excel文件内容读取到datatable数据表中

将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable 1 /// <summary> 2 /// 将excel文件内容读取到DataTable数据表中 3 /// </summary> 4 /// <param name="fileName">文件完整路径名</param> 5 /// <param name=

时空表单函数名称

函数名称:CloseBill 类型:bill 中文类型:平台函数 中文名称:关闭表单 格式:CloseBill() 说明:相当于单据类的exitbill 函数名称:DelBill 类型:bill 中文类型:平台函数 中文名称:将beactive字段设置为'否' 格式:DelBill() 说明:根据表单中DsMain的设置得到相应的sql语句并执行    update 主表 set beactive='否' where 主键 = '主数据集主键字段的值' 函数名称:AddBill 类型:bill

将txt文件内容导入sql server 数据库表中

将类似这样的txt文件,如何导入到sql server 数据库表中呢? 第一步,在开始菜单中 找到 sql server 的导入和导出数据 然后,在数据源 的下拉框中 选择 平面文件源 基本都是点击 下一步 选择好要导入数据的数据库 与表: 编辑映射 : 点击下一步 执行 然后 完成 查看数据库 表 数据已经导入 成功

Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用

在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自动地生成一个空的__init__.py文件,因为是python新手,所以很不了解这个空文件的作用是什么,因为没有什么东西可写在这里,所以我直接把这个文件给删掉了,结果我的包图标自动变为文件夹图标了,这是怎么回事呢! 原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __ini

通过群晖 DSM 的 “装载远程文件夹(CIFS)” 功能来装载局域网中的 Win7 主机的指定文件或盘符

今天下午有空,就整理下电脑和 DSM 里的文件和资料,于是想把电脑里的几个盘 “映射” 到 DSM 的 File Station 中,以方便数据的搬移.这个 “映射” 就是通过 DSM 里 File Station 的 “装载远程文件夹” 来实现的,早在 DSM 版本还是 4.** 的时候就已经成功使用过,但不知道是因为没有把正确的操作回想起来还是 DSM 的操作变了,今天想用起来却一直不成功,上网各种搜索查询,费了一整个下午才搞成功.于是打算把这个设置过程记录下来,以仿今后为了相同的问题而重蹈

C语言-&gt;关于文件数据的录入和输出调用的函数总结

数据输入输出对象之间的关系图: 函数使用说明: 1.一个字符的输入\输出,对象是键盘(缓存和屏幕) 1.1.getchar(a),putchar(a); 1.2.scanf(“%d”,&i),printf(“%d”,i) 2. 一个变量的输入\输出,对象是键盘(缓存和屏幕) 2.1. gets(a),puts(a) 2.2.scanf(“%d %c %2f”,&i,&a,&b),printf(“%d %c %2f”,i,a,b) 3.一个字符的输入\输出,对象是文件(磁盘文

exe中嵌入dll和exe中释放dll

BinRes.h ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef _waxie_binary_resource_h_ #define _waxie_binary_resource_h_ #include <string> class BinRes  { public:     BinRes();     virtual ~BinRes(); public:     static void ExtractBinResour

EXCEL中如何获得工作表(sheet)的名称

1.  EXCEL中获得工作表(sheet)的名称: RIGHT(CELL("filename"),LEN(CELL("filename"))-FIND("]",CELL("filename"))) =MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,LEN(CELL("filename&