首页
社区
课程
招聘
[讨论]WIN64重载内核的重定位表问题
发表于: 2016-4-2 10:20 9834

[讨论]WIN64重载内核的重定位表问题

2016-4-2 10:20
9834
请问WIN64和WIN32的重定位表到底有什么区别?同样的修复重定位表的代码,WIN32内核能正常运行,而WIN64却不能,有人知道他们之间的区别吗?谢谢!







值                    常量符号                                                            含义               

0          IMAGE_REL_BASED_ABSOLUTE          无意义,仅做对齐作用

1          IMAGE_REL_BASED_HIGH                    双字节中,仅高十六位被修正

2          IMAGE_REL_BASED_LOW                    双字节中,仅低十六位被修正

3          IMAGE_REL_BASED_HIGHLOW           双字32位都需要修正

4          IMAGE_REL_BASED_HIGHADJ            进行基地址重定位时将差值的高十六位加到指定偏移处的一个16位域上。这个十六位域是一个32位字的高半部分,而这个32位字的低半部分被存储在紧跟在这个Type/Offset位域后面的一个16位字中。也就是说,这一个基地址重定位项占了两个Type/Offset位域的位置

5          IMAGE_REL_BASED_MIPS_JMPADDR            对MIPS平台的跳转指令进行基地址重定位

6                                                                                     保留,必须为0   
  
7                                                                                     保留,必须为0   
         
9          IMAGE_REL_BASED_MIPS_JMPADDR16     对MIPS16平台的跳转指令进行基地址重定位

10        IMAGE_REL_BASED_DIR64                  进行基地址重定位时将差值加到指定偏移处的一个64位域上

不知大伙觉得红色这行(WIN64内核重定位),应该如何操作。

欢迎加群讨论:177822398
177822108

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 4997
活跃值: (2430)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2016-4-2 11:20
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
找到问题根源了
IMAGE_REL_BASED_DIR64
修正方法不同
2016-4-2 14:08
0
雪    币: 22
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
强烈关注中。。。。
2016-4-2 14:08
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
x64不可以的
2016-4-2 16:28
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可以的
我试过\
void FixBaseRelocTable(PVOID pNewImage)
{

	ULONG					uIndex;
	ULONG					uRelocTableSize;
	ULONG_PTR					OriginalImageBase;
	ULONG					Type;
	ULONG_PTR 					*uRelocAddress;
	PIMAGE_DOS_HEADER		pImageDosHeader;
	PIMAGE_NT_HEADERS64		pImageNtHeader;
	IMAGE_DATA_DIRECTORY	ImageDataDirectory;
	IMAGE_BASE_RELOCATION	*pImageBaseRelocation;
	//将新内核地址作为一个PE文件头,依次向下,目的是寻找重定位表结构
	pImageDosHeader=(PIMAGE_DOS_HEADER)pNewImage;
	//定位到IMAGE_NT_HEADER
	pImageNtHeader=(PIMAGE_NT_HEADERS64)((ULONG_PTR)pNewImage+pImageDosHeader->e_lfanew);
	//获取内核文件的imagebase,以便后面做偏移修改。
	OriginalImageBase=pImageNtHeader->OptionalHeader.ImageBase;
	//定位到数据目录
	ImageDataDirectory = pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
	//定位到重定位表结构
	pImageBaseRelocation = (PIMAGE_BASE_RELOCATION)(ImageDataDirectory.VirtualAddress + (ULONG_PTR)pNewImage);
	if (pImageBaseRelocation==NULL)
	{
		return;  
	}
	while (pImageBaseRelocation->SizeOfBlock)
	{   //计算需要修改的地址的个数
		uRelocTableSize=(pImageBaseRelocation->SizeOfBlock-8)/2;
		//循环遍历
		for (uIndex=0;uIndex<uRelocTableSize;uIndex++)
		{//判断高4位是否等于3
			Type=pImageBaseRelocation->TypeOffset[uIndex]>>12;
			if (Type==IMAGE_REL_BASED_DIR64)
			{
				//修改地址,相对地址加上一个新内核地址,使其成为一个实际地址
				uRelocAddress=(ULONG64 *)((ULONG64)(pImageBaseRelocation->TypeOffset[uIndex]&0x0fff)+pImageBaseRelocation->VirtualAddress+(ULONG64)pNewImage);
				//再加上内核首地址到imagebase的偏移
				*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);
			}
		}
		//进行下一个重定位表的修改
		pImageBaseRelocation=(IMAGE_BASE_RELOCATION *)((ULONG64)pImageBaseRelocation+pImageBaseRelocation->SizeOfBlock);
	}
}
2016-4-2 19:45
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你调用一个函数执行试试,例如ZwDeleteFile,或者DbgPrint。发现调用失败,我用Windbg看过了,WIN32没问题,但WIN64修复不了。
2016-4-2 19:51
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你调用一个函数执行试试,例如ZwDeleteFile,或者DbgPrint。发现调用失败。我用Windbg看过了,WIN32没问题,但WIN64修复不了。
2016-4-2 19:52
0
雪    币: 107
活跃值: (36)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
想知道你第二张图片里是哪本书?呵呵
2016-4-2 19:57
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Windows PE 权威指南
2016-4-2 19:59
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那你查一下64位的寻址方式吧,和32位不一样
2016-4-2 22:53
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
都是直接寻址吧!
2016-4-3 08:48
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
LARGE_INTEGER Addr;
ULONG delta = call的地址的二进制
Addr.LowPart += delta+ 3 + 4;
2016-4-3 12:02
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
求这句话:

10        IMAGE_REL_BASED_DIR64                  进行基地址重定位时将差值加到指定偏移处的一个64位域上
2016-4-3 12:18
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
弄好这个,WIN64重载内核才有点希望。
2016-4-3 12:20
0
雪    币: 124
活跃值: (469)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
内存分配时,看看内存地址是多少,nt的地址是多少,就会明白应该是64位系统存在4g的寻址问题。
2016-4-3 17:36
0
雪    币: 19
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
那么还有没可能修复重定位表
2016-4-3 18:07
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
64位JMP寻址长度有2GB空间限制
2016-4-3 20:05
0
雪    币: 999
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark一下。。到时候写完32的再来看
2018-10-28 02:58
0
游客
登录 | 注册 方可回帖
返回
//