RVA转FOA【滴水逆向三期43作业】

在这一章中我们给出RVA转FOA程序的源代码:
代码我们就不一一解释了,自己看懂或者是自己编写出来会有更深的理解

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "Function.h"
int main(int argc, char** argv) {
	char* File_Buffer;
	char* Image_Buffer;
	//打开文件
	File_Buffer=openfile();
	//将File_Buffer转为Image_Buffer
	Image_Buffer=FileBufferToImageBuffer(File_Buffer);
	//RVA转FOA
	char* foa=NULL;
	char* address=NULL;
	printf("请输入需要转换的地址:");
	scanf("%d",address); 
	foa=RVATOFOA(File_Buffer,Image_Buffer,address);
	return 0;
}

在这里给出函数说明文件Function.h:

//打开文件函数
//该函数完成将内存数据复制到File_Buffer 
char* openfile(){
	FILE *fp=NULL;
	char* File_Buffer=NULL;
	//打开文件 
	if((fp=fopen("E:\\个人\\逆向\\练习.exe","rb"))==NULL){
		printf("文件打开失败!\n");
	}else{
		printf("文件打开成功。\n");
	}
	//计算文件大小
	fseek(fp,0,SEEK_END);
	int length=ftell(fp);
	fseek(fp,0,SEEK_SET);
	//动态申请内存
	File_Buffer=(char*)malloc(length);
	if(File_Buffer==NULL){
		printf("FileBuffer内存申请失败!\n");
		exit(0); 
	}else{
		printf("FileBuffer内存申请成功。\n");
	} 
	//将文件数据读取到File_Buffer
	if(fread(File_Buffer,1,length,fp)){
		printf("文件读取到FileBuffer成功。\n");
	}else{
		printf("文件读取到FileBuffer失败!\n");
		exit(0);
	}
	//关闭文件
	if(fclose(fp)){
		printf("文件关闭失败!\n");
	}else{
		printf("文件关闭成功。\n");
	}
	return File_Buffer;
}
//将File_Buffer转到Image_Buffer函数
//该函数需要一个指针,指向File_Buffer
//该函数返回一个指针,指向Image_Buffer
char* FileBufferToImageBuffer(char* File_Buffer){
	char *Image_Buffer=NULL;
	//定义PE头部结构
	IMAGE_DOS_HEADER *pDosHeader=(IMAGE_DOS_HEADER*)File_Buffer;
	IMAGE_FILE_HEADER *pFileHeader=(IMAGE_FILE_HEADER*)(File_Buffer+pDosHeader->e_lfanew+4);
	IMAGE_OPTIONAL_HEADER *pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((char*)pFileHeader+20);
	IMAGE_SECTION_HEADER* pSectionHeader=(IMAGE_SECTION_HEADER*)((char*)pOptionalHeader+pFileHeader->SizeOfOptionalHeader);
	//动态申请Image_Buffer内存
	Image_Buffer=(char*)malloc(pOptionalHeader->SizeOfImage);
	if(Image_Buffer==NULL){
		printf("ImageBuffer内存申请失败!\n");
	}else{
		printf("ImageBuffer内存申请成功。\n");
	}
	//初始化申请的内存
	int i;
	for(i=0;i<pOptionalHeader->SizeOfImage;i++){
		*(Image_Buffer+i)=0;
	}
	//复制所有头
	int j;
	for(j=0;j<pOptionalHeader->SizeOfHeaders;j++){
		*(Image_Buffer+j)=*(File_Buffer+j);
	}
	//复制所有节到Image_Buffer中
	int k,x;
	for(k=0;k<pFileHeader->NumberOfSections;k++){
		for(x=0;x<pSectionHeader->SizeOfRawData;x++){
			*(Image_Buffer+pSectionHeader->VirtualAddress+x)=*(File_Buffer+pSectionHeader->PointerToRawData+x);
		}
		pSectionHeader++;
	}
	return Image_Buffer;
}
//RVA转FOA函数
//该函数需要两个指针,一个指向File_Buffer另一个指向Image_buffer
//该函数需要一个地址,指向要寻找的数据 
//若转化成功,该函数返回一个地址,表示FOA,若转化失败,则返回NULL
char* RVATOFOA(char* File_Buffer,char* Image_Buffer,char* address){
	//定义PE头部结构体
	IMAGE_DOS_HEADER* pDosHeader=(IMAGE_DOS_HEADER*)File_Buffer;
	IMAGE_FILE_HEADER* pFileHeader=(IMAGE_FILE_HEADER*)(File_Buffer+pDosHeader->e_lfanew+0x4);
	IMAGE_OPTIONAL_HEADER* pOptionalHeader=(IMAGE_OPTIONAL_HEADER*)((char*)pFileHeader+0x20);
	IMAGE_SECTION_HEADER* pSectionHeader=(IMAGE_SECTION_HEADER*)((char*)pOptionalHeader+pFileHeader->SizeOfOptionalHeader);
	//地址转换
	int i;
	for(i=0;i<pFileHeader->NumberOfSections;i++){
		if(address>(pSectionHeader->VirtualAddress)&&address<(pSectionHeader->VirtualAddress+pSectionHeader->Misc.VirtualSize)){
			break;
		}
		pSectionHeader++;
	}
	if(i==pFileHeader->NumberOfSections){
		printf("该地址不在任何一个节中!\n");
	}else{
		printf("该地址在第%d个节中。\n",i-1);
	}
	int pianyi=0;
	pianyi=address-((int)Image_Buffer+pSectionHeader->VirtualAddress);
	char* ret=(File_Buffer+pianyi);
	return ret;
} 

