找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6657|回复: 2

x64重载内核不需要重定位吗?

[复制链接]

1

主题

72

回帖

0

精华

铜牌会员

积分
260
发表于 2015-6-18 17:48:01 | 显示全部楼层 |阅读模式
今天跑去研究x64的内核重载,因为x64的全局变量访问都是采用的相对偏移(目标地址 = 指令地址 + 指令长度 + 偏移),这里的偏移就是4byte的机器码。

那么是否意味着x64不需要重定位了?

正常加载情况下的全局变量访问都会随着模块加载的地址“自动”计算,公式如上。另外是否是因为内存对齐而导致的需要重定位?

思考不通x64重定位的意义~

以下是我重载ntos的函数截取。

原始内核函数:
  1. nt!NtCreateDebugObject:
  2. fffff800`01c70da0 48895c2408      mov     qword ptr [rsp+8],rbx
  3. fffff800`01c70da5 4889742410      mov     qword ptr [rsp+10h],rsi
  4. fffff800`01c70daa 57              push    rdi
  5. fffff800`01c70dab 4883ec70        sub     rsp,70h
  6. fffff800`01c70daf 418bf9          mov     edi,r9d
  7. fffff800`01c70db2 8bf2            mov     esi,edx
  8. fffff800`01c70db4 488bd9          mov     rbx,rcx
  9. fffff800`01c70db7 65488b042588010000 mov   rax,qword ptr gs:[188h]
  10. fffff800`01c70dc0 448a90f6010000  mov     r10b,byte ptr [rax+1F6h]
  11. fffff800`01c70dc7 4584d2          test    r10b,r10b
  12. fffff800`01c70dca 7414            je      nt!NtCreateDebugObject+0x40 (fffff800`01c70de0)
  13. fffff800`01c70dcc 488b052d32e5ff  mov     rax,qword ptr [nt!MmUserProbeAddress (fffff800`01ac4000)]
  14. fffff800`01c70dd3 483bc8          cmp     rcx,rax
  15. fffff800`01c70dd6 480f43c8        cmovae  rcx,rax
  16. fffff800`01c70dda 488b01          mov     rax,qword ptr [rcx]
  17. fffff800`01c70ddd 488901          mov     qword ptr [rcx],rax
  18. fffff800`01c70de0 48832300        and     qword ptr [rbx],0
  19. fffff800`01c70de4 41f7c1feffffff  test    r9d,0FFFFFFFEh
  20. fffff800`01c70deb 740a            je      nt!NtCreateDebugObject+0x57 (fffff800`01c70df7)
  21. fffff800`01c70ded b80d0000c0      mov     eax,0C000000Dh
  22. fffff800`01c70df2 e9e4000000      jmp     nt!NtCreateDebugObject+0x13b (fffff800`01c70edb)
  23. fffff800`01c70df7 488d442450      lea     rax,[rsp+50h]
  24. fffff800`01c70dfc 4889442440      mov     qword ptr [rsp+40h],rax
  25. fffff800`01c70e01 8364243800      and     dword ptr [rsp+38h],0
  26. fffff800`01c70e06 8364243000      and     dword ptr [rsp+30h],0
  27. fffff800`01c70e0b c744242868000000 mov     dword ptr [rsp+28h],68h
  28. fffff800`01c70e13 488364242000    and     qword ptr [rsp+20h],0
  29. fffff800`01c70e19 458aca          mov     r9b,r10b
  30. fffff800`01c70e1c 488b151db1daff  mov     rdx,qword ptr [nt!DbgkDebugObjectType (fffff800`01a1bf40)]
  31. fffff800`01c70e23 418aca          mov     cl,r10b
  32. fffff800`01c70e26 e8b5bef1ff      call    nt!ObCreateObject (fffff800`01b8cce0)
  33. fffff800`01c70e2b 4c8b4c2450      mov     r9,qword ptr [rsp+50h]
  34. fffff800`01c70e30 4c894c2460      mov     qword ptr [rsp+60h],r9
  35. fffff800`01c70e35 85c0            test    eax,eax
  36. fffff800`01c70e37 0f889e000000    js      nt!NtCreateDebugObject+0x13b (fffff800`01c70edb)
  37. fffff800`01c70e3d 41ba01000000    mov     r10d,1
  38. fffff800`01c70e43 45895118        mov     dword ptr [r9+18h],r10d
  39. fffff800`01c70e47 4983612000      and     qword ptr [r9+20h],0
  40. fffff800`01c70e4c 4183612800      and     dword ptr [r9+28h],0
  41. fffff800`01c70e51 498d4930        lea     rcx,[r9+30h]
  42. fffff800`01c70e55 4533c0          xor     r8d,r8d
  43. fffff800`01c70e58 418bd2          mov     edx,r10d
  44. fffff800`01c70e5b e8a0efc2ff      call    nt!KeInitializeEvent (fffff800`0189fe00)
  45. fffff800`01c70e60 498d4950        lea     rcx,[r9+50h]
  46. fffff800`01c70e64 48894908        mov     qword ptr [rcx+8],rcx
  47. fffff800`01c70e68 488909          mov     qword ptr [rcx],rcx
  48. fffff800`01c70e6b 33d2            xor     edx,edx
  49. fffff800`01c70e6d 498bc9          mov     rcx,r9
复制代码


重载的内核中的函数:
  1. lkd> u fffffa80`2145DDA0 l 30
  2. fffffa80`2145dda0 48895c2408      mov     qword ptr [rsp+8],rbx
  3. fffffa80`2145dda5 4889742410      mov     qword ptr [rsp+10h],rsi
  4. fffffa80`2145ddaa 57              push    rdi
  5. fffffa80`2145ddab 4883ec70        sub     rsp,70h
  6. fffffa80`2145ddaf 418bf9          mov     edi,r9d
  7. fffffa80`2145ddb2 8bf2            mov     esi,edx
  8. fffffa80`2145ddb4 488bd9          mov     rbx,rcx
  9. fffffa80`2145ddb7 65488b042588010000 mov   rax,qword ptr gs:[188h]
  10. fffffa80`2145ddc0 448a90f6010000  mov     r10b,byte ptr [rax+1F6h]
  11. fffffa80`2145ddc7 4584d2          test    r10b,r10b
  12. fffffa80`2145ddca 7414            je      fffffa80`2145dde0
  13. fffffa80`2145ddcc 488b052d32e5ff  mov     rax,qword ptr [fffffa80`212b1000]
  14. fffffa80`2145ddd3 483bc8          cmp     rcx,rax
  15. fffffa80`2145ddd6 480f43c8        cmovae  rcx,rax
  16. fffffa80`2145ddda 488b01          mov     rax,qword ptr [rcx]
  17. fffffa80`2145dddd 488901          mov     qword ptr [rcx],rax
  18. fffffa80`2145dde0 48832300        and     qword ptr [rbx],0
  19. fffffa80`2145dde4 41f7c1feffffff  test    r9d,0FFFFFFFEh
  20. fffffa80`2145ddeb 740a            je      fffffa80`2145ddf7
  21. fffffa80`2145dded b80d0000c0      mov     eax,0C000000Dh
  22. fffffa80`2145ddf2 e9e4000000      jmp     fffffa80`2145dedb
  23. fffffa80`2145ddf7 488d442450      lea     rax,[rsp+50h]
  24. fffffa80`2145ddfc 4889442440      mov     qword ptr [rsp+40h],rax
  25. fffffa80`2145de01 8364243800      and     dword ptr [rsp+38h],0
  26. fffffa80`2145de06 8364243000      and     dword ptr [rsp+30h],0
  27. fffffa80`2145de0b c744242868000000 mov     dword ptr [rsp+28h],68h
  28. fffffa80`2145de13 488364242000    and     qword ptr [rsp+20h],0
  29. fffffa80`2145de19 458aca          mov     r9b,r10b
  30. fffffa80`2145de1c 488b151db1daff  mov     rdx,qword ptr [fffffa80`21208f40]
  31. fffffa80`2145de23 418aca          mov     cl,r10b
  32. fffffa80`2145de26 e8b5bef1ff      call    fffffa80`21379ce0
  33. fffffa80`2145de2b 4c8b4c2450      mov     r9,qword ptr [rsp+50h]
  34. fffffa80`2145de30 4c894c2460      mov     qword ptr [rsp+60h],r9
  35. fffffa80`2145de35 85c0            test    eax,eax
  36. fffffa80`2145de37 0f889e000000    js      fffffa80`2145dedb
  37. fffffa80`2145de3d 41ba01000000    mov     r10d,1
  38. fffffa80`2145de43 45895118        mov     dword ptr [r9+18h],r10d
  39. fffffa80`2145de47 4983612000      and     qword ptr [r9+20h],0
  40. fffffa80`2145de4c 4183612800      and     dword ptr [r9+28h],0
  41. fffffa80`2145de51 498d4930        lea     rcx,[r9+30h]
  42. fffffa80`2145de55 4533c0          xor     r8d,r8d
  43. fffffa80`2145de58 418bd2          mov     edx,r10d
  44. fffffa80`2145de5b e8a0efc2ff      call    fffffa80`2108ce00
  45. fffffa80`2145de60 498d4950        lea     rcx,[r9+50h]
  46. fffffa80`2145de64 48894908        mov     qword ptr [rcx+8],rcx
  47. fffffa80`2145de68 488909          mov     qword ptr [rcx],rcx
  48. fffffa80`2145de6b 33d2            xor     edx,edx
  49. fffffa80`2145de6d 498bc9          mov     rcx,r9
复制代码


可以看到,机器码都是一致的。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2015-6-18 20:08:43 | 显示全部楼层
这个问题你自己测试一下就完全明白了。

28

主题

116

回帖

0

精华

铜牌会员

积分
273
发表于 2015-6-20 08:36:32 | 显示全部楼层
本帖最后由 gfw 于 2015-6-20 08:40 编辑

怎么可能不需要?难道“重定位表”是摆设?
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表