Windows代码,添加一个节,以及RVA跟FOA互相转化,以及内存文件对齐代码.
/*
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.Windows服务-->添加一个简单的服务
Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何可视输出.任何用户消息都会被 写进Windows事件日志.计算机启动时,服务会自动开 ...
- 一、SAP中添加一个模块到收藏夹后,显示事务代码
一.在SAP中,如果添加一个模块到收藏夹,默认是看不到事务代码的,如图: 二.我们在附件->设置中勾选显示技术名称 三.保存之后,就会显示出事务代码,如图所示: 不忘初心,如果您认为这篇文章有价 ...
- 向PE文件中添加一个Section
背景 之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存 ...
- 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...
- Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本
title: Visual Studio中使用Macros插件给代码添加注释.时间和以及自动脚本 date: 2020-09-11 sidebarDepth: 2 tags: 代码 Visual st ...
- 如何在RCP程序中添加一个banner栏
前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.以前有个客户提出要在RCP程序中添加一个bann ...
- ASP.NET MVC3-第02节-添加一个Controller (C#)
前言 ---------------------------- 第01节[翻译]01-ASP.NET MVC 3介绍 ---------------------------- MVC是“model-v ...
- java 添加一个线程、创建响应的用户界面 。 演示示例代码
javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章 部分的代码 夹21.2.11 thinking in java 4免费下载: ...
- 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { pThreadCon = new CSerialThread ...
随机推荐
- bootstrap-table+x-editable入门
Bootstrap-table 快速入门bootstrap-table----我的表单不可能这么帅. Table of contents Quick start Why use it What's i ...
- Django rest framework(6)----序列化
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- .NET开发微信小程序-Template模块开发
1.添加一个文件目录,里面放模板信息 例:我在根目录添加一个文件夹:template 然后在这个文件夹下面添加相应的页面.比如我添加一个promodel.wxml文件.主要是放商品相关的模块信息(注: ...
- textarea 里设置 style="resize:none"
禁止textarea拉伸的方法是:: 设置这个 style="resize:none" 属性 例子: < ...
- c语言,数据结构,链表的一些操作总结
下面是自己的一些学习操作以及总结,能用我会很开心,有不足之处,欢迎大家提出宝贵的意见! c语言链表是一种基本的数据结构,与顺序表一样属于线性表,但是顺序表在内存中的存储单元是连续的,这样就对内存的要求 ...
- TCP的作用
1. 首先,TCP提供客户与服务器之间的连接.TCP客户先与某个给定服务器建立一个连接,然后通过该连接与服务器交换数据,最后终止该连接. 2. 其次,TCP提供了可靠性.超时重传.当TCP向另一端发送 ...
- eclipse如何新建项目发布到git
1.首先去查询本地git仓库地址 2.找到项目位置 删除git版本 3.更换git提交目标地址 目标地址是新建的git仓库地址 4.提交
- python 写日志
简单配置 日志级别 级别 何时使用 DEBUG 详细信息,典型地调试问题时会感兴趣. INFO 证明事情按预期工作. WARNING 表明发生了一些意外,或者不久的将来会发生问题(如'磁盘满了').软 ...
- java基础学习周计划之2--面向对象
JAVA面向对象第一天一. 知识点:1. 类和对象二. 关键问题(理论):1. 简述什么是类.什么是对象2. 简述基本类型变量与引用类型变量赋值时的差别3. 简述null的含义三. 关键代码(操作): ...
- stats.go
, len(c.clients)) for _, client := range c.clients { clients = append(cl ...