代码中有许多可以优化的地方或者是可能有不对的地方,希望大家及时指出,我会非常虚心地学习,希望我们共同进步!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第1讲:2015-01-12(进制01) 第2讲:2015-01-13(进制02) 第3讲:2015-01-14(数据宽度-逻辑运算03) 第4讲:2015-01-15(通用寄存器-内存读写04) 第5讲:2015-01-16(内存寻址-堆栈05) 第6讲:2015-01-19(EFLAGS寄存器06) 第7讲:2015-01-20(JCC) 第8讲:2015-01-21(堆栈图) 第8讲:2015-01-21(宝马问题) 第9讲:2015-01-22(堆栈图2) 第10讲:2015-01-23(C语言01_后半段) 第10讲:2015-01-23(C语言完整版) 第11讲:2015-01-26(C语言02_数据类型) 第12讲:2015-01-27(C语言03_数据类型_IF语句) 第13讲:2015-01-28(C语言04_IF语句逆向分析上) 第14讲:2015-01-28(C语言04_IF语句逆向分析下) 第15讲:2015-01-29(C语言04_正向基础) 第16讲:2015-01-30(C语言05_循环语句) 第17讲:2015-02-02(C语言06_参数_返回_局部变量_数组反汇编) 第18讲:2015-02-02(2015-01-30课后练习) 第19讲:2015-02-03(C语言07_多维数组) 第20讲:2015-02-03(2015-02-02课后练习) 第21讲:2015-02-04(C语言08_结构体) 第22讲:2015-02-05(C语言09_字节对齐_结构体数组) 第23讲:2015-02-06(C语言10_Switch语句反汇编) 第24讲:2015-02-26(C语言11_指针1) 第25讲:2015-02-27(C语言11_指针2) 第26讲:2015-02-28(C语言11_指针3) 第27讲:2015-02-28(C语言11_指针4) 第28讲:2015-03-02(C语言11_指针5) 第29讲:2015-03-03(C语言11_指针6) 第30讲:2015-03-04(C语言11_指针7) 第31讲:2015-03-06(C语言11_指针8) 第32讲:2015-03-09(位运算) 第33讲:2015-03-10(内存分配_文件读写) 第34讲:2015-03-11(PE头解析_手动) 第35讲:2015-03-12(PE头字段说明) 第36讲:2015-03-13(PE节表) 第37讲:2015-03-16(FileBufferImageBuffer) 第38讲:2015-03-17(代码节空白区添加代码) 第39讲:2015-03-18(任意节空白区添加代码) 第40讲:2015-03-19(新增节添加代码) 第41讲:2015-03-20(扩大节-合并节-数据目录) 第42讲:2015-03-23(静态连接库-动态链接库) 第43讲:2015-03-24(导出表) 第44讲:2015-03-25(重定位表) 第45讲:2015-03-26(移动导出表-重定位表) 第46讲:2015-03-27(IAT表) 第47讲:2015-03-27(导入表) 第48讲:2015-03-30(绑定导入表) 第49讲:2015-03-31(导入表注入) 第50讲:2015-04-01(C++ this指针 类 上) 第51讲:2015-04-01(C++ this指针 类 下) 第52讲:2015-04-02(C++ 构造-析构函数 继承) 第53讲:2015-04-03(C++ 权限控制) 第54讲:2015-04-07(C++ 虚函数表) 第55讲:2015-04-08(C++ 动态绑定-多态-上) 第56讲:2015-04-08(C++ 动态绑定-多态-下) 第57讲:2015-04-09(C++ 模版) 第58讲:2015-04-10(C++ 引用-友元-运算符重载) 第59讲:2015-04-13(C++ new-delete-Vector) 第60讲:2015-04-14(C++Vector实现) 第61讲:2015-04-15(C++链表) 第62讲:2015-04-16(C++链表实现) 第63讲:2015-04-16(C++二叉树) 第64讲:2015-04-17(C++二叉树实现) 第65讲:2015-04-20(Win32 宽字符) 第66讲:2015-04-21(Win32 事件-消息-消息处理函数) 第67讲:2015-04-22(Win32 ESP寻址-定位回调函数-条件断点) 第68讲:2015-04-23(Win32 子窗口-消息处理函数定位) 第69讲:2015-04-24(Win32 资源文件-消息断点) 第70讲:2015-04-27(Win32 提取图标-修改标题) 第71讲:2015-04-28(Win32 通用控件-VM_NOTIFY) 第72讲:2015-04-29(Win32 PE查看器-项目要求) 项目一:PE查看器 开发周期(5天) 需求文档 第73讲:2015-05-07(Win32 创建线程) 第74讲:2015-05-08(Win32 线程控制_CONTEXT) 第75讲:2015-05-11(Win32 临界区) 第76讲:2015-05-12(Win32 互斥体) 第77讲:2015-05-13(Win32 事件) 第78讲:2015-05-14(Win32 信号量) 第79讲:2015-05-15(Win32 线程同步与线程互斥) 第80讲:2015-05-18(Win32 进程创建_句柄表) 第81讲:2015-05-20(Win32 以挂起形式创建进程) 第82讲:2015-05-21(Win32 加密壳_项目说明) 项目二:加密壳 开发周期(5天) 需求文档 第83讲:2015-05-28(Win32 枚举窗口_鼠标键盘事件) 第84讲:2015-05-29(Win32 CE练习) 第85讲:2015-06-01(Win32 OD练习) 第86讲:2015-06-03(Win32 ShellCode_远程线程注入) 第87讲:2015-06-04(Win32 加载EXE_模块隐藏) 第88讲:2015-06-09(Win32 IAT_HOOK) 第89讲:2015-06-10(Win32 InlineHook) 第90讲:2015-06-11(Win32 进程通信) 第91讲:2015-06-11(Win32 进程监控_项目说明) 项目三:进程监控 开发周期(5天) 需求文档 第92讲:2015-06-15(硬编码_01) 第93讲:2015-06-16(硬编码_02) 第94讲:2015-06-17(硬编码_03) 第95讲:2015-06-18(硬编码_04) 第96讲:2015-06-19(硬编码_05)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shad0w-2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值