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

简介: 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;
} 

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

相关文章
BUUCTF FLAG 1
BUUCTF FLAG 1
999 0
|
Android开发 开发者
【Magisk模块】Miui Core:在非MIUI系统上运行MIUI服务框架(V2.7)
【Magisk模块】Miui Core:在非MIUI系统上运行MIUI服务框架(V2.7)
4043 0
|
机器人 测试技术 数据安全/隐私保护
IPPBX配置-如何实现FreePBX/VOS/鼎信网关外呼
目前市场上很多企业客户使用FreePBX来部署某些企业应用服务,有电话机器人,.有时,为了更加准确地实现计费功能,VOS作为一个计费和路由管理功能来和FreePBX集成对接。企业用户中,FreePBX或者外呼平台可以实现应用层的服务,包括智能外呼,呼叫中心外呼解决方案和企业IPPBX功能。今天,我们这里配置一个环境来说明企业内部分机如何通过FreePBX,VOS和鼎信通达网关实现落地服务。主要目的是为企业客户提供一个最完整和权威的FreePBX对接VOS和落地网关配置文档,以便让客户能够快速正确配置所有的相关信息。
1319 0
|
存储 编译器 数据安全/隐私保护
移动导出表,移动重定位表【滴水逆向三期51笔记+作业源码】(上)
移动导出表,移动重定位表【滴水逆向三期51笔记+作业源码】
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
《集成学习:堆叠泛化与提升法在人工智能中的应用热点》
在人工智能领域,集成学习是提升模型性能的关键技术。堆叠泛化通过训练元模型整合多个基础模型的输出,结合各自优势,显著提高准确性和泛化能力;提升法则通过迭代训练逐步优化模型,修正误差,增强适应性。两者共同为图像识别、自然语言处理和智能决策等复杂问题提供强大支持,推动AI技术进步。
223 8
《集成学习:堆叠泛化与提升法在人工智能中的应用热点》
|
12月前
|
安全 Linux API
恶意代码分析入门--静态分析(chapter1_Lab01-01)
本文档介绍了在Windows XP SP3环境下,利用PEiD、Strings、PETools等工具对Lab01-01.exe和Lab01-01.dll两个文件进行恶意代码分析的过程。实验包括在线扫描、PE结构分析、检查是否加壳、分析导入函数、字符串搜索等步骤,最终推测出这两个文件的潜在恶意行为及目的。通过这一系列的静态分析手段,能够初步判断出恶意代码的性质与功能,为后续的深入研究提供了基础。
296 5
恶意代码分析入门--静态分析(chapter1_Lab01-01)
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
存储 Serverless 数据处理
Python - len(string)函数
通过上述介绍和示例,我们可以清楚地看到,在Python中,`len()`函数是处理字符串以及其他可迭代对象长度的重要工具。它简单、易用,但在实际应用中却非常强大,无论是在基础编程还是在复杂的数据处理中,`len()`函数都扮演着不可或缺的角色。
504 10
|
安全 网络协议 NoSQL
SSRF漏洞深入利用与防御方案绕过技巧
SSRF漏洞深入利用与防御方案绕过技巧
971 0