roger 发表于 2020-9-2 20:14:30

新版xxprotect保护调试以及其x64隐藏进程等原理

时代在进步。距离老版xxprotect发布有几个月了。终于等到了新版的程序。
1.pchunter检测
打开pchunter后,电脑直接黑屏重启。
解决方法:
pchunter改个名字。


2.双机调试
vmp自带的内核调试器检测。挂钩R3的ZwQuerySystemInformation



3.进程隐藏
在任务管理器和调试器中看不到xxprotect.exe的进程名,但是直接遍历却可以遍历到




发现其pid被修改,变成了winlogon.exe的pid,导致其他任务管理器和调试器不显示其进程


windbg跟踪一波,发现其驱动在初始化阶段会设置保护进程的eprocess.InheritedFromUniqueProcessId 和 eprocess.UniqueProcessId








win7部分被v



把父进程PID设置为4,进程ID设置为winlongon的pid,即可“隐藏进程”。
直接patch SKProDriver.sys驱动的该函数即可不让其隐藏进程,下面贴代码

4.进程/线程对象保护
打开pchunter后,发现SKProDriver注册了以下回调


统统xor rax,rax/ret即可,并没有校验

5.调试权限清除
调试附加到进程后,出现


发现debugobject.ValidAccessMask被清空。调试发现 SKProDriver.sys 在初始化阶段有一次权限清0行为


直接nop了即可

6. debugport检测
调试器附加到xxprotect上后,电脑一闭眼。直接重启,原来是 xxprotect.sys会实时检测其保护进程的process.debugport


发现其被赋值后,马上重启电脑
代码如下,不同的系统取不同的debugport偏移


直接xor rax,rax/ret这里即可。

7.DbgUiRemoteBreak劫持
调试器附加到xxprotect后,程序退出。




把这里恢复即可。

8.疯狂的异常



xxprotect会疯狂抛异常,


x64dbg设置如上忽略即可

9.r3的反调试
xxprotect有个定时器定时抛异常,然后调用ZwQueryInformationProcess检测程序ProcessDebugPort是否处于调试


挂钩R3的ZwQueryInformationProcess,


然后处理掉r3的等调试标记位即可




10.ThreadHideFromDebugger
此时,程序可以正常附加了,但是命中断点的时候,程序崩溃




即可。
至此,其反调试手段全部绕过,程序可以正常调试







11.驱动的内存补丁
按我们上面找到的点,对xxprotect.sys做内存补丁即可,
先注册一个image callback


等到该驱动加载后,启动个线程,进行patch工作



总结:
反调试强度
xxprotect ≈ apex丐版 eac
还原过后的xxprotect的x64隐藏进程代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void HideProcess(PEPROCESS process) {
const auto SystemVersion = []() {
    RTL_OSVERSIONINFOW VER;
    RtlGetVersion(&VER);
    return VER.dwBuildNumber;
};
const auto hide_process = reinterpret_cast<uintptr_t>(process);
const auto syser_version = SystemVersion();
DbgPrint("sysver:%d\n", syser_version);
switch (syser_version) {
case 9200:
case 9600:
case 15063:
case 16299:
case 17134:
case 17763:
    *reinterpret_cast<DWORD *>(hide_process + 0x3E0) = 4;
    *reinterpret_cast<DWORD *>(hide_process + 0x2E0) = GetWinlogonPid();
    break;
case 10240:
case 10586:
case 14393:
    *reinterpret_cast<DWORD *>(hide_process + 0x3E0) = 4;
    *reinterpret_cast<DWORD *>(hide_process + 0x2E8) = GetWinlogonPid();
    break;
case 7600:
case 7601:
case 7602:
    *reinterpret_cast<DWORD *>(hide_process + 0x290) = 4;
    *reinterpret_cast<DWORD *>(hide_process + 0x180) = GetWinlogonPid();
    break;
default:break;
}
}



使用效果图

win7


win10

gogobn 发表于 2020-9-3 17:36:10

感谢分享,我会认真学习的!
页: [1]
查看完整版本: 新版xxprotect保护调试以及其x64隐藏进程等原理