最近在研究内核重载,看了sidyhe大大的文章受益匪浅。 不过在修复IAT表的过程中遇到一个问题,一直没有解决
1、老内核中的代码
nt!ExDeferredFreePool
+
0x351
:
84f719c1
8d4c242c
lea ecx,[esp
2Ch
]
84f719c5
ff154031e484 call dword ptr [nt!_imp_KeReleaseInStackQueuedSpinLock (
84e43140
)]
84f719cb
eb60 jmp nt!ExDeferredFreePool
0x3bd
(
84f71a2d
)
重载后的内核中
nt_a3200000!ExDeferredFreePool
a332f9c1
a332f9c5 ff1540114000 call dword ptr ds:[
401140h
a332f9cb eb60 jmp nt_a3200000!ExDeferredFreePool
(a332fa2d)
IAT表没有修复
2、开始着手修复IAT表, 由于IAT表在INT节中,初始化后就删除了,只能通过ZwQuerySystemInformation 的11号功能枚举系统内核,竟然没有找到hal.dll模块,ARK中也没有看到HAL模块加载
这。。。。。。在坛子里请教下各位老大
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
sidyhe PsLoadedModuleList里有吗? 最不济的话从原模块里取吧! 至于为什么没有还得仔细研究 加油
这个问题解决了,是我代码的问题,排查了很久
在计算 IMAGE_BASE_RELOCATION 结构的 TypeOffset[] 数组时出现错误
因为
typedef struct _IMAGE_BASE_RELOCATION {
ULONG VirtualAddress;
ULONG SizeOfBlock;
USHORT TypeOffset[1];
} IMAGE_BASE_RELOCATION;
故在计算TypeOffset成员的时候会造成漏项
u_offset_array_size = (pimage_base_relocation->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION) +
sizeof(pimage_base_relocation->TypeOffset)) / sizeof(USHORT);
所以要么在结构定义的时候注释掉TypeOffset成员,即
//USHORT TypeOffset[1];
或者干脆在计算的时候直接用
u_offset_array_size = (pimage_base_relocation->SizeOfBlock - 0x8)/0x2;
在此做个总结,记录下