首页 > 其他分享 >导出表代码

导出表代码

时间:2023-05-08 18:45:10浏览次数:30  
标签:printf 代码 pFileBuffer 导出 HEADER PIMAGE DWORD NULL

 

#include "stdafx.h"
#include<stdio.h>
#include<windows.h>
#include<malloc.h>

//////////////////////////////////////////////////////////////////
//FileBuffer函数
DWORD ReadPEFile(LPVOID* ppFileBuffer)
{
	FILE* pFile=NULL;
	DWORD SizeFileBuffer=0;
	pFile=fopen("C://Documents and Settings//ma_lic//桌面//RebPE.dll","rb");
	if(!pFile)
	{
		printf("打开notepad失败\n");
		return 0;
	}
	//获取文件大小
	fseek(pFile,0,SEEK_END);
	SizeFileBuffer=ftell(pFile);
	fseek(pFile,0,SEEK_SET);
	if(!SizeFileBuffer)
	{
		printf("读取文件大小失败\n");
		return 0;
	}
	//开辟空间
	*ppFileBuffer=malloc(SizeFileBuffer);
	if(!*ppFileBuffer)
	{
		printf("开辟空间失败\n");
		fclose(pFile);
		return 0;
	}
	//复制数据
	size_t n=fread(*ppFileBuffer,SizeFileBuffer,1,pFile);
	if(!n)
	{
		printf("复制数据失败\n");
		free(*ppFileBuffer);
		fclose(pFile);
		return 0;
	}
	fclose(pFile);
	return SizeFileBuffer;
}






DWORD RavToFoa(LPVOID pFileBuffer,DWORD Rav)
{
	PIMAGE_DOS_HEADER pDosHeader=NULL;
	PIMAGE_NT_HEADERS pNTHeader=NULL;
	PIMAGE_FILE_HEADER pFileHeader=NULL;
	PIMAGE_OPTIONAL_HEADER pOptionalHeader=NULL;
	PIMAGE_SECTION_HEADER pSectionHeader=NULL;
	PIMAGE_SECTION_HEADER NextSectionHeader=NULL;
	DWORD Foa=0;

	pDosHeader=(PIMAGE_DOS_HEADER)pFileBuffer;
	pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
	pFileHeader=(PIMAGE_FILE_HEADER)((DWORD)pNTHeader+4);
	pOptionalHeader=(PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader+20);
	pSectionHeader=(PIMAGE_SECTION_HEADER)((DWORD)pOptionalHeader+pFileHeader->SizeOfOptionalHeader);

	if(Rav<pOptionalHeader->SizeOfHeaders)
	{
		printf("Rav在Header里面\n");
		return Rav;
	}

	NextSectionHeader=pSectionHeader+1;
	for(int i=1;i<pFileHeader->NumberOfSections;i++,pSectionHeader++,NextSectionHeader++)
	{
		if(Rav>pSectionHeader->VirtualAddress && Rav<NextSectionHeader->VirtualAddress)
		{
			Foa=Rav-pSectionHeader->VirtualAddress+pSectionHeader->PointerToRawData;
			return Foa;
		}

	}
	//循环到最后一个节
	if(Rav>pSectionHeader->VirtualAddress && Rav<pOptionalHeader->SizeOfImage)
	{
		Foa=Rav-pSectionHeader->VirtualAddress+pSectionHeader->PointerToRawData;
		return Foa;
	}
	else
	{
		printf("Rav大于sizeofimage!!!\n");
		return 0;
	}



}


