标签:active orm 计算 函数地址 use length idt 类型 初始
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)#define STATUS_SUCCESS              ((NTSTATUS) 0x00000000)#define SystemProcessesAndThreadsInformation    5 // 功能号#define NTAPI    __stdcall// 线程状态的枚举常量typedefenum_THREAD_STATE{    StateInitialized , // 初始化状态    StateReady , // 准备状态    StateRunning , // 运行状态    StateStandby , //     StateTerminated ,//关闭    StateWait , // 等待    StateTransition , // 切换???    StateUnknown}THREAD_STATE;// 线程处于等待的原因的枚举常量typedefenum_KWAIT_REASON{    Executive ,    FreePage ,    PageIn ,    PoolAllocation ,    DelayExecution ,    Suspended ,    UserRequest ,    WrExecutive ,    WrFreePage ,    WrPageIn ,    WrPoolAllocation ,    WrDelayExecution ,    WrSuspended ,    WrUserRequest ,    WrEventPair ,    WrQueue ,    WrLpcReceive ,    WrLpcReply ,    WrVirtualMemory ,    WrPageOut ,    WrRendezvous ,    Spare2 ,    Spare3 ,    Spare4 ,    Spare5 ,    Spare6 ,    WrKernel ,    MaximumWaitReason}KWAIT_REASON;typedefLONGNTSTATUS;typedefLONGKPRIORITY;typedefstruct_CLIENT_ID{    DWORDUniqueProcess;    DWORDUniqueThread;} CLIENT_ID , *PCLIENT_ID;typedefstruct_VM_COUNTERS{    SIZE_TPeakVirtualSize;    SIZE_TVirtualSize;    ULONGPageFaultCount;    SIZE_TPeakWorkingSetSize;    SIZE_TWorkingSetSize;    SIZE_TQuotaPeakPagedPoolUsage;    SIZE_TQuotaPagedPoolUsage;    SIZE_TQuotaPeakNonPagedPoolUsage;    SIZE_TQuotaNonPagedPoolUsage;    SIZE_TPagefileUsage;    SIZE_TPeakPagefileUsage;} VM_COUNTERS;// 线程信息结构体typedefstruct_SYSTEM_THREAD_INFORMATION{    LARGE_INTEGER   KernelTime;    LARGE_INTEGER   UserTime;    LARGE_INTEGER   CreateTime;    ULONGWaitTime;    PVOIDStartAddress;    CLIENT_ID       ClientId;    KPRIORITY       Priority;    KPRIORITY       BasePriority;    ULONGContextSwitchCount;    LONGState;// 状态,是THREAD_STATE枚举类型中的一个值    LONGWaitReason;//等待原因, KWAIT_REASON中的一个值} SYSTEM_THREAD_INFORMATION , *PSYSTEM_THREAD_INFORMATION;typedefstruct_UNICODE_STRING{    USHORTLength;    USHORTMaximumLength;    PWSTRBuffer;} UNICODE_STRING , *PUNICODE_STRING;// 进程信息结构体typedefstruct_SYSTEM_PROCESS_INFORMATION{    ULONGNextEntryDelta; // 指向下一个结构体的指针    ULONGThreadCount; // 本进程的总线程数    ULONGReserved1[ 6 ]; // 保留    LARGE_INTEGER    CreateTime; // 进程的创建时间    LARGE_INTEGER    UserTime; // 在用户层的使用时间    LARGE_INTEGER    KernelTime; // 在内核层的使用时间    UNICODE_STRING   ProcessName; // 进程名    KPRIORITY        BasePriority; //     ULONGProcessId; // 进程ID    ULONGInheritedFromProcessId;    ULONGHandleCount; // 进程的句柄总数    ULONGReserved2[ 2 ]; // 保留    VM_COUNTERS      VmCounters;    IO_COUNTERS      IoCounters;    SYSTEM_THREAD_INFORMATION Threads[ 5 ]; // 子线程信息数组}SYSTEM_PROCESS_INFORMATION , *PSYSTEM_PROCESS_INFORMATION;// NtQuerySystemInformation 函数的原型// 由于该没有导出,所以得自己定义函数的原型typedefDWORD(WINAPI* PQUERYSYSTEM)(UINT, PVOID, DWORD, PDWORD);/*※※* 函数名 : IsThreadSuspend※※* 功  能 : 获取线程是被是否被挂起※※* 返回值 : int 1: 表示线程被挂起 , 0: 表示线程正常。 -1 未知状态※※* 形  参 : DWORD dwThreadID 要验证的线程的ID※※* 形  参 : wchar_t * szProcessName 表示线程所在的进程名*/intIsThreadSuspend(DWORDdwProcessID , DWORDdwThreadID){    intnRet = 0;    NTSTATUS Status = 0;    PQUERYSYSTEM NtQuerySystemInformation = NULL;    PSYSTEM_PROCESS_INFORMATION pInfo = { 0 };    // 获取函数地址    NtQuerySystemInformation = (PQUERYSYSTEM)        GetProcAddress(LoadLibrary(L"ntdll.dll") , "NtQuerySystemInformation");    DWORDdwSize = 0;    // 获取信息所需的缓冲区大小    Status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation ,//要获取的信息的类型                                      NULL , // 用于接收信息的缓冲区                                      0 ,  // 缓冲区大小                                      &dwSize                                      );    // 申请缓冲区    char* pBuff = newchar[ dwSize ];    pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuff ;     if(pInfo == NULL)        return-1;    // 再次调用函数, 获取信息    Status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation ,//要获取的信息的类型                                      pInfo , // 用于接收信息的缓冲区                                      dwSize ,  // 缓冲区大小                                      &dwSize                                      );    if(!NT_SUCCESS(Status)) {/*如果函数执行失败*/        printf("失败\n");        delete[] pInfo;        return-1;    }    // 遍历结构体,找到对应的进程    while(1) {        // 判断是否还有下一个进程        if(pInfo->NextEntryDelta == 0)            break;        // 判断是否找到了ID        if(pInfo->ProcessId == dwProcessID) {            // 找到该进程下的对应的线程,也就是遍历所有线程            for(DWORDi = 0; i < pInfo->ThreadCount ; i++) {                if(pInfo->Threads[ i ].ClientId.UniqueThread == dwThreadID) { //找到线程                     //如果线程被挂起                    if(pInfo->Threads[ i ].State == StateWait                       && pInfo->Threads[ i ].WaitReason == Suspended) {                        nRet = 1;                        break;                    }                }            }            break;        }        // 迭代到下一个节点        pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo) + pInfo->NextEntryDelta);    }    delete[] pBuff;    returnnRet;}/*※※* 函数名 : IsThreadAlive※※* 功  能 :  判断线程是否被终止 , 如果终止返回FALSE,如果还活着返回TRUE※※* 返回值 : BOOL※※* 形  参 : DWORD dwThreadID 线程ID*/BOOLIsThreadAlive(DWORDdwThreadID){    BOOLbRet = FALSE;    DWORDExitCode = 0;    HANDLEhThread = OpenThread(THREAD_QUERY_INFORMATION , FALSE , dwThreadID);    if(hThread != NULL) {        if(GetExitCodeThread(hThread , &ExitCode)) {            if(ExitCode == STILL_ACTIVE)                bRet = TRUE;        }        CloseHandle(hThread);    }    returnbRet;}intmain(){    BOOLbRET = IsThreadSuspend(2640 , 1111);    if(bRET) {        printf(" 2320线程被挂起了!");    } | 
jpg转 rar
利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态
标签:active orm 计算 函数地址 use length idt 类型 初始
原文地址:https://www.cnblogs.com/kuangke/p/9524310.html