/*

1.修改文件头节个数 +1

2.修改ImageBase

3.遍历节表,拷贝最后一个节表到下面

4.修改节的虚拟大小(节表.virtualSize)

5.修改节的虚拟地址(RVA 节表.virtualAddress) 内存对齐( 上一个节表.virtualAddress + 上一个节表.virtualSize);

6.修改节的文件偏移位置,以及文件大小

*/

/*

函数作用: RVA转化为FOA

参数: 传入RVA虚拟地址的值,返回FOA文件偏移.

内部使用: g_szBuffer是文件映射的首地址.

*/


DWORD RetRvaToFoA(DWORD RvaValue)
{
int RetRvaValue = 0;
if (RvaValue > pOptHead->ImageBase)
{
RetRvaValue = RvaValue - pOptHead->ImageBase;
} //定位节表位置,遍历节表.判断是否在节表内.
PIMAGE_DOS_HEADER pDosHead = (PIMAGE_DOS_HEADER)(g_szBuffer); //g_szBuffer是文件映射的首地址.
PIMAGE_NT_HEADERS pNtHead = (PIMAGE_NT_HEADERS)((DWORD)g_szBuffer + pDosHead->e_lfanew);
//定位节表.
PIMAGE_SECTION_HEADER SectionTableAddress = IMAGE_FIRST_SECTION(pNtHead);//获得了节表的首地址
for (int i = 0; i < pNtHead->FileHeader.NumberOfSections; i++)
{
if (RetRvaValue >= SectionTableAddress[i].VirtualAddress &&
RetRvaValue < (SectionTableAddress[i].VirtualAddress + SectionTableAddress[i].SizeOfRawData))
{
//落在这个节中.
RetRvaValue = RetRvaValue - SectionTableAddress[i].VirtualAddress; // 文件偏移 -文件偏移首地址 = 偏移. 偏移加上自己的VirtuallAddress 就是在内存中的RVA
RetRvaValue = RetRvaValue + SectionTableAddress[i].PointerToRawData;
break;
}
}
return RetRvaValue; //返回FOA在内存中的RVA偏移.
}

/*

函数作用: 填写FOA值,转换为RVA

*/

DWORD RetFoAtoRva(DWORD FoAvalue)
{
int RetFoaValue = 0;
//定位节表位置,遍历节表.判断是否在节表内.
PIMAGE_DOS_HEADER pDosHead = (PIMAGE_DOS_HEADER)(g_szBuffer);
PIMAGE_NT_HEADERS pNtHead = (PIMAGE_NT_HEADERS)((DWORD)g_szBuffer + pDosHead->e_lfanew);
//定位节表.
PIMAGE_SECTION_HEADER SectionTableAddress = IMAGE_FIRST_SECTION(pNtHead);//获得了节表的首地址
for (int i = 0; i < pNtHead->FileHeader.NumberOfSections; i++)
{
if (FoAvalue >= SectionTableAddress[i].PointerToRawData && FoAvalue < (SectionTableAddress[i].PointerToRawData + SectionTableAddress[i].SizeOfRawData))
{
//落在这个节中.
RetFoaValue = FoAvalue - SectionTableAddress[i].PointerToRawData; // 文件偏移 -文件偏移首地址 = 偏移. 偏移加上自己的VirtuallAddress 就是在内存中的RVA
RetFoaValue = RetFoaValue + SectionTableAddress[i].VirtualAddress;
break;
}
}
return RetFoaValue; //返回FOA在内存中的RVA偏移.
}

// 按照内存对齐,以及文件对齐. 第一种方式

//传入PE的原始内存对齐值,然后传入你的要进行对齐的值.
例子:

RetSectionAlignment(pOptHead.FileAlignment, pSection.virtualsize + pSection.virtualAddress);//返回节表虚拟大小+虚拟地址,按照内存对齐之后的值.

int RetSectionAlignment(DWORD Alignment, DWORD sizeOfImage)
{
//if (Alignment <=0)
//{
// AfxMessageBox(_T("计算内存对其值出错.请检查"));
// return 0;
//}
//while ((sizeOfImage % Alignment) != 0) //当不等于0就说明不是对齐.
//{
//
// sizeOfImage = sizeOfImage + 0x1000;
//}
int ret = 0;
int result = 0;
result = sizeOfImage % Alignment;
if (0 != result)
{
ret = ((sizeOfImage / Alignment) + 1) * Alignment;
}
else
{
ret = sizeOfImage;
} return ret;
} int RetFileAlignment(DWORD Alignment, DWORD Value)
{
if (Alignment <= 0)
{
OutputDebugString(TEXT("计算文件对其值出错.请检查"));
return 0;
}
//while ((Value % Alignment) != 0) //当不等于0就说明不是对齐.
//{ // Value = Value + Alignment;
//}
//return Value; int ret = 0;
int result = 0;
result = Value % Alignment;
if (0 != result)
{
ret = ((Value / Alignment) + 1) * Alignment;
}
else
{
ret = Value;
} return ret; }

Windows代码,添加一个节,以及RVA跟FOA互相转化,以及内存文件对齐代码.的更多相关文章

  1. 1.Windows服务-->添加一个简单的服务

    Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何可视输出.任何用户消息都会被 写进Windows事件日志.计算机启动时,服务会自动开 ...

  2. 一、SAP中添加一个模块到收藏夹后,显示事务代码

    一.在SAP中,如果添加一个模块到收藏夹,默认是看不到事务代码的,如图: 二.我们在附件->设置中勾选显示技术名称 三.保存之后,就会显示出事务代码,如图所示: 不忘初心,如果您认为这篇文章有价 ...

  3. 向PE文件中添加一个Section

    背景 之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存 ...

  4. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...

  5. Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本

    title: Visual Studio中使用Macros插件给代码添加注释.时间和以及自动脚本 date: 2020-09-11 sidebarDepth: 2 tags: 代码 Visual st ...

  6. 如何在RCP程序中添加一个banner栏

    前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.以前有个客户提出要在RCP程序中添加一个bann ...

  7. ASP.NET MVC3-第02节-添加一个Controller (C#)

    前言 ---------------------------- 第01节[翻译]01-ASP.NET MVC 3介绍 ---------------------------- MVC是“model-v ...

  8. java 添加一个线程、创建响应的用户界面 。 演示示例代码

    javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章  部分的代码  夹21.2.11 thinking in java 4免费下载: ...

  9. 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛

    MainWindow::MainWindow(QWidget *parent) :   QMainWindow(parent)   {   pThreadCon = new CSerialThread ...

随机推荐

  1. Kafka安装之 Zookeeper

    一 . Zookeeper 概述        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它 ...

  2. CSS 外边距合并。

    <div id = "parent"> <div id = "child"> demo </div> </div> ...

  3. 如何通过CSS实现背景图片自动平铺或拉伸至整个屏幕(自适应大小)

    默认情况下,通过HTML代码的BODY标签设置好背景图片<body background="x.jpg"> 后,图片会自动横向和纵向平铺.这就会产生一些美观上的问题. ...

  4. Http Header信息

    REMOTE_ADDR – 访问客户端的 IP 地址 HTTP_VIA – 如果有该条信息, 就证明您使用了代理服务器,代理服务器的地址就是后面的数值. HTTP_X_FORWARDED_FOR – ...

  5. 怎么确定Oracle客户端安装成功

    可通过能否登录sqlplus来判断是否安装成功. 操作系统:windows10 oracle版本:oracle 11g 步骤: 1.电脑win键+R键,输入cmd,进入命令提示符. 2.命令行中输入: ...

  6. java并发之非阻塞算法介绍

    在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的. 为了更好的理解阻塞算 ...

  7. 许式伟:我与Go语言的这十年[转]

    2017-12-18 许式伟 Go中国 2007 年 9 月 20 日,关于设计一门全新语言的讨论正式开始,这门全新的语言,就是后来的 Go.时至今日,Go 语言已经发布到 1.9 版本,走过了整整十 ...

  8. MySQL复制入门

    Ⅰ.复制类型 1.1 逻辑复制 记录每次逻辑操作 主从数据库可以不一致 1.2 物理逻辑复制 记录每次对于数据页的操作 主从数据物理严格一致 基于重做日志 说明: 如果一个块(页)修改了,就把这个修改 ...

  9. js算法初窥02(排序算法02-归并、快速以及堆排序)

    上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不 ...

  10. Websql,应用程序缓存,WebWorkers,SSE,WebSocket

    ①什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的 ...