VOID PrintExport(LPVOID pFileBuffer)
{
	PIMAGE_DOS_HEADER pDosHeader=NULL;
	PIMAGE_NT_HEADERS pNTHeader=NULL;
	PIMAGE_FILE_HEADER pFileHeader=NULL;
	PIMAGE_OPTIONAL_HEADER pOptionalHeader=NULL;
	PIMAGE_SECTION_HEADER pSectionHeader=NULL;
	PIMAGE_DATA_DIRECTORY pDataDirHeader=NULL;
	PIMAGE_EXPORT_DIRECTORY pExportHeader=NULL;


	if(!pFileBuffer)
	{
		printf("FileBuffer函数调用失败\n");
	
	}
	printf("%x\n",pFileBuffer);
//判断是否是PE文件
	pDosHeader=(PIMAGE_DOS_HEADER)pFileBuffer;
	if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
		printf("不是有效的MZ标志\n");
	
	}

	pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
	if(pNTHeader->Signature!=IMAGE_NT_SIGNATURE)
	{
		printf("不是有效的PE标志\n");
	
	}

	pFileHeader=(PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
	
	pOptionalHeader=(PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader+20);

	pDataDirHeader=(PIMAGE_DATA_DIRECTORY)((DWORD)pOptionalHeader+0x60);
	printf("-----------------------------------------------------\n");
	printf("导出表\n");
	printf("virtualAddress=%x\n",pDataDirHeader->VirtualAddress);
	printf("size=%x\n",pDataDirHeader->Size);
	printf("-----------------------------------------------------\n");

	pExportHeader=(PIMAGE_EXPORT_DIRECTORY)(RavToFoa(pFileBuffer,(DWORD)pDataDirHeader->VirtualAddress)+(DWORD)pFileBuffer);
	printf("Characteristics=%x\n",pExportHeader->Characteristics);
	printf("TimeDateStamp=%x\n",pExportHeader->TimeDateStamp);
	printf("MajorVersion=%x\n",pExportHeader->MajorVersion);
	printf("Name=%x\n",pExportHeader->Name);
	printf("Base=%x\n",pExportHeader->Base);
	printf("NumberOfFunctions=%x\n",pExportHeader->NumberOfNames);
	printf("NumberOfNames=%x\n",pExportHeader->NumberOfNames);

	printf("--------------------------------------------------\n");
	printf("AddressOfFun\n");
	PDWORD pAddressOfFun=NULL;
	pAddressOfFun=(PDWORD)(RavToFoa(pFileBuffer,pExportHeader->AddressOfFunctions)+(DWORD)pFileBuffer);
	for(int i=0;i<pExportHeader->NumberOfFunctions;i++,pAddressOfFun++)
	{	
		printf("下标:%d, ",i);
		printf("函数地址:%x\n",*(PDWORD)pAddressOfFun);
	}
	printf("------------------------------------------------\n");
	printf("AddressOfNameOrdinals\n");
	PWORD pAddressOfNameOrdinal=NULL;
	pAddressOfNameOrdinal=(PWORD)(RavToFoa(pFileBuffer,(DWORD)pExportHeader->AddressOfNameOrdinals)+(DWORD)pFileBuffer);
	for(int j=0;j<pExportHeader->NumberOfNames;j++,pAddressOfNameOrdinal++)
	{	
		printf("下标:%d, , ",j);
		printf("序号%x\n",*(PWORD)pAddressOfNameOrdinal);
	}
	printf("------------------------------------------------\n");
	printf("AddressOfNames\n");
	PDWORD pAddressOfName=NULL;
	char* Name=NULL;
	pAddressOfName=(PDWORD)(RavToFoa(pFileBuffer,pExportHeader->AddressOfNames)+(DWORD)pFileBuffer);
	for(int k=0;k<pExportHeader->NumberOfNames;k++,pAddressOfName++)
	{
		Name=(char*)(RavToFoa(pFileBuffer,(DWORD)*pAddressOfName)+(DWORD)pFileBuffer);
		printf("下标:%d, , ",k);
		printf("函数名称=%s\n",Name);
	}

	

}

LPVOID GetFunAddressByOrdinal(LPVOID pFileBuffer)
{
	PIMAGE_DOS_HEADER pDosHeader=NULL;
	PIMAGE_NT_HEADERS pNTHeader=NULL;
	PIMAGE_FILE_HEADER pFileHeader=NULL;
	PIMAGE_OPTIONAL_HEADER pOptionalHeader=NULL;
	PIMAGE_SECTION_HEADER pSectionHeader=NULL;
	PIMAGE_DATA_DIRECTORY pDataDirHeader=NULL;
	PIMAGE_EXPORT_DIRECTORY pExportHeader=NULL;


	if(!pFileBuffer)
	{
		printf("FileBuffer函数调用失败\n");
	
	}
	printf("%x\n",pFileBuffer);
//判断是否是PE文件
	pDosHeader=(PIMAGE_DOS_HEADER)pFileBuffer;
	if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
		printf("不是有效的MZ标志\n");
	
	}

	pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
	if(pNTHeader->Signature!=IMAGE_NT_SIGNATURE)
	{
		printf("不是有效的PE标志\n");
	
	}

	pFileHeader=(PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
	
	pOptionalHeader=(PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader+20);

	pDataDirHeader=(PIMAGE_DATA_DIRECTORY)((DWORD)pOptionalHeader+0x60);

	pExportHeader=(PIMAGE_EXPORT_DIRECTORY)(RavToFoa(pFileBuffer,(DWORD)pDataDirHeader->VirtualAddress)+(DWORD)pFileBuffer);

	int num;
	printf("输入你要查询的序号\n");
	scanf("%d",&num);

	int Ordinal;
	Ordinal=num-pExportHeader->Base;
	PDWORD pAddressOfFun=NULL;
	pAddressOfFun=(PDWORD)(RavToFoa(pFileBuffer,pExportHeader->AddressOfFunctions)+(DWORD)pFileBuffer);
	for(int i=0;i<Ordinal;i++,pAddressOfFun++)
	{
		printf("%d\n",i);
	}
	printf("你要寻找的函数地址是=%x\n",*(PDWORD)pAddressOfFun);
	return (LPVOID)*(PDWORD)pAddressOfFun;
	


}



LPVOID GetAddressByName(LPVOID pFileBuffer,char* str)
{
	PIMAGE_DOS_HEADER pDosHeader=NULL;
	PIMAGE_NT_HEADERS pNTHeader=NULL;
	PIMAGE_FILE_HEADER pFileHeader=NULL;
	PIMAGE_OPTIONAL_HEADER pOptionalHeader=NULL;
	PIMAGE_SECTION_HEADER pSectionHeader=NULL;
	PIMAGE_DATA_DIRECTORY pDataDirHeader=NULL;
	PIMAGE_EXPORT_DIRECTORY pExportHeader=NULL;
	char* Name=NULL;


	if(!pFileBuffer)
	{
		printf("FileBuffer函数调用失败\n");
	
	}
	printf("%x\n",pFileBuffer);
//判断是否是PE文件
	pDosHeader=(PIMAGE_DOS_HEADER)pFileBuffer;
	if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
		printf("不是有效的MZ标志\n");
	
	}

	pNTHeader=(PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
	if(pNTHeader->Signature!=IMAGE_NT_SIGNATURE)
	{
		printf("不是有效的PE标志\n");
	
	}

	pFileHeader=(PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
	
	pOptionalHeader=(PIMAGE_OPTIONAL_HEADER)((DWORD)pFileHeader+20);

	pDataDirHeader=(PIMAGE_DATA_DIRECTORY)((DWORD)pOptionalHeader+0x60);

	pExportHeader=(PIMAGE_EXPORT_DIRECTORY)(RavToFoa(pFileBuffer,(DWORD)pDataDirHeader->VirtualAddress)+(DWORD)pFileBuffer);

	PDWORD pAddressOfName=NULL;

	pAddressOfName=(PDWORD)(RavToFoa(pFileBuffer,pExportHeader->AddressOfNames)+(DWORD)pFileBuffer);
	for(int k=0;k<pExportHeader->NumberOfNames;k++,pAddressOfName++)
	{
		Name=(char*)(RavToFoa(pFileBuffer,(DWORD)*pAddressOfName)+(DWORD)pFileBuffer);
		if(!strcmp(Name,str))
		{
			break;
		}			
	}
	int num=k;
	PWORD pAddressOfNameOrdinal=NULL;
	pAddressOfNameOrdinal=(PWORD)(RavToFoa(pFileBuffer,(DWORD)pExportHeader->AddressOfNameOrdinals)+(DWORD)pFileBuffer);
	for(int j=0;j<k;j++,pAddressOfNameOrdinal++)
	{	
		printf("下标:%d, , ",j);
	}
	WORD Ordinal=*(PWORD)pAddressOfNameOrdinal;

	PDWORD pAddressOfFun=NULL;
	pAddressOfFun=(PDWORD)(RavToFoa(pFileBuffer,pExportHeader->AddressOfFunctions)+(DWORD)pFileBuffer);
	for(int i=0;i<Ordinal;i++,pAddressOfFun++)
	{	
		printf("下标:%d, ",i);
	}
	printf("你要寻找的函数地址是=%x\n",*(PDWORD)pAddressOfFun);
	return (LPVOID)*(PDWORD)pAddressOfFun;


	


	

}




int main()
{
	LPVOID pFileBuffer=NULL;
	LPVOID* ppFileBuffer=&pFileBuffer;
	LPVOID pImageBuffer=NULL;
	LPVOID* ppImageBuffer=&pImageBuffer;
	DWORD SizeOfFileBuffer=0;
	DWORD SizeOfImageBuffer=0;
	DWORD SizeOfBuffer=0;

	LPVOID pBuffer=NULL;
	LPVOID* ppBuffer=&pBuffer;


	//调用filebuffer函数
	SizeOfFileBuffer=ReadPEFile(ppFileBuffer);
	if(!SizeOfFileBuffer)
	{
		printf("FileBuffer函数调用失败 \n");
		return 0;
	}
	pFileBuffer=*ppFileBuffer;

	PrintExport(pFileBuffer);

	GetAddressByName(pFileBuffer,"DumpFix");
	return 0;
}

  

标签:printf,代码,pFileBuffer,导出,HEADER,PIMAGE,DWORD,NULL
From: https://www.cnblogs.com/cspecialr/p/17382801.html

相关文章

  • P49导出表
    1、如何定位导出表:数据目录项的第一个结构,就是导出表. typedefstruct_IMAGE_DATA_DIRECTORY{DWORDVirtualAddress;DWORDSize;}IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;VirtualAddress导出表的RVASize导出表大小 2、导出表结构 ......
  • ArcEngine出图|相关代码
    ①数据源修复IMapDocumentmapDoc=newMapDocumentClass();mapDoc.Open(mxdPath);IDataSourceHelperMapDocumenthelpler=newDataSourceHelperClass();helpler.FindAndReplaceWorkspaceNamePath(mapDoc,oldpath,mdbPath,true);//oldpath为打开的mxd模板中加载的层的......
  • 新增节代码
    #include"stdafx.h"#include<stdio.h>#include<windows.h>#include<malloc.h>#defineShellCodeIen0x12#defineMessageBoxAdder0x77D507EABYTEShellCode[]={ 0x6A,00,0x6A,00,0x6A,00,0x6A,00, 0xE8,00,00,00,00, 0xE9,00,00......
  • 2023最新版——新手使用mybatis-plus 3.5.2并使用器代码生成器
    最新版——新手使用mybatis-plus3.5.2并使用器代码生成器第一步,pom文件引入依赖主要引入mybatis-plus和代码生成器需要使用的freemaker依赖<dependency> <groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</vers......
  • jsp 导出excel
    1.情景展示如上图所示,该页面上的表格统计内容,需要增加一个导出功能,即:将表格内容导出Excel当中。如何实现?2.具体分析2.1传统解决方案针对excel导出,有两种解决方式。思路一:前端导出如果仅仅是导出当前页数据的话,我们完全可以不与后台进行交互。因为现有数据已经拿到了,只......
  • JAVA快速开发框架 一键生成表单模板代码
    从计算机诞生开始,虽然编程的形式随着硬件及软件的不断进步而不停迭代,但是从事计算机技术行业的人员始终与编写代码的任务紧密联系在一起。因此如何提高软件开发的效率和质量,一直是软件工程领域的重要问题之一。这一方面是由于在不同软件开发过程中存在大量相似代码复用的情况,多次......
  • JAVA快速开发框架 一键生成表单模板代码
    从计算机诞生开始,虽然编程的形式随着硬件及软件的不断进步而不停迭代,但是从事计算机技术行业的人员始终与编写代码的任务紧密联系在一起。因此如何提高软件开发的效率和质量,一直是软件工程领域的重要问题之一。这一方面是由于在不同软件开发过程中存在大量相似代码复用的情况,多次编......
  • Python语言进行代码换行常用的方法详解!
    在编写Python代码时,有效换行可以让代码变得更加美观,那么Python中如何进行代码换行?Python中换行的方法有很多,本文为大家介绍两种比较常用的方法,快来看看吧。Python建议每行代码的长度不超过80个字符。对于过长的代码,建议进行换行。1、在该行代码末尾加上续行符“\”,即......
  • phpstorm导出导入设置
    导出设置到JAR文档要导出IDE设置到一个JAR文档在主菜单,选择File|ExportSettings在打开的ExportSettings对话框,指定要导出的设置项通过选择它们旁边的复选框。默认的,所有设置项都已选中。在Exportsettingsto文本框,为目标存档指定完全合适的名称。手动的输入路径或点击Browse......
  • 抽象工厂代码示例
    抽象工厂代码示例为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。产品族需要扩展的不适合抽象工厂,即在抽象工厂中在加一个createXXX();publicclassAbstractFactory{publicstaticvoidmain(String[]args){ComputerFactoryfactory......