复习一下,不然会忘 1.imagebase 映像基地址 ,默认是0x400000 2.va 虚拟地址,载入OD后的地址,已经映射到内存的地址。...计算实际装入地址 VA imagebase (映像基址) + RVA(虚拟入口) => 0x400000 + 0x5d485 = 0x45d485 载入 od 验证 节取虚拟地址范围区间: 虚拟地址开始位置...RVA(相对便宜) = VA - .text首地址 => 0045D485 - 401000 = 5C485 FOA(文件偏移) = RVA + .text节的文件偏移 0x00001000 = 5C485...文件偏移转为RVA 计算文件偏移 5d480 对应到虚拟VA中的位置。...400000 + 0 = 45d480 虚拟VA转文件偏移代码 读取代码如下. import os import pefile def RVA_To_FOA(FilePath): pe =
RVA = VA - 401000 得出的就是相对于虚拟地址的偏移 简化 RVA = 401200 - 401000 = 200(RVA) 那么偏移就是200了 四丶FA(RAW)(File Address...思路: 1.获得虚拟地址(VA) 现在是40101A 2.查看属于哪个节区表(点击内存查看,OllyDbg) ?...大于401000,小于402000,所以节区属于代码区,也就是.text这个区域 3.算出RVA(相对虚拟地址偏移) RVA = VA - 内存中节区地址 代入得到: RVA = 40101A - 401000...RVA = 1A (相对虚拟地址偏移是1A) 4.RVA + 文件中的(相同节表,比如上面是.text,那么文件中看的节表就是.text这个节表)节表中的PointerToRawData成员记录的大小...举个例子 VA = 401456 RVA = 401456 - (.text的位置当然这个你得自己看,可能不是,这里默认是了)401000 = 456 FA = 456 + (文件中节表中的PointRawData
PE格式第三讲扩展,VA,RVA,FA的概念 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边都是....RVA = VA - 401000 得出的就是相对于虚拟地址的偏移 简化 RVA = 401200 - 401000 = 200(RVA) 那么偏移就是200了 四丶FA(RAW)(File Address...RVA(相对虚拟地址偏移) RVA = VA - 内存中节区地址 代入得到: RVA = 40101A - 401000 RVA = 1A (相对虚拟地址偏移是1A) 4.RVA + 文件中的(相同节表.... 1A + 200 = 21A (虚拟地址在文件中的偏移) 200要查看节表,还记得上面我们算RVA的时候吗,找的是内存中节区的地址,而这个地址正好是.text代码区 那么在文件中我们也要找到这个位置...举个例子 VA = 401456 RVA = 401456 - (.text的位置当然这个你得自己看,可能不是,这里默认是了)401000 = 456 FA = 456 + (文件中节表中的PointRawData
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密...通过上方的截图结合PE文件结构图我们可得知0000158B为映像装入内存后的RVA偏移,紧随其后的00400000则是映像的建议装入基址,为什么是建议而不是绝对?别急后面慢来来解释。...地址0040158B只要在区间里面就证明在本节区中,此处的VA地址是在401000 - 401B44区间内的,则说明它属于.text节。...经过上面的公式计算我们知道了程序的OEP位置是落在了.text节,此时你兴致勃勃的打开x64DBG想去验证一下公式是否计算正确不料,这地址根本不是400000开头啊,这是什么鬼?....text(节首地址) = ImageBase + 节区RVA => 00400000 + 00001000 = 00401000 VA(虚拟地址) = ImageBase + RVA(偏移) =>
什么是Hash散列值哈希散列值通常被用作数字签名、数据完整性验证、消息认证等等领域,它可以根据数据的内容计算出一个固定长度的值(通常是16到64字节),并且在数据被篡改的情况下会生成不同的散列值,因此可以用来在不传输原数据的情况下验证数据的完整性...什么是Hash散列函数哈希散列函数,也叫哈希函数,是一种将任意长度的消息映射到固定长度的散列值的函数。它通常是通过执行一系列算法将输入数据转换为一个固定大小的二进制数据而实现的。.../RAV转换在PE文件结构中,VA、RVA和FOA都是用来描述内存中数据的位置和在文件中的偏移量,具体含义如下:VA(Virtual Address):虚拟地址,也叫映像地址,是指在内存中的地址。...RVA通常是用于描述PE文件中的各个段的相对位置,它不像VA一样是用于真正运行程序的,而是在加载 PE 文件时进行重定位所使用的。...VA和RVA通常是在Windows操作系统中使用;FOA通常是在PE文件处理时使用。
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密...图片通过上方的截图结合PE文件结构图我们可得知0000158B为映像装入内存后的RVA偏移,紧随其后的00400000则是映像的建议装入基址,为什么是建议而不是绝对?别急后面慢来来解释。...地址0040158B只要在区间里面就证明在本节区中,此处的VA地址是在401000 - 401B44区间内的,则说明它属于.text节。...经过上面的公式计算我们知道了程序的OEP位置是落在了.text节,此时你兴致勃勃的打开x64DBG想去验证一下公式是否计算正确不料,这地址根本不是400000开头啊,这是什么鬼?...text(节首地址) = ImageBase + 节区RVA => 00400000 + 00001000 = 00401000VA(虚拟地址) = ImageBase + RVA(偏移) => 00400000
本章将继续探索内核中解析PE文件的相关内容,PE文件中FOA与VA,RVA之间的转换也是很重要的,所谓的FOA是文件中的地址,VA则是内存装入后的虚拟地址,RVA是内存基址与当前地址的相对偏移,本章还是需要用到...通过上方的截图结合PE文件结构图我们可得知0000158B为映像装入内存后的RVA偏移,紧随其后的00400000则是映像的建议装入基址,为什么是建议而不是绝对?别急后面慢来来解释。...地址0040158B只要在区间里面就证明在本节区中,此处的VA地址是在401000 - 401B44区间内的,则说明它属于.text节。...经过上面的公式计算我们知道了程序的OEP位置是落在了.text节,此时你兴致勃勃的打开x64DBG想去验证一下公式是否计算正确不料,这地址根本不是400000开头啊,这是什么鬼?...= RVA + .text节对应到文件中的偏移 => 58B + 400 = 98B 经过公式的计算,我们找到了虚拟地址0040158B对应到文件中的位置是98B,通过WinHEX定位过去,即可看到
本章将继续探索内核中解析PE文件的相关内容,PE文件中FOA与VA,RVA之间的转换也是很重要的,所谓的FOA是文件中的地址,VA则是内存装入后的虚拟地址,RVA是内存基址与当前地址的相对偏移,本章还是需要用到...图片通过上方的截图结合PE文件结构图我们可得知0000158B为映像装入内存后的RVA偏移,紧随其后的00400000则是映像的建议装入基址,为什么是建议而不是绝对?别急后面慢来来解释。...地址0040158B只要在区间里面就证明在本节区中,此处的VA地址是在401000 - 401B44区间内的,则说明它属于.text节。...经过上面的公式计算我们知道了程序的OEP位置是落在了.text节,此时你兴致勃勃的打开x64DBG想去验证一下公式是否计算正确不料,这地址根本不是400000开头啊,这是什么鬼?...text(节首地址) = ImageBase + 节区RVA => 00400000 + 00001000 = 00401000VA(虚拟地址) = ImageBase + RVA(偏移) => 00400000
判断是否落在了.text节的依据是 开始位置 >= 401000 结束位置 RVA(相对偏移) = VA - (.text节首地址) => 0040158B - 00401000 = 58BFOA(文件偏移) = RVA + .text节对应到文件中的偏移 => 58B +...+ VPK => F43 + 400000 + C00 = 401B43图片计算后的结果F43对应到VA地址是401B43 验证一下,没错。...- 实际偏移) = 0x00001000 + (98B - 400) = 58B图片DWORD VA = RVA + pNtHead->OptionalHeader.ImageBase;VA = 00400000...先来演示一下VA转换为RVA的过程,将VA地址40158B转换为FOA地址是多少?
什么是Hash散列值 哈希散列值通常被用作数字签名、数据完整性验证、消息认证等等领域,它可以根据数据的内容计算出一个固定长度的值(通常是16到64字节),并且在数据被篡改的情况下会生成不同的散列值,...什么是Hash散列函数 哈希散列函数,也叫哈希函数,是一种将任意长度的消息映射到固定长度的散列值的函数。它通常是通过执行一系列算法将输入数据转换为一个固定大小的二进制数据而实现的。.../RAV转换 在PE文件结构中,VA、RVA和FOA都是用来描述内存中数据的位置和在文件中的偏移量,具体含义如下: VA(Virtual Address):虚拟地址,也叫映像地址,是指在内存中的地址。...RVA通常是用于描述PE文件中的各个段的相对位置,它不像VA一样是用于真正运行程序的,而是在加载 PE 文件时进行重定位所使用的。...VA和RVA通常是在Windows操作系统中使用;FOA通常是在PE文件处理时使用。
判断是否落在了.text节的依据是 开始位置 >= 401000 结束位置 RVA(相对偏移) = VA - (.text节首地址) => 0040158B - 00401000 = 58B FOA(文件偏移) = RVA + .text节对应到文件中的偏移 => 58B +...+ VPK => F43 + 400000 + C00 = 401B43 计算后的结果F43对应到VA地址是401B43 验证一下,没错。...= RVA + pNtHead->OptionalHeader.ImageBase; // 计算出VA return VA;...先来演示一下VA转换为RVA的过程,将VA地址40158B转换为FOA地址是多少?
如下是三种格式的异同点:VA(Virtual Address,虚拟地址):它是在进程的虚拟地址空间中的地址,用于在运行时访问内存中的数据和代码。VA是相对于进程基址的偏移量。...RVA(Relative Virtual Address,相对虚拟地址):它是相对于模块基址(Module Base Address)的偏移量,用于定位模块内部的数据和代码。...RVA是相对于模块基址的偏移量,通过将模块基址和RVA相加,可以计算出相应的VA。...通过将文件偏移地址和节表中的指定节的起始位置相加,可以计算出相应的FOA。...,如下RVA_To_FOA函数可用于将一个相对地址转换为文件偏移,如果内存VA地址是0x401000而基址是0x400000那么相对地址就是0x1000,将相对地址转换为FOA文件偏移,首相要将相对地址加上基址
如下是三种格式的异同点: VA(Virtual Address,虚拟地址):它是在进程的虚拟地址空间中的地址,用于在运行时访问内存中的数据和代码。VA是相对于进程基址的偏移量。...RVA(Relative Virtual Address,相对虚拟地址):它是相对于模块基址(Module Base Address)的偏移量,用于定位模块内部的数据和代码。...RVA是相对于模块基址的偏移量,通过将模块基址和RVA相加,可以计算出相应的VA。...通过将文件偏移地址和节表中的指定节的起始位置相加,可以计算出相应的FOA。...,如下RVA_To_FOA函数可用于将一个相对地址转换为文件偏移,如果内存VA地址是0x401000而基址是0x400000那么相对地址就是0x1000,将相对地址转换为FOA文件偏移,首相要将相对地址加上基址
看下全局变量内容是什么. 我们跟过去看下 75 98 FD AE 可以看出,这个位置保存了一张表格,这张表格保存的是MessageBoxA的函数地址....偏移通过偏移可以找到DLL名称 DWORD FirstThunk; // IAT 的RVA偏移.和originalFirstThunk不同 } IMAGE_IMPORT_DESCRIPTOR...我们查看下user32.dll,里面的导出函数是Msg,我们看下它的序号是什么....选项头(或者叫做扩展头)的成员ImageBase中存储着 ,现在是00401000 那么现在要找节表 节表中记录了虚拟地址的RVA 也就是虚拟地址和模块首地址的RVA,我们则可以快速定位是哪个节表了...VA = 402010 FA = 402010 - 402000 + pointertoRawData(不截图了,是400) FA = 410 那么410位置就是导入表了.我们查看位置 按照上面的结构体
3.这相当于我们没有直接使用系统的GetProcAddress去寻找API,也没有使用loadlibrary去加载模块,正常开发没什么用,但对于某些场景,比如保护代码时,这种方法是有挺大作用的。...地址 mov ecx, [edx+60] 拿到了PE头和DllBase,我们就能去获得导出函数表EAT 0x05 定位导出表EAT ; DllBase+PE头RVA地址+120等于导出表...EAT的RVA加上模块基地址DllBase为VA add ecx, edx ; 保存当前模块的EAT的VA push ecx ; 获取函数名称地址表...IMAGE_EXPORT_DIRECTORY->AddressOfNames 的RVA mov ebx, [ecx+32] ; 函数名称地址数组VA 等于其 RVA + 模块的基地址...VA, moveax, [ebx+4*ecx] 是获得目标函数的RVA,即 DllBase +IMAGE_EXPORT_DIRECTORY->AddressOfFunctions) + (4 * OrdinalIndex
因为在编译时变量引用都被替换编译成 VA 了,所以我们需要把 VA 转 RVA,再获取 FOA(文件偏移),这需要另一个外部库 pefile — pefile documentation(https:/...[c2list_va_offset + delta : c2list_va_offset + delta + 4])[0] c2_list_rva = c2_list_va - image_base...和前面一样,我们使用 xor 函数解密,不同的是这里提取的是 IP ,所以我们需要引用 IP 相关的标准库 socket。...[c2list_va_offset + delta : c2list_va_offset + delta + 4])[0] c2_list_rva = c2_list_va - image_base...[c2list_va_offset + delta : c2list_va_offset + delta + 4])[0] c2_list_rva = c2_list_va - image_base
VA: 全名virtualAddress 虚拟地址. 就是内存中虚拟地址. 例如 0x00401000 RVA: RVA就是相对虚拟偏移. 就是偏移地址. 例如 0x1000....上面简介了一下什么是VA RVA 以及FOA 那么我们为什么要转换. 原因是这样的. 我们程序的数据.在PE文件中的地址假设是0x400, 那么在内存中展开的时候就是0x1000位置处....x - ImageBase == RVA 得出了我们的x位置在内存中的相对偏移.相对偏移就是我们计算的这个地址在开始位置的什么地方. ...然后计算差值偏移: 差值 = RVA - 节.VirtuallAddress 差值偏移: 为什么要计算差值.因为我们计算的差值偏移就是我们的 RVA距离我们节数据开始位置 的偏移是多少....差值偏移 + 节.VirtuallAddress(节数据在内存中展开的位置) == RVA 3.计算虚拟地址: RvA + ImageBase == VA 需要注意的就是我们的 x在哪一个节中
确定依赖的模块的名字是什么 我们说过.一个PE文件.依赖模块. 那么这个成员就是记录了.我要依赖的模块的名字是什么.是一个RVA属性. RVA指向了一个ASCII码字符串.以0结尾....我们下一张导入表的 依赖模块的模块名称的 RVA 属性是 0x1A75A VA = Imagebase + RVA = 41A75A ?...为什么需要两个表. 这个下面会将. 首先讲解的就是无论使用那个表.都能找到依赖当前模块的函数. 第一个成员找: INT表 INT表是4个字节.最后0结尾....INT的 RVA 为 1A2A8 VA = 41A2A8 ? 41A2A8是INT表开始. 每一个是4个字节,以0结尾. 观看第一项. 高位为0,所以 0x1A48E 是一个RVA....IAT表的RVA 偏移为 0x1A098 VA == 41A098 ? IAT表中存储了函数地址,4个字节为单位.0x6AD79CF0 就是函数 __Vcrt_loadlibraryExW .
PeView 结构解析器,是一款使用C/C++开发实现的命令行交互式 WindowsPE 程序结构解析器,目前可解析32位可执行程序的绝大部分通用参数,并内置各种结构查询转换阅览工具,目前已基本可在工作中使用...0x62D76132 1658282290 首部大小: 0x00000400 00001024 特征值: 0x00000102 00000258 校验和:...[Pe View] # CheckSelf -------------------------------------------------- 基址随机化: 是 DEP保护兼容: 是 强制完整性...异常保护: 否 证书签名: 否 -------------------------------------------------- 十六进制输出: 用于得到程序的十六进制机器码,通常传入的是文件路劲...---------------------------------------------------------------------------------------- 十六进制计算器: 此处是一个小功能
那我们PE文件中对数据的表述是使用RA还是RVA呢?大体可以总结如下:如果要在内存中运行和使用的数据大部分是使用RVA描述的。如果只是文件信息,程序运行时不关心的数据使用RA描述的。...元素是相对文件偏移RA,其他都是相对虚拟首地址偏移RVA)和大小。”...VirtualSize保存的是内存中该节的大小。这组数据和RVA关系很大。 PoiterToRawData保存的是该节第一个字节在文件中相对于文件第一个字节的偏移量。...但是注意一个现象,看线1、2是平行的,线3、4是平行的,线5、6是平行的。为什么是平行的?...如果它比SizeOfRawData大,则多余的部分是用0x00填充的。” ? 那么这个平行这意味着什么?这意味着如果我们可以利用”相对“这个概念。