[半原创]进程保护示例 - HdProcessProtectDemo
本帖最后由 HoviDelphic 于 2010-5-7 11:22 编辑进程保护和窗体保护的代码,刚学驱动时写的。
有些地方的处理得不太好,可能会蓝屏。
不推荐在自己的软件里使用。
最新版本在9楼。 PspExitThread+KiInsertQueueApc完美结束 PspExitThread+KiInsertQueueApc完美结束
xiaoly99 发表于 2010-3-28 19:09 http://www.m5home.com/bbs/images/common/back.gif
干掉这个是无需驱动的,用句柄劫持+CreateRemoteThread即可。 顶!顶!顶! 很不错的代码,支持大牛! 回复 5# 乔丹二世
其实这个写得并不好,很容易BSOD的。 一些修改:
NTSTATUS fake_NtUserBuildHwndList(
IN HDESK hdesk,
IN HWND hwndNext,
IN ULONG fEnumChildren,
IN DWORD idThread,
IN UINT cHwndMax,
OUT HWND *phwndFirst,
OUT ULONG* pcHwndNeeded)
{
NTSTATUS ntStatus;
ULONG j=0,i=0;
if (PsGetCurrentProcess()!= ProtectedProcess)
{
if (fEnumChildren==1)//是否是枚举子窗口
{ //如果是枚举本程序子窗体返回失败
if (Old_NtUserQueryWindow((ULONG)hwndNext, 0) == (ULONG)PsGetProcessId(ProtectedProcess))
{
return STATUS_UNSUCCESSFUL;
}
}
//枚举顶层窗口
ntStatus = Old_NtUserBuildHwndList(hdesk, hwndNext, fEnumChildren, idThread, cHwndMax, phwndFirst, pcHwndNeeded);
if (NT_SUCCESS(ntStatus))
{
while (i<*pcHwndNeeded)
{
if (Old_NtUserQueryWindow((ULONG)phwndFirst,0) == (ULONG)PsGetProcessId(ProtectedProcess))
{
phwndFirst=0;//直接把保护的句柄置0
}
i++;
}
}
return ntStatus;
}
return Old_NtUserBuildHwndList(hdesk, hwndNext, fEnumChildren, idThread, cHwndMax, phwndFirst, pcHwndNeeded);
}
NTSTATUS fake_NtDuplicateObject(
IN HANDLE SourceProcessHandle,
IN HANDLE SourceHandle,
IN HANDLE TargetProcessHandle,
OUT PHANDLE TargetHandle OPTIONAL,
IN ACCESS_MASK DesiredAccess,
IN ULONG Attributes,
IN ULONG Options)
{
NTSTATUS ntStatus,Tmp,Tmd;
THREAD_BASIC_INFORMATION TBI;
PROCESS_BASIC_INFORMATION PBI;
ntStatus=Old_NtDuplicateObject(SourceProcessHandle,SourceHandle,TargetProcessHandle,TargetHandle,DesiredAccess,Attributes,Options);
if (NT_SUCCESS(ntStatus) )
{ //在当前进程上下文直接查询输出句柄所属ID是我们的直接CLOSE掉
//这里 用内核提供的查询句柄函数似乎更精确 可以直接获取对象 然后对比是否是我们的进线程对象.
Tmp=ZwQueryInformationProcess(*TargetHandle,ProcessBasicInformation,&PBI,sizeof(PBI),NULL);
if (NT_SUCCESS(Tmp))
{
if (PBI.UniqueProcessId ==(ULONG)PsGetProcessId(ProtectedProcess))
{
ZwClose(*TargetHandle);
*TargetHandle=0;
ntStatus= STATUS_UNSUCCESSFUL;
}
}
Tmd=ZwQueryInformationThread(*TargetHandle,0,&TBI,sizeof(TBI),NULL);
if (NT_SUCCESS(Tmd))
{
if (TBI.ClientId.UniqueProcess==(HANDLE)inpid)
{
ZwClose(*TargetHandle);
*TargetHandle=0;
ntStatus= STATUS_UNSUCCESSFUL;
}
}
}
return ntStatus;
}
BOOLEAN fake_KeInsertQueueApc(IN PKAPC Apc,IN PVOID SystemArgument1,IN PVOID SystemArgument2,IN KPRIORITY PriorityBoost)
{
PETHREAD ThreadInApc;
PEPROCESS ThreadInApcOfProcess;
if( MmIsAddressValid((PVOID)(Apc->Thread))==FALSE ) //如果线程地址无效
return FALSE; //直接返回失败
ThreadInApc=(PETHREAD)(Apc->Thread);
ThreadInApcOfProcess=IoThreadToProcess(ThreadInApc);
if (ProtectedProcess!=ThreadInApcOfProcess)
{
//不是自己的线程,直接把参数传递给原始函数
return Old_KeInsertQueueApc(Apc,SystemArgument1,SystemArgument2,PriorityBoost);
}
else
{
//如果是自己的线程,就判断一下是否会对自己造成损害
if (PriorityBoost==2||PriorityBoost==0)
{
return FALSE;
}
else
{
return Old_KeInsertQueueApc(Apc,SystemArgument1,SystemArgument2,PriorityBoost);
}
}
}
建议放过的进程:自己、csrss.exe、explorer.exe(特别是有小图标的时候)。 本帖最后由 HoviDelphic 于 2010-4-25 11:00 编辑
TaProcPt build 20100424,For 2000/xp/2003/vista/2008/7。
完整的垃圾代码,蓝屏别怪我。 good 顶 顶顶更健康 加载保护就不能运行程序了 学习一下! 學習學習 good 才发现我的UID 很多9 ty0625 发表于 2011-7-15 18:52 static/image/common/back.gif
good
这个不good,很bad。。。
小心蓝屏。 Tesla.Angela 发表于 2011-7-15 21:27 static/image/common/back.gif
这个不good,很bad。。。
小心蓝屏。
xp SP1SP2SP3通过 不会蓝2003直接蓝!! 新手来学习啦 ,不知道有没有钱购买 支持一下各位大侠 先马克一下
页:
[1]