紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 13748|回复: 21

[半原创]进程保护示例 - HdProcessProtectDemo

  [复制链接]

38

主题

237

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3408
发表于 2010-3-27 14:30:49 | 显示全部楼层 |阅读模式
本帖最后由 HoviDelphic 于 2010-5-7 11:22 编辑

进程保护和窗体保护的代码,刚学驱动时写的。
有些地方的处理得不太好,可能会蓝屏。
不推荐在自己的软件里使用。
最新版本在9楼。

HdProcPt091101.rar

95.69 KB, 阅读权限: 10, 下载次数: 105

售价: 1 水晶币  [记录]

src

如果附件无法下载,请点击这里

6

主题

202

帖子

0

精华

铜牌会员

菜鸟

Rank: 2Rank: 2

积分
52
发表于 2010-3-28 19:09:35 | 显示全部楼层
PspExitThread+KiInsertQueueApc完美结束

点评

Xor
xiaoli为什么要杀鸡用牛刀  发表于 2011-2-17 20:07

38

主题

237

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3408
 楼主| 发表于 2010-4-3 16:52:03 | 显示全部楼层
PspExitThread+KiInsertQueueApc完美结束
xiaoly99 发表于 2010-3-28 19:09


干掉这个是无需驱动的,用句柄劫持+CreateRemoteThread即可。
如果附件无法下载,请点击这里

2

主题

11

帖子

0

精华

初来乍到

Rank: 1

积分
21
发表于 2010-4-21 10:30:35 | 显示全部楼层
顶!顶!顶!

评分

参与人数 1水晶币 -2 -2 收起 理由
xiaoly99 -2 -2 扣!扣!扣!

查看全部评分

280

主题

483

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
1808
发表于 2010-4-23 11:14:31 | 显示全部楼层
很不错的代码,支持大牛!

38

主题

237

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3408
 楼主| 发表于 2010-4-23 22:51:25 | 显示全部楼层
回复 5# 乔丹二世

其实这个写得并不好,很容易BSOD的。

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2010-4-25 10:55:20 | 显示全部楼层
一些修改:

  1. NTSTATUS fake_NtUserBuildHwndList(
  2.                         IN HDESK hdesk,
  3.                                 IN HWND hwndNext,
  4.                                         IN ULONG fEnumChildren,
  5.                                                 IN DWORD idThread,
  6.                                                         IN UINT cHwndMax,
  7.                                                                 OUT HWND *phwndFirst,
  8.                                                                         OUT ULONG* pcHwndNeeded)
  9. {
  10.         NTSTATUS ntStatus;
  11.         ULONG j=0,i=0;
  12.         if (PsGetCurrentProcess()!= ProtectedProcess)
  13.         {
  14.                 if (fEnumChildren==1)//是否是枚举子窗口
  15.                 {        //如果是枚举本程序子窗体  返回失败
  16.                         if (Old_NtUserQueryWindow((ULONG)hwndNext, 0) == (ULONG)PsGetProcessId(ProtectedProcess))
  17.                         {
  18.                                 return STATUS_UNSUCCESSFUL;
  19.                         }
  20.                 }
  21.                 //枚举顶层窗口
  22.                 ntStatus = Old_NtUserBuildHwndList(hdesk, hwndNext, fEnumChildren, idThread, cHwndMax, phwndFirst, pcHwndNeeded);
  23.                 if (NT_SUCCESS(ntStatus))
  24.                 {
  25.                         while (i<*pcHwndNeeded)
  26.                         {
  27.                                 if (Old_NtUserQueryWindow((ULONG)phwndFirst[i],0) == (ULONG)PsGetProcessId(ProtectedProcess))
  28.                                 {
  29.                                         phwndFirst[i]=0;//直接把保护的句柄置0
  30.                                 }
  31.                                 i++;
  32.                         }
  33.                 }
  34.                 return ntStatus;
  35.         }
  36.         return Old_NtUserBuildHwndList(hdesk, hwndNext, fEnumChildren, idThread, cHwndMax, phwndFirst, pcHwndNeeded);
  37. }
复制代码

  1. NTSTATUS fake_NtDuplicateObject(
  2.                          IN HANDLE SourceProcessHandle,
  3.                                  IN HANDLE SourceHandle,
  4.                                          IN HANDLE TargetProcessHandle,
  5.                                                  OUT PHANDLE TargetHandle OPTIONAL,
  6.                                                          IN ACCESS_MASK DesiredAccess,
  7.                                                                  IN ULONG Attributes,
  8.                                                                          IN ULONG Options)
  9. {
  10.         NTSTATUS ntStatus,Tmp,Tmd;
  11.         THREAD_BASIC_INFORMATION TBI;
  12.         PROCESS_BASIC_INFORMATION PBI;
  13.         ntStatus=Old_NtDuplicateObject(SourceProcessHandle,SourceHandle,TargetProcessHandle,TargetHandle,DesiredAccess,Attributes,Options);
  14.         if (NT_SUCCESS(ntStatus) )
  15.         {        //在当前进程上下文  直接查询输出句柄所属ID  是我们的直接CLOSE掉  
  16.                 //这里 用内核提供的查询句柄函数似乎更精确 可以直接获取对象 然后对比是否是我们的进线程对象.
  17.                 Tmp=ZwQueryInformationProcess(*TargetHandle,ProcessBasicInformation,&PBI,sizeof(PBI),NULL);
  18.                 if (NT_SUCCESS(Tmp))
  19.                 {       
  20.                         if (PBI.UniqueProcessId ==(ULONG)PsGetProcessId(ProtectedProcess))
  21.                         {
  22.                                 ZwClose(*TargetHandle);
  23.                                 *TargetHandle=0;
  24.                                 ntStatus= STATUS_UNSUCCESSFUL;
  25.                         }
  26.                 }
  27.                 Tmd=ZwQueryInformationThread(*TargetHandle,0,&TBI,sizeof(TBI),NULL);
  28.                 if (NT_SUCCESS(Tmd))
  29.                 {
  30.                         if (TBI.ClientId.UniqueProcess==(HANDLE)inpid)
  31.                         {
  32.                                 ZwClose(*TargetHandle);
  33.                                 *TargetHandle=0;
  34.                                 ntStatus= STATUS_UNSUCCESSFUL;
  35.                         }
  36.                 }
  37.         }
  38.         return ntStatus;
  39. }
复制代码

  1. BOOLEAN fake_KeInsertQueueApc(IN PKAPC Apc,IN PVOID SystemArgument1,IN PVOID SystemArgument2,IN KPRIORITY PriorityBoost)
  2. {
  3.         PETHREAD ThreadInApc;
  4.         PEPROCESS ThreadInApcOfProcess;
  5.         if( MmIsAddressValid((PVOID)(Apc->Thread))==FALSE ) //如果线程地址无效
  6.                 return FALSE; //直接返回失败
  7.         ThreadInApc=(PETHREAD)(Apc->Thread);
  8.         ThreadInApcOfProcess=IoThreadToProcess(ThreadInApc);
  9.         if (ProtectedProcess!=ThreadInApcOfProcess)
  10.         {
  11.                 //不是自己的线程,直接把参数传递给原始函数
  12.                 return Old_KeInsertQueueApc(Apc,SystemArgument1,SystemArgument2,PriorityBoost);
  13.         }
  14.         else
  15.         {
  16.                 //如果是自己的线程,就判断一下是否会对自己造成损害
  17.                 if (PriorityBoost==2||PriorityBoost==0)
  18.                 {
  19.                         return FALSE;
  20.                 }
  21.                 else
  22.                 {
  23.                         return Old_KeInsertQueueApc(Apc,SystemArgument1,SystemArgument2,PriorityBoost);
  24.                 }
  25.         }
  26. }
复制代码

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2010-4-25 10:56:41 | 显示全部楼层
建议放过的进程:自己、csrss.exe、explorer.exe(特别是有小图标的时候)。

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2010-4-25 10:58:57 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-4-25 11:00 编辑

TaProcPt build 20100424,For 2000/xp/2003/vista/2008/7。
完整的垃圾代码,蓝屏别怪我。

TaProcPt.rar

782.78 KB, 阅读权限: 10, 下载次数: 104

售价: 10 水晶币  [记录]

完整的垃圾代码

0

主题

23

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
141
发表于 2010-5-6 02:53:28 | 显示全部楼层
good
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-24 19:08 , Processed in 0.037107 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表