滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE

分析

源码

一 移动重定位

直接把整张表复制后修改目录表的RVA即可

二 修改ImageBase

5.17 在看了后面的课程理解了修改ImageBase修复重定位表其实是加载PE文件时系统做的事情, 这个函数相当于在仿照这件事 怪不得之前写错了重定位表的值依然可以运行…

①首先当然是修改ImageBase
②遍历重定位表中的数据加上新旧ImageBase的差值, 就是在打印的基础上加上修改数据

重定位表的结构

滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE_第1张图片
SECTION为所属区段, RVA为大表, items为有多少数据(SizeofBlock-8)/2 因为小表为word

RVA为要修改数据的地址(非真实地址) offset为文件偏移 type为数据属性
FarAddress为真正的地址也是修改imagebase后应该修改的值

数据偏移

重定位表的结构是由各个Block组成, 每个Block的前八个字节为RVA和本块的SIZE
在这里插入图片描述
11000转换FOA后为8A00 对应2
滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE_第2张图片
数据地址应为小表+大表如第一项数据60F+011000=1160F
转换为FOA后为A0F 对应4 5
高四位为3 属性 对应6
滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE_第3张图片
真实地址为1001B002 对应7
也就是要修改的值 加上与旧IMAGEBASE的差值即可

代码

	while (pBaseRelocation->SizeOfBlock)
	{
     
		//要修改的数据大表在文件中的偏移 大表 + word 型偏移
		foaOfBlock = (DWORD)pBaseRelocation - (DWORD)pFileBuffer;
		printf("Block %2d    RVA: %x\n", 1 + i++, pBaseRelocation->VirtualAddress);
		currentBlockItems = (pBaseRelocation->SizeOfBlock - 8) / 2;	//word 表示
		printf("Items: %2x\n", currentBlockItems);
		//对应 2 3
		
		//遍历块中数据修改FarAddress
		DWORD k = 0;
		DWORD addressOf_rvaOfData = pBaseRelocation->VirtualAddress;
		DWORD *pFarAddress = NULL;
		DWORD differenceOfImageBase = newImageBase - slist.imageBase;
		header.pOptionalHeader->ImageBase = newImageBase;
		while (currentBlockItems--)
		{
     
			rvaOfData = ((*(WORD *)(foaOfBlock + (DWORD)pFileBuffer + 8)) & 0x0fff) + addressOf_rvaOfData;
			foaOfData = (DWORD)RvaDataToFoaData(pFileBuffer, rvaOfData, FALSE);
			pFarAddress = (DWORD *)(foaOfData + (DWORD)pFileBuffer);
			attributeOfData = *(DWORD *)(foaOfBlock + (DWORD)pFileBuffer + 8) & 0x3000;
			if (attributeOfData == 0x3000)
			{
     
				attributeOfData = 3;
				*pFarAddress += differenceOfImageBase;
			}
			else
				attributeOfData = 0;
			printf("NO. %2d    RVA: %2x    FOA: %2x    FarAddress: %2x  Attribute: %d\n", 1 + k++, rvaOfData, foaOfData, *pFarAddress, attributeOfData);
			foaOfBlock += 2;
		}
		puts("");
		pBaseRelocation = (PIMAGE_BASE_RELOCATION)((DWORD)pBaseRelocation + pBaseRelocation->SizeOfBlock);
	}

结果

滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE_第4张图片

一些问题

1 在修改后调用发现反汇编中并没有改变, 然后想到在win10上是动态加载Imagebase, 修改OptionalHeader中的DLLCharacteristic低8位为00即可 具体见ASLR pe分析

2
当IMAGEBASE>7FFFFFFF后系统会自动修正
滴水逆向三期 PE基础 移动重定位表与修改IMAGEBASE_第5张图片
ps: 建了个学习讨论群, 欢迎新朋友加入:1094301686

你可能感兴趣的:(windows逆向)