64位的汇编程序,
driver.c:
VOID WPOFF()
{
#ifdef _WIN64
g_uCr0 = __readcr0();
__writecr0( g_uCr0 & 0x0fffffffffffeffff );
_disable();
#else
ULONG uAttr;
_asm
{
push eax;
mov eax, cr0;
mov uAttr, eax;
and eax, 0FFFEFFFFh; // CR0 16 BIT = 0
mov cr0, eax;
pop eax;
cli
}
g_uCr0 = uAttr; //保存原有的 CRO 屬性
#endif
}
VOID WPON()
{
#ifdef _WIN64
_enable();
__writecr0( g_uCr0 );
#else
_asm
{
sti
push eax;
mov eax, g_uCr0; //恢復原有 CR0 屬性
mov cr0, eax;
pop eax;
}
#endif
}
.data
g_struOldValue db 16 dup( 0 )
g_ulCheckFunAddr dq 0
.code
JmpFun PROC
pop rax
;保存所有寄存器
pushfq
push rax
push rbx
push rcx
push rdx
push rbp
push rsi
push rdi
push rsp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
mov r11, rsp
mov r10, rsp
add r11, 88h
add r11, 0b28h
sub rsp, 60h
mov rax, qword ptr [r11+58h]
mov qword ptr [r10-10h], rax ; 参数11
mov rax, qword ptr [r11+50h]
mov qword ptr [r10-18h], rax ; 参数10
mov rax, qword ptr [r11+48h]
mov qword ptr [r10-20h], rax ; 参数9
mov rax, qword ptr [r11+40h]
mov qword ptr [r10-28h], rax ; 参数8
mov rax, qword ptr [r11+38h]
mov qword ptr [r10-30h], rax ; 参数7
mov rax, qword ptr [r11+30h]
mov qword ptr [r10-38h], rax ; 参数6
mov rax, qword ptr [r11+28h]
mov qword ptr [r10-40h], rax ; 参数5
mov rax, g_ulCheckFunAddr
call rax
add rsp, 60h
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rsp
pop rdi
pop rsi
pop rbp
pop rdx
pop rcx
pop rbx
pop rax
popfq
;自己结束函数调用
add rsp, 0af0h
pop r15
pop r14
pop r13
pop r12
pop rdi
pop rsi
pop rbx
ret
JmpFun ENDP
end
[培训]科锐逆向工程师培训第53期2025年7月8日开班!