马上注册,结交更多Acer基友,欣赏海量Acer专属模特美图,免费获取最新Acer潮酷新品试用,Get更多发烧级玩家技能,享受更多网站功能与会员福利,还有定期好礼大奖免费送,会员专属优惠购机。QQ群号:113958420
您需要 登录 才可以下载或查看,没有帐号?限时注册
x
Code32Start = offset Code16End
RealCode ends
;*****************************************************************************************************************************************ProtectCode segment byte use32 ;##########可工作在32位保护模式的代码#########
Code32Start: ;offset NTLDRCallAddr = offset Code32Start = offset Code16End
NTLDRCallAddr dd ?
;jmp $ ;bochs调试4#,参看在NewINT13H调试为什么没运行到这里?
pushfd ;esp = esp + 04h
pushad ;esp = esp + 20h
;扫描获取模块表基址(_BlLoaderData) 参看"NTLDR分析及源代码".
mov edi,[esp + 20h + 04h] ;edi->OSLOADER内部.
and edi,NOT 000FFFFFh ;转换为镜像基地址 .
cld
mov al,0c7h ;C7h/46h/34h/00h/40h/00h/00h: MOV DWORD PTR [ESI+34h], 4000h
.while 1
scasb
.if ZERO?
.break .if dword ptr [edi] == 40003446h
.endif
.endw
mov al,0A1H ;A1h/xx/xx/xx/xx: MOV EAX, [xxxxxxxx]
.while 1
scasb
.break .if ZERO?
.endw
mov esi,[edi] ;esi->模块链表的开始基地址 .
mov esi,[esi] ;esi->模块链表中的第一个节点.
lodsd
mov ebx,[eax+18h] ;EBX = NTOSKRNL.EXE 在内存镜像的基地址.
;注意:这里不能直接调用NTOSKRNL导出函数.
;jmp $
;***************************************************************************************************************************************** call PatchFunction_OverHookFunc ;跳转到KeASSTHook后面执行,安装HOOK问题.
KeASSTHook: ;HOOK KeAddSystemServiceTable 该函数.
;lb 0x804c3bc6
sub dword ptr [esp],5 ;修正ret指令返回地址为被HOOK函数开始处.
pushad ;保护KeAddSystemServiceTable函数的现场.
mov eax,00000001h ;KEASSTHOOK_PTE:保护模式代码的内存地址.
KEASSTHOOK_PTE EQU $-4
xor ecx,ecx
mov ch,((Code32End - Code32Start) + 100h) / 100h ;注意:代码小于2k,以便放在用户数据空间 .
mov edx,0C0000000h ;edx->4MB页目录表中的第一个二级页表项 .
xor esi,esi ;esi->我们的代码开始地址,以页为基地址 .
mov edi,CSL_KERNEL_DEST ;拷贝代码到SharedUserData数据空间中去 .
xchg [edx],eax ;映射我们代码的物理地址到线性地址00000.
wbinvd
rep movsb ;SharedUserData 空间参看其他相关的教程.
mov [edx],eax ;恢复线性地址00000000原来的映射物理页 .
wbinvd ;bochs调试6#:NTOSKRNL.EXE镜像基址 + 64.
;保存被HOOK代码数据在堆栈中,后面恢复用.
db 6Ah,0 ;6Ah/xx: PUSH simm8
KEASSTHOOK_DISPLACED4 EQU $-1
pushd 0
KEASSTHOOK_DISPLACED0 EQU $-4
;bochs调试8#:lb 0xffdf08a4映射地址之后.
push (CSL_KERNEL_DEST + (MyKeAddSystemServiceTable - Code32Start))
ret ;跳转到MyKeAddSystemServiceTable函数处.
;*****************************************************************************************************************************************PatchFunction_OverHookFunc: ;KeAddSystemServiceTable HOOK 问题处理.
pop esi ;esi->KeASSTHook 函数在内存的实际地址 .
mov ecx,PatchFunction_OverHookFunc - KeASSTHook ;ecx = KeASSTHook 代码的长度,准备移动 .
;处理代码中的寻址问题,将KeASSTHook代码.
lea edi,[ebx+40h] ;搬移到NTOSKRNL DOS MZ和PE头之间去执行.
;jmp $ ;bochs调试5#,lb edi下一步运行在edi的值.
mov ebp, edi ;ebp用于后面HOOK时计算CALL rel 偏移用 .
rep movsb ;指令:edi->PatchFunction_OverHookFunc .
mov edx,0A21CD4EEh ;"KeAddSystemServiceTable",0 ->HASH值.
call PEApiHashFind ;在NTOSKRNL模块中查找该函数以便HOOK用..
;jmp $ ;bochs调试7#可以用到调试HOOK函数lb eax.
xchg esi,eax ;指令:esi->KeAddSystemServiceTable函数.
sub edi,PatchFunction_OverHookFunc - KEASSTHOOK_DISPLACED0
movsd ;InLine HOOK方式:保存被HOOK的代码数据 .
sub edi,KEASSTHOOK_DISPLACED0 + 4 - KEASSTHOOK_DISPLACED4
movsb
mov byte ptr [esi-5],0e8h ;E8h/xx/xx/xx/xx:CALL rel 相关地址指令.
sub ebp,esi ;调试例如:bochs调试5#edi lb 0x80400040.
mov dword ptr [esi-4],ebp ;call KeASSTHook,调试断点bochs调试5#处.
popad
popfd
;***************************************************************************************************************************************** ;模拟InLineHOOK NTLDR中的指令,并返回去.
mov esi,eax
test eax,eax
jnz short @F
pushfd
add dword ptr [esp+4],21h
popfd
@@:
ret
;*****************************************************************************************************************************************MyKeAddSystemServiceTable: ;bochs调试8#:开始是多任务JMP $断点很慢.
;首先关闭HOOK NTOSKRNL.EXE!KeAddSystemServiceTable
mov ebp,esp ;bochs调试8#:lb 0xffdf08a4 u /50 查看.
mov edi,[ebp+8+20h] ;edi->KeAddSystemServiceTable 函数入口.
mov ecx,cr0
mov edx,ecx
and ecx,NOT 00010000h
mov cr0,ecx ;CR0.WP关闭页保护功能,以便对当前页修改.
pop eax ;恢复KeAddSystemServiceTable HOOK 数据.
stosd
pop eax
stosb
mov cr0,edx ;恢复 CR0.WP位到原来的状态 .
;***************************************************************************************************************************************** mov esi,[ebp+8+28h] ;esi->_W32pServiceTable 服务描述表.
mov ecx,[ebp+8+30h] ;ecx: 服务的数目.
mov edi,[ebp+8+34h] ;edi:_W32pArgumentTable 服务参数表.
;具体参看"SSDT HOOK教程" ,讲解如何HOOK.
.while ecx > 0 ;HOOK win32k!NtUserRegisterClassExWOW .
lodsd
.if byte ptr [edi] == 10h ;NtUserRegisterHotKey has 4 arguments .
mov edx,20h
.while edx > 0
.if byte ptr [eax] == 0f7h ;F7h/0: TEST mem, imm
mov ebx,4 ;search EAX+4..1 for bit mask of prohibited 'fsModifiers' flags
.while ebx > 0
.if dword ptr [eax + ebx] == 0FFFF7FF0h
inc edi
.while 1 ;NtUserRegisterClassExWOW will have 6 or 7 arguments
sub esi,4
dec edi
.if byte ptr [edi] >= 18h
mov eax,[esi]
;bochs调试9#:JMP $指令断点,在多线程下很慢,尽量采用断点命令.lb 0xffdf08f7
mov edi,(CSL_KERNEL_DEST + (MyNtUserRegisterClassExWOW-Code32Start))
mov [edi + (NTURCEWOW_ORIGINAL - MyNtUserRegisterClassExWOW)],eax
mov [esi],edi
jmp @F
.endif
.endw
.endif
dec ebx
.endw
.endif
inc eax
dec edx
.endw
.endif
inc edi
dec ecx
.endw
@@:
;***************************************************************************************************************************************** popad ;恢复KeAddSystemServiceTable函数的现场.
ret ;返回KeAddSystemServiceTable函数去执行.
《《《《《《《《《《《《《文章转自网络,如有版权问题请尽快联系删除》》》》》》》》》》》》》》》 |
|