三两行代码实现进程防杀,免驱动,IceSword,WSysCheck等无效.
其实这个已经是一个很老的技巧了,今天挖出来写到blog上。windows在强制结束进程的时候会先结束掉所有的线程,而结束线程调用的是:PspTerminateThreadByPointer,这个函数很有意思。看看就知道了。
它判断ETHREAD里面的CrossThreadFlags;的值,如果这个值等于PS_CROSS_THREAD_FLAGS_SYSTEM ,即是一个系统线程,那么直接返回拒绝访问,那么进程就无法结束了。所以我们把程序的线程改成系统线程,那么就可以达到防杀的目的。当然要杀还是很快的,把值修改回去或者投递一个ExitThread的APC就OK了。当然,觉得不够刺激可以改成PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION,那么结束线程的时候,系统会中断下来,一般是因为没有调试器附加而产生一个bugcheck,即蓝屏。
PspTerminateThreadByPointer(
IN PETHREAD Thread,
IN NTSTATUS ExitStatus,
IN BOOLEAN DirectTerminate
)
/**//**//**//*++
Routine Description:
This function causes the specified thread to terminate.
Arguments:
ThreadHandle - Supplies a referenced pointer to the thread to terminate.
ExitStatus - Supplies the exit status associated with the thread.
DirectTerminate - TRUE is its ok to exit without queing an APC, FALSE otherwise
--*/
......{
NTSTATUS Status;
PKAPC ExitApc=NULL;
ULONG OldMask;
PAGED_CODE();
if (Thread->CrossThreadFlags
& PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION) ......{
PspCatchCriticalBreak("Terminating critical thread 0x%p (in %s) ",
Thread,
THREAD_TO_PROCESS(Thread)->ImageFileName);
}
if (DirectTerminate && Thread == PsGetCurrentThread()) ......{
ASSERT (KeGetCurrentIrql() < APC_LEVEL);
PS_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);
PspExitThread (ExitStatus);
//
// Never Returns
//
} else ......{
//
// Cross thread deletion of system threads won't work.
//
if (IS_SYSTEM_THREAD (Thread)) ......{//如果这个是一个系统线程,直接返回拒绝访问。
return STATUS_ACCESS_DENIED;
}
Status = STATUS_SUCCESS;
while (1) ......{
ExitApc = (PKAPC) ExAllocatePoolWithTag (NonPagedPool,
sizeof(KAPC),
'xEsP');
if (ExitApc != NULL) ......{
break;
}
KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
}
//
// Mark the thread as terminating and call the exit function.
//
OldMask = PS_TEST_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);
//
// If we are the first to set the terminating flag then queue the APC
//
if ((OldMask & PS_CROSS_THREAD_FLAGS_TERMINATED) == 0) ......{
KeInitializeApc (ExitApc,
PsGetKernelThread (Thread),
OriginalApcEnvironment,
PsExitSpecialApc,
PspExitApcRundown,
PspExitNormalApc,
KernelMode,
ULongToPtr (ExitStatus));
if (!KeInsertQueueApc (ExitApc, ExitApc, NULL, 2)) ......{
//
// If APC queuing is disabled then the thread is exiting anyway
//
ExFreePool (ExitApc);
Status = STATUS_UNSUCCESSFUL;
} else ......{
//
// We queued the APC to the thread. Wake up the thread if it was suspended.
//
KeForceResumeThread (&Thread->Tcb);
}
} else ......{
ExFreePool (ExitApc);
}
}
return Status;
}
现在我们要修改CrossThreadFlags,那么首先要找到线程对应的ETHREAD,如果是驱动来做的话,几行代码就OK了。但是在ring3也是几行代码。我们先用OpenThread打开自己,这时会产生一个handle,然后我们把这个handle遍历出来,以查找到对应的Object的地址,也就是ETHREAD的地址。查找handle可以使用ZwQuerySystemInformation去获得。这时就剩下修改内存了,因为ETHREAD是在内核内存的,不能直接访问,我们可以通过NtSystemDebugControl去修改内核内存。下面是核心代码:
NTSYSTEMDEBUGCONTROL NtSystemDebugControl = NULL;
HANDLE hThread = NULL;
DWORD dwPID = GetCurrentProcessId();
DWORD dwTID = GetCurrentThreadId();
PSYSTEM_HANDLE_INFORMATION pHandleInfo = NULL;
ULONG uObjCnt = 0;
NTSTATUS status;
DWORD dwBufLen = 1024*800;
DWORD dwRetLen = 1024*800;
DWORD dwETHREAD = 0;
BOOL bRet = FALSE;
EnableDebugPrivilege(TRUE);
ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(LoadLibrary("ntdll.dll"),"ZwQuerySystemInformation");
NtSystemDebugControl = (NTSYSTEMDEBUGCONTROL)GetProcAddress(LoadLibrary("ntdll.dll"),"NtSystemDebugControl");
//先创建一个线程对象
GetProcAddress(LoadLibrary("kernel32.dll"),"OpenThread");
__asm
......{//SDK居然不包含OpenThread的声明,只能用汇编,简单很多。
push dwTID
push 0
push THREAD_ALL_ACCESS
call eax
mov hThread,eax
}
//获得线程对象的地址
BYTE * pBuf = new BYTE[dwBufLen];
ZeroMemory(pBuf,dwBufLen);
status = ZwQuerySystemInformation(SystemHandleInformation,pBuf,dwBufLen,&dwRetLen);//列举系统所有句柄
uObjCnt = (ULONG)*(ULONG*)pBuf;//获得句柄的个数
pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)(pBuf+sizeof(ULONG));
if(NT_SUCCESS(status))
......{
for(int i=0;i<uObjCnt;i++)
......{
if(pHandleInfo->ProcessId==dwPID//如果句柄的拥有者并且句柄是之前打开的。
&&pHandleInfo->Handle==(USHORT)hThread)
......{
dwETHREAD = (DWORD)pHandleInfo->Object;//保存下来
break;
}
pHandleInfo++;
}
//patch 内核
MEMORY_CHUNKS datas;
datas.Address = dwETHREAD+0x248;//CrossThreadFlags的偏移
datas.Data = &m_dwFixData;
datas.Length = 4;
status = NtSystemDebugControl(0x9,&datas,sizeof(MEMORY_CHUNKS),NULL,0,&dwRetLen);
// status = NtSystemDebugControl(0x8,&datas,sizeof(MEMORY_CHUNKS),NULL,0,&dwRetLen);
if(NT_SUCCESS(status))
bRet = TRUE;
}
delete [] pBuf;
CloseHandle(hThread);
当然上面的代码只在XP下有效,并且是管理员。为什么?自己去看资料吧。呵呵。
我晕,这文章我发表了5次才成功,CSDN可不是一般的烂.
完整代码:http://download.csdn.net/source/458567
三两行代码实现进程防杀,免驱动,IceSword,WSysCheck等无效.相关推荐
- 首创!用户级权限进程防杀 C++
用户级权限实现简单防杀 Guest权限下实现防杀!全网首创思路! 无意中翻出小学时候写的程序,应该是全网首创的无权限防杀手段,拿出来分享下.这个程序运行不需要任何权限,应该是为数不多的能抗住PChun ...
- 两行代码隐藏进程在top中的显示
今天到上海比较早,赶上了嘉泰线公交车,省了几十块钱打车钱,高兴! 两行代码能干啥?能隐藏一个进程在top中的显示,却也只能隐藏一个进程在top中的显示.如果非要抬杠sar可以暴露,perf可以暴露,t ...
- 黑科技!两行代码完美解决:同时设置overflow-x:hidden,overflow-y:visible无效的问题...
不废话,直接上代码 <!DOCTYPE html> <html><head><style>body {padding: 0;margin: 0;heig ...
- 很巧妙的进程防杀方法[秋镇菜原创]
刚刚学内核对象,想写个可以防杀的进程,但其他方法太高级, 本菜鸟不感高攀,想了几天,想到一个很本的办法,不正确的 方还请高手指点一下. 程序运行两个事例,每个实例互相监视另外的实例是否存在, 如果不存 ...
- c语言怎么去掉空白行,多种方法求解去掉空格 (三两行代码---适合初学者)
---------------------------------------解法一 ---------------------------------------------- 解题思路: 其实本题 ...
- Linux进程防杀/防崩溃monitor的实现
对于自行实现的很多服务,很多人喜欢用一个专门的监控进程来监控自己的服务,为了防止监控进程也崩掉,甚至使用了经典的双进程监控.不说别的,光编写调试这个双进程就够我喝一壶的啦,对于我这样专门写bug的家伙 ...
- 智能化防杀未知电脑病毒探讨
智能化防杀未知电脑病毒探讨 金州[est_vip] 2006.8.21 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-c ...
- im即时通讯开发:进程被杀底层原理、APP应对被杀技巧
本文的技术原理讲解透彻.系统源码分享到位.样例代码也很有参考意义,希望能对有同样兴趣爱好的Android开发者.IM开发者.推送系统开发者等,带来对于Android进程保活技术的深入理解. 一直以来, ...
- android 读取U盘apk文件信息,拔掉U盘导致进程被杀
最近一直在搞appStore,之前一直都是从网络获取apk下载进行安装,现在车机要求需要支持从U 盘安装apk,本以为简单很容易的事,却一不小心掉了一个坑里,爬了好久,主要是没很明显的报错,没遇到过的 ...
最新文章
- Java知识点总结——装箱与拆箱
- One order search dynamic SQL build logic
- php无法post,PHP无法获得post数据
- bootstrap --- 弹出对话框
- USB 摄像头成熟方案介绍
- 远程声控系统(MATLAB代码见CSDN资源)
- CompletionService VS ExecutorService
- 软件测试,何去何从?
- 【正则化】Label Smoothing详解
- OpenShift 4 - DevSecOps (1) - 安装 DevOps 环境
- ajax响应不显示值,Ajax响应200正常,但显示未能加载响应数据
- linux基础--grep以及模式正则表达式
- Dagger 注入的简单原理
- 幸运抽奖java_java10幸运抽奖
- global shutter和rolling shutter,全局快门与卷帘式快门
- 网页数据提取----网络投票软件开发(续1)
- 那些活在浪里的创业者最终被拍成了电影
- 不浪费原料的汉堡制作方案--贪心算法
- mysql gprs 程序_基于STM32控制的GPS定位与GPRS发送数据(程序源码)
- 338页网易Java面试真题解析火爆全网,面试真题解析
热门文章
- extra加ing_英语词缀extra- (outside; beyond) 与派生词
- springboot + vue项目本地化部署配置内+外网
- 杂项:SpagoBI
- matlab 交易模型,基于技术交易规则的动态模型股票价格(附论文和Matlab源程序)...
- Python去掉列表中的 ‘ | ’ |竖线分隔符
- el-table 按照某种规则 进行自定义升序降序的排序
- 人才早已过剩,计算机专业还值得报吗?
- 服务器系统盘 回写盘价格,服务器内存当回写盘
- PDF文件限制编辑、不能打印
- 【常见算法】求近似值