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 ...
随机推荐
- Hibernate二级缓存简述及基于Spring4,Hibernate5,Ehcache3的二级缓存配置
Hibernate L2缓存 缓存的分类 L2缓存工作原理 放入二级缓存的数据 Ehcache 依赖 ehcache.xml 常用的memoryStoreEvictionPolicy(缓存算法) eh ...
- Python(1)
Python 学习 Part1 1. 斐波那契数序列 >>> a,b=0,1 >>> a 0 >>> b 1 >>> while ...
- HTTP相关:TCP/IP、DNS
最近在看HTTP的书,看得有点慢,而且断断续续的,很多东西看完就忘了.知识点多且零散,感觉要多看几遍才能消化. TCP/IP协议族按层次分为4层: 应用层: 应用层决定了向用户提供应用服务时通信的活动 ...
- 【转】mysql 中int类型字段unsigned和signed的区别
转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...
- SSM-Spring-03:Spring中AOP的初窥和入门小案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做 ...
- 对try-catch-finally异常处理的最新理解
try{ ...... }catch(......){ }finally{ ...... } 这个结构是用来处理Java所有可能出现的异常的,这个我很早其实就已经学过,不过最近看了个视频,感觉自己虽然 ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- Python实现猜数字游戏1.0版
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=702 """ 功能: 随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第 ...
- 关于checkpoint
Ⅰ.Checkpoint 1.1 checkpoint的作用 缩短数据库的回复时间 缓冲池不够用时,将脏页刷到磁盘 重做日志不可用时,刷新脏页 1.2 展开分析 page被缓存在bp中,page在bp ...
- indexer.go
package) ; , ].DocId,:],)) :],) :], , ] ; ];]--],]) , ) )) )-b+b*d/avgDocLength)) , ;].locations[ind ...