之前网上的思路是GetPcr()->IdtBase拿到isr地址对齐后往上爆搜 'MZ' 0x5A4D,来拿到ntos base。
在win10 2004以下版本中没什么问题。
isr本身位于.text中,往上很快就能得到pe头
但是在win10 2004下,ntos的区段结构变了,.text不再是第一个区段.几个data区段跑到了上面,还有3个区段不能访问
如果继续往上爆搜,则会直接裂开。
那么换个思路,可以看到在ntos的.text中还是有很多地方引用了image base了的
,直接往上爆搜 48 8D 1D ?? ?? ?? FF , (lea xxx, -aaaaaaa) ,最后一个0xff确保方向朝上,然后判断 aaaa是否PAGE_SIZE对齐( & 0xFFF == 0),
代码如下
.CODE
PUBLIC GetKernelBase
GetKernelBase PROC
mov rax, qword ptr gs:[18h]
mov rcx, [rax+38h]
mov rax, 0FFFFFFFFFFFFF000h
and rax, [rcx+4h]
jmp while_start
search_mem_start:
add rax, 0FFFFFFFFFFFFF000h
while_start:
xor ecx, ecx
jmp search_mem_check
search_mem_next:
add rcx, 1
cmp rcx, 0FF9h
jz search_mem_start
search_mem_check:
cmp byte ptr[rax+rcx], 48h
jnz search_mem_next
cmp byte ptr[rax+rcx+1], 8Dh
jnz search_mem_next
cmp byte ptr[rax+rcx+2], 1Dh
jnz search_mem_next
cmp byte ptr[rax+rcx+6], 0FFh
jnz search_mem_next
mov r8d,[rax+rcx+3]
lea edx,[rcx+r8]
add edx, eax
add edx, 7
test edx, 0FFFh
jnz search_mem_next
mov rdx, 0FFFFFFFF00000000h
and rdx, rax
add r8d, eax
lea eax,[rcx+r8]
add eax, 7
or rax, rdx
ret
GetKernelBase ENDP
END
[培训]《安卓高级研修班(网课)》月薪三万计划
最后于 2021-3-30 16:52
被xiaofu编辑
,原因: