防止读取文件特征
Object钩子
ParseProcedure -> nt!IopParseFile (文件访问函数 , 打开文件都要经过这个函数 )
代码crc校验
int3断点检测
代码校验都要获取进程的基址和大小, 或者直接通过某个函数的地址,这种只能校验单个函数
1. ZwQueryInformationProcess(ProcessBaseInformation)
2. Peb
3. VadTree
4. GetMdouleHandle(NULL)
5. 直接对crc线程进行挂起
6. 使用Dr寄存器来下断点(也就是硬件断点)
硬件断点
Dr0, Dr1, Dr2, Dr3寄存器清清零,
1. 当游戏调用GetThreadContent来获取Dr寄存器的值时返回0,以及当游戏保护调用SetThreadContent()来清服务异常Dr寄存器时直接返回
dll注入
0: 内核下PsSetLoadImageNotifyRoutine() 或者 PsSetLoadImageNotifyRoutine()
和
Apc或者NtCreateThread()或者NtResumeThread()来注入(启动进程就注入, 时机早)
1:输入法注入(利用搜狗,百度拼音等等方法)
2:全局钩子注入(SetWindowsHookEx)
3:DLL挟持(LPK,usp10)
4:CreateRemoteThread远程线程注入()
5:应用层apc注入,关键api:QueueUserAPC
那么在驱动层下有哪些注入呢?
1:驱动hook NtCreateThread挟持注入(修改eip)
2:APC注入(本节课要讲解的)
3:OEP感染注入(这是我们下节课要讲解的)
----- 获取隐藏进程 --------
1. 内核下使用PsSetCreateProcessNotifyRoutine()函数获取进程列表
2. 暴力搜索内存空间
3. Hook NtQuerySystemInformation
----- ring3下hook -----
1. veh无㾗hook, 但这种方式无法调用原函数
2. minhook
3. Dobby
其他
1. 应用层重载 Immemset(NewDll, 0, sizeof(NewDll))
反多开
1. 内核对象反多开
Mutex(内核引用为2的, CreateMutex, 对象本身与进程相关,名字随机,没有空格,且看不出任何意义),
解决办法是hook函数不调用真正的创建,或者拦截并修改互斥量名称为[每次随机]即可
使用NtQueryObject查询内核对象并关闭
Semaphore(CreateSemaphore),
Event(ZwCreateEvent) 配合信号量可以控制多开数量, 用的比较多
2. 文件独占反多开
CreateFile, hook该函数修改第二个打开文件的参数为可读可写
3. 进程反多开
4. 窗口反多开
NTUserFindWindowEx()
5. Port(ZwCreatePort)
6. CreateFileMappingA() 和 GetLastError() = 0xB7(183) 共享内存
NP 反双机调试目前分析
1. 只要启动引导项勾选了调试,则np就会自动退出
2. 那就直接hook NtQueryInformationThread、NtQuerySystemInformation、NtQueryObject这三个函数可以检测到系统调试信息
参考: https://www.361shipin.com/blog/1535384246925918208
3. 也有可能是串口检测(com),或者是引导项检测
4. NtQuerySystemInformation
这个原理就是查询 SystemKernelDebuggerInformation 的信息
这个API函数检测当前系统是否正在调试状态,比如双机调试
参考: https://bbs.pediy.com/thread-262200.htm
5. NTQueryObject
系统中的某个调试器调试进程时,会创建1个调试对象类型的内核对象。检测该对象是否存在即可判断是否有进程正在被调试。