参考
书:《加密与解密》
视频:小甲鱼 解密系列 视频
区块
在区块表 后面的就是一个一个区块,每个区块占用对齐值的整数倍,一般的文件都有代码块 跟 数据块( 它们的名字一般为.text 跟 .data 但这是可以修改的)。每个区块的数据具有相同的属性。编译器先在obj中生成不同的区块, 链接器再按照一定的规则合并不同obj跟库中的快。例如每个obj中肯定有.text 块, 连接器就会把它们合并成一个单一的.text 块;再如,如果两个区块具有相同的的属性就有可能被合并成一个块。
文件偏移与RVA转换
因为磁盘对齐跟内存对齐可能不同。还有每个块必须是对齐值的整数倍即在磁盘中可执行文件的每个块的大小是磁盘对齐值的整数倍,程序加载到内存中后块的大小是内存对齐值的整数倍。会导致文件偏移与RVA转换的不同,需要转换。
例子:转换输入表的RVA与文件偏移
通过查看可执行文件的二进制可以找到输入表的RVA,但是不能找到输入表的文件偏移。
先查看这个可执行文件的二进制,可以发现这个程序的磁盘对齐为200h内存对齐为1000h(IMAGE_OPTIONAL_HEADER中的SectionAlignment跟FileAlignment)
图片1
用LoadPE可以方便的得到:
图片2
再从可执行文件的二进制找到输入表的RVA(IMAGE_OPTIONAL_HEADER中的DataDirectory[1]就是输入表的信息)
图片3
也可以通过LoadPE方便的查看(点击目录,查看输入表的RVA):
图片4
转化文件偏移与RVA,通过上面的信息还不够,还需要每个区块在文件中跟在内存中的起始地址,可以用LoadPE方便的查看(点击 区段 即可):
图片5
输入表的RVA为204Ch,可以通过区段表知道,它在 .rdata 区段中,它相对 .rdata 头 的值为 4Ch。.rdata 断在磁盘中开始 的 文件偏移值为A00h,
用4Ch 加 A00h 即可得到输入表的文件偏移为A4Ch,通过LoadPE的“位置计算器” 可验证输入表的文件偏移值确实是A4Ch。
图片6