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

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

2016-4-2 10:20
9985
请问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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费
支持
分享
最新回复 (18)
雪    币: 5088
活跃值: (2570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2016-4-2 11:20
0
雪    币: 19
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
找到问题根源了
IMAGE_REL_BASED_DIR64
修正方法不同
2016-4-2 14:08
0
雪    币: 22
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
强烈关注中。。。。
2016-4-2 14:08
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
x64不可以的
2016-4-2 16:28
0
雪    币: 19
活跃值: (1106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可以的
我试过\
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你调用一个函数执行试试,例如ZwDeleteFile,或者DbgPrint。发现调用失败,我用Windbg看过了,WIN32没问题,但WIN64修复不了。
2016-4-2 19:51
0
雪    币: 19
活跃值: (108)
能力值: ( 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
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
Windows PE 权威指南
2016-4-2 19:59
0
雪    币: 19
活跃值: (1106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那你查一下64位的寻址方式吧,和32位不一样
2016-4-2 22:53
0
雪    币: 19
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
都是直接寻址吧!
2016-4-3 08:48
0
雪    币: 19
活跃值: (1106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
LARGE_INTEGER Addr;
ULONG delta = call的地址的二进制
Addr.LowPart += delta+ 3 + 4;
2016-4-3 12:02
0
雪    币: 19
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
求这句话:

10        IMAGE_REL_BASED_DIR64                  进行基地址重定位时将差值加到指定偏移处的一个64位域上
2016-4-3 12:18
0
雪    币: 19
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
弄好这个,WIN64重载内核才有点希望。
2016-4-3 12:20
0
雪    币: 124
活跃值: (494)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
内存分配时,看看内存地址是多少,nt的地址是多少,就会明白应该是64位系统存在4g的寻址问题。
2016-4-3 17:36
0
雪    币: 19
活跃值: (108)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册