-
-
[讨论]为啥枚举并循环挂起线程后再恢复 有些进程会挂掉?
-
发表于:
2014-5-27 15:04
5791
-
[讨论]为啥枚举并循环挂起线程后再恢复 有些进程会挂掉?
前几天看了 装逼兄 的 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]);
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)