首页
社区
课程
招聘
[讨论]为啥枚举并循环挂起线程后再恢复 有些进程会挂掉?
发表于: 2014-5-27 15:04 5774

[讨论]为啥枚举并循环挂起线程后再恢复 有些进程会挂掉?

2014-5-27 15:04
5774
前几天看了 装逼兄 的 reload and run  game.dll 的帖子里v大的方法  然后发现这几个问题
1:有些进程在触发页异常后没进VEH就死掉了  难道win7下veh的优先级不是除调试器外最高的?
2:在能正常进入veh的进程里 如果先附加OD在注册VEH  则VEH函数能正常运行并且能被OD断下 反之则进程崩溃.......
3:无论在远线程 还是veh处理函数 里 只要使用OutPutDebugString或CString相关函数 进程直接死掉.....
最后发现  循环挂起线程后 再恢复 有些进程就直接死掉了 比如winrar和notepad++这么玩就没问题  但是像有道词典之类的就不行 直接就没响应了

这是我的挂起线程的代码 :
typedef DWORD (WINAPI *NtSuspendThread)(HANDLE hThread,OUT PULONG PreviousSuspendCount OPTIONAL); 

typedef DWORD (WINAPI *NtResumeThread)(HANDLE hThread,OUT PULONG PreviousSuspendCount OPTIONAL);

int i=0;
DWORD MayId = GetCurrentThreadId();
HANDLE hThread[1024] = {0};
	NtResumeThread MyResThread = (NtResumeThread)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"NtResumeThread");
	NtSuspendThread MySusThread = (NtSuspendThread)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"NtSuspendThread");

NTQUERYSYSTEMINFORMATION NtQSIM = (NTQUERYSYSTEMINFORMATION)GetProcAddress(GetModuleHandle(L"ntdll.dll"),"ZwQuerySystemInformation");

	status = NtQSIM(SystemProcessInformation,NULL,0,&retlen);
	pbuf = VirtualAlloc(NULL,retlen,MEM_COMMIT,PAGE_READWRITE);
	if(pbuf == NULL)
		return FALSE;

	truelen = retlen;
	status= NtQSIM(SystemProcessInformation,pbuf,truelen,&retlen);      //枚举进程线程
	buf=pbuf;
	IsBreak = FALSE;
	
	do 
	{
		pSysProcess=(PSYSTEM_PROCESSES)buf;
		if(pSysProcess->ProcessId == GetCurrentProcessId())
		{
			pSysThread=pSysProcess->Threads;
			for ( i=0;i<pSysProcess->ThreadCount;i++)
			{
				if((DWORD)pSysThread->ClientID.UniqueThread != MayId)   //不是当前线程
				{
					
					hThread[i] = OpenThread(THREAD_ALL_ACCESS,FALSE,(DWORD)pSysThread->ClientID.UniqueThread);
					MySusThread(hThread[i],NULL);
					pSysThread++;
				}
				
			}
			IsBreak = TRUE;      //这里是控制外面的循环是否退出 不然找到了还继续循环浪费时间
		}
		

		if (pSysProcess->NextEntryDelta==0 || IsBreak)
		{
			break;
		}
		buf = (PVOID)((DWORD)buf + pSysProcess->NextEntryDelta);
	} while (1);

	VirtualFree(pbuf,truelen,NULL);


	for(int j=0;j <= i;j++)
	{
		MyResThread(hThread[j],NULL);
		CloseHandle(hThread[j]);
	}
	


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 68
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为啥不贴其他代码
2014-5-27 15:55
0
雪    币: 74
活跃值: (243)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
其他无非注册veh 复制module 设置virtualprotect  咱试过了  吧上面代码注释掉就可以正常了 甚至吧上面代码单独那出来用都不正常.......
2014-5-27 16:01
0
雪    币: 68
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
i值你觉得会正常吗?pSysThread++;是当前线程不++?这里会不会死?为什么要自己这样写 大牛们的代码不好?我很懒呵呵
2014-5-27 16:08
0
雪    币: 74
活跃值: (243)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
真心不明白你的什么意思  难道还有现成的注入代码?V大那只贴了思路而已  本来我用Thread32frist  结果调试发现没效果  就照着网上一段  枚举线程   挂起线程这个是在枚举线程上改的  除了挂起外没加其他地方
而且 在winrar上测试是没问题的
2014-5-27 17:06
0
雪    币: 68
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
for ( i=0;i<pSysProcess->ThreadCount;i++)
      {
        if((DWORD)pSysThread->ClientID.UniqueThread != MayId)   //不是当前线程
        {
         
          hThread[i] = OpenThread(THREAD_ALL_ACCESS,FALSE,(DWORD)pSysThread->ClientID.UniqueThread);
          MySusThread(hThread[i],NULL);
          pSysThread++;//如果是当前线程?你就不++?那不是一直 在当前线程循环到结束
        }
        
      }

  for(int j=0;j <= i;j++)
  {
    MyResThread(hThread[j],NULL);//hThread[j] == NULL? (因为你上面没写好 这里可能是NULL)
    CloseHandle(hThread[j]);
  }

其实我也不确定是不是这些原因导致
2014-5-27 17:13
0
雪    币: 74
活跃值: (243)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哦 上面那个是我疏忽了....谢谢了
再去调试看看  不过有些进程就能正常 好奇怪?
2014-5-27 17:44
0
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这是集体fuck 11的节奏吗~~~
2014-5-27 17:58
0
雪    币: 74
活跃值: (243)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不玩dota类的说  拿来试试别的东西 恩
2014-5-27 18:15
0
游客
登录 | 注册 方可回帖
返回
//