首页
论坛
课程
招聘
[原创][源码]任务管理器:进程+线程+模块+服务+HOOK
2015-10-29 14:43 11647

[原创][源码]任务管理器:进程+线程+模块+服务+HOOK

2015-10-29 14:43
11647
这是我看雪第三篇主题帖了,虽然依旧不是闪闪发光的那种。

第一篇:
http://bbs.pediy.com/showthread.php?t=203541
第二篇:
http://bbs.pediy.com/showthread.php?t=204845

感兴趣可以移步看看。

 软件界面



----------------------------------------------------
到目前编程时间跌跌撞撞一路走来已经有三个月了吧,想想三个月前和现在的我还是有点唏嘘。

下面进入正题了。
1.进程
需要用到的关键函数:
CreateToolhelp32Snapshot()首先获取进程快照句柄
PROCESSENTRY32 此为一个结构体保存了进程相关信息
Process32FirstW()获取第一个进程
Process32Next()获取下一个 用循环遍历
此为大体框架了 更多信息请下载源码细细观看。。。
ProcessDlg.h  ProcessDlg.cpp
m_VecProList.clear();//清除VECTOR
  m_VecPriority.clear();
  m_VecMemory.clear();
  m_VevCpu.clear();
  m_ProList.DeleteAllItems();
  isInitEnd = true;
  double cpu;
  stcpe32.dwSize=sizeof(PROCESSENTRY32);

  //创建一个进程相关的快照句柄
  hProessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if (hProessSnap==INVALID_HANDLE_VALUE)
  {
    return ;
  }
  if (!Process32FirstW(hProessSnap,&stcpe32))
  {
    CloseHandle(hProessSnap);    //获取系统进程
    return ;
  }
  do 
  {
    PROCESSENTRY32  stcInfo={sizeof(PROCESSENTRY32)};//初始化结构体大小
    //获取进程映像路径
    wcscpy_s(stcInfo.szExeFile,stcpe32.szExeFile);
    hProcess=OpenProcess(              //打开进程句柄
      PROCESS_QUERY_INFORMATION|PROCESS_VM_READ ,
      FALSE,stcpe32.th32ProcessID);
    if (hProcess)
    {
      stcInfo.pcPriClassBase=GetPriorityClass(hProcess);//获取优先级

    }
    GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc));//获得工作集 workingsetsize
    cpu=Get_cpu_usage(stcpe32.th32ProcessID);//获取cpu占有率
    GetProcessImageFileName(hProcess,ProfilePath,MAX_PATH);
    GetModuleFileNameEx(hProcess,NULL,ProfilePath,MAX_PATH);//获取文件路径
    
    CString NewProfilePath(ProfilePath);
    NewProfilePath.Replace(_T("\\Device\\HarddiskVolume1\\"),_T("c:\\"));//将\\Device\\HarddiskVolume1\\  替换为c:\\
    NewProfilePath.Replace(_T("\\Device\\HarddiskVolume2\\"),_T("c:\\"));
    stcInfo.th32ProcessID=stcpe32.th32ProcessID;
    stcInfo.cntThreads=stcpe32.cntThreads;
    stcInfo.th32ParentProcessID=stcpe32.th32ParentProcessID;
    m_ProList.InsertItem(0,stcpe32.szExeFile);
    _stprintf_s(Pid,_T("%d"),stcpe32.th32ProcessID);///PID
    _stprintf_s(Memory,_T("%d %s"),pmc.WorkingSetSize/1024,_T("k"));
    _stprintf_s(CpuUtilization,_T("%d"),cpu);
    Priorit=InitializePriority(stcInfo.pcPriClassBase);
    m_ProList.SetItemText(0,1,Pid);//插入PID
    m_ProList.SetItemText(0,2,Memory);//插入工作集
    m_ProList.SetItemText(0,3,CpuUtilization);//插入cpu占用率
    m_ProList.SetItemText(0,4,Priorit);//
    //将获取的相关信息保存到向量中
    m_ProList.SetItemText(0,5,NewProfilePath);
    m_VecProList.push_back(stcInfo);
    m_VecPriority.push_back(Priorit);//保存优先级
    m_VecMemory.push_back(pmc.WorkingSetSize/1024);//保存内存
    m_VevCpu.push_back(cpu);//保存CPU
  } while (Process32Next(hProessSnap,&stcpe32));

  CloseHandle(hProcess);
  CloseHandle(hProessSnap);  

2.模块
SeeMoudleDlg.h SeeMoudleDlg.cpp
SetWindowText(m_StrMoudle);//设置查看模块时的进程标题 
  MODULEENTRY32 mod32={sizeof(MODULEENTRY32)};
  HANDLE hMoudleSnap=INVALID_HANDLE_VALUE;
  hMoudleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,m_ProCurrPid);//m_ProCurrPid为该模块进程ID
  if (hMoudleSnap==INVALID_HANDLE_VALUE)
  {
    return;
  }
  if (!Module32First(hMoudleSnap,&mod32))
  {
    CloseHandle(hMoudleSnap);
    return;
  }
  m_VecModList.clear();
  do 
  {
    _stprintf_s(MoudleId,_T("%d"),mod32.modBaseSize);
    _stprintf_s(MoudleBaseAdd,_T("%x"),mod32.modBaseAddr);
    m_MoudleList.InsertItem(0,MoudleId);
    m_MoudleList.SetItemText(0,1,MoudleBaseAdd);
    m_MoudleList.SetItemText(0,2,mod32.szExePath);
    m_VecModList.push_back(mod32);
  } while (Module32Next(hMoudleSnap,&mod32));


3.线程
SeeThreadDlg.h SeeThreadDlg.cpp
  SetWindowText(m_StrThread);
  THREADENTRY32 thd32={sizeof(THREADENTRY32)};
  HANDLE hThreadsnap;
  hThreadsnap=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD
    ,m_currPid);
  if (hThreadsnap==INVALID_HANDLE_VALUE)
  {
    return;
  }
  if (!Thread32First(hThreadsnap,&thd32))
  {
    CloseHandle(hThreadsnap);
    return;
  }
  m_VecThdList.clear();
  do 
  {
    _stprintf_s(strThreadId,_T("%d"),thd32.th32ThreadID);
    m_ThreadList.InsertItem(0,strThreadId);
    m_VecThdList.push_back(thd32);

  } while (Thread32Next(hThreadsnap,&thd32));
  CloseHandle(hThreadsnap);


4.服务
ServicerDlg.h ServicerDlg.cpp
SC_HANDLE hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
  DWORD dwServiceNum=0;
  DWORD dwSize=0;
  EnumServicesStatusEx(hSCM,
    SC_ENUM_PROCESS_INFO,
    SERVICE_WIN32,
    SERVICE_STATE_ALL,//所有服务状态
    NULL,0,&dwSize,&dwServiceNum,
    NULL,NULL);
  //申请需要的内存 第二次调用
  LPENUM_SERVICE_STATUS_PROCESS pEnumSerice=(LPENUM_SERVICE_STATUS_PROCESS)LocalAlloc(LPTR,dwSize);
  //第二次枚举
  BOOL bStattus=EnumServicesStatusEx(hSCM,
    SC_ENUM_PROCESS_INFO,
    SERVICE_WIN32,
    SERVICE_STATE_ALL,//所有服务状态
    (PBYTE)pEnumSerice,dwSize,&dwSize,&dwServiceNum,
    NULL,NULL);
  //遍历信息
  for (DWORD i=0;i<dwServiceNum;i++)
  {
    //获取基础信息

    //  pEnumSerice[i].lpDisplayName;
    //  pEnumSerice[i].lpServiceName;//服务名
    //pEnumSerice[i].ServiceStatusProcess.dwCurrentState;//服务状态
    //pEnumSerice[i].ServiceStatusProcess.dwServiceType;//服务可执行类型
    TCHAR *ServiceType=TheServiceType(pEnumSerice[i].ServiceStatusProcess.dwServiceType);

    //  _stprintf_s(ServiceType,_T("%d"),);
    //获取当前类型
    TCHAR* CurrentState=TheCurrentState(pEnumSerice[i].ServiceStatusProcess.dwCurrentState);
    //  _stprintf_s(CurrentState,_T("%d"),);
    m_ServiceList.InsertItem(0,pEnumSerice[i].lpServiceName);
    m_ServiceList.SetItemText(0,1,ServiceType);
    m_ServiceList.SetItemText(0,2,CurrentState);
    //获取单个服务详细信息
    SC_HANDLE hService=OpenService(hSCM,pEnumSerice[i].lpServiceName,SERVICE_QUERY_CONFIG);

    //第一次调用获取需要的缓冲区大小
    QueryServiceConfig(hService,NULL,0,&dwSize);
    //分配内存
    LPQUERY_SERVICE_CONFIG pServiceConfig=(LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,dwSize);
    //第二次调用获取信息
    QueryServiceConfig(hService,pServiceConfig,dwSize,&dwSize);
    //通过上面获取到的结构体信息具体到想要的值

    TCHAR *StartType=TheStartType(pServiceConfig->dwStartType);;//获取启动类型
    //_stprintf_s(StartType,_T("%d"),);
    //  _stprintf_s(StartType,_T("%d"),pServiceConfig->dwStartType);
    m_ServiceList.SetItemText(0,3,StartType);
    m_ServiceList.SetItemText(0,4,pServiceConfig->lpLoadOrderGroup);
    m_ServiceList.SetItemText(0,5,pServiceConfig->lpServiceStartName);
    m_ServiceList.SetItemText(0,6,pServiceConfig->lpBinaryPathName);


    m_VecServiceList.push_back(pEnumSerice+i);
  }


5.窗口
showexe.h showexe.cpp
TCHAR exeName[MAX_PATH];
   if (!::IsWindowVisible(hwnd))//窗口是否可见
   {
     return TRUE;
   }
   if (!::GetWindowText(hwnd,exeName,MAX_PATH))//得到窗口标题
   {
     return TRUE;
   }
   m_myThis->Exelist.InsertItem(0,exeName);//pmc.WorkingSetSize
    m_myThis->Exelist.SetItemText(0,1,L"正在运行");
  //m_myThis->m_VecExeList.push_back(exeName);
   //_tprintf(L"%s\n",str);
   //GetClassName(hwnd,str1,MAX_PATH);
  return TRUE;

有些BUG是特定环境触发的 所以 我就在我所认为可能触发关键点下断点  静静坐在电脑旁玩手机  一触发就慢慢调  找出问题所在 一次不行就俩次三次甚至多次  当然你自己可以慢慢的单步跟。。。。
进程刷新用是SetTimer() 在类向导响应消息WM_TIMER  
有些句柄该关闭时没关闭 算不得安全编程 昨天晚上匆匆完成该项目
还有很多小BUG没有修复  也没时间去修复了 有兴趣练手的就拿去吧 
我这是想到什么就写什么  莫见怪哈

-------------------------
环境:vs2012   MFC编程
可以直接看1.5版本源码 也可以从1.1开始慢慢理解思路
代码1600左右 其实我觉得可以精简至1000行吧  花了7天时间   现在觉得3天左右够了吧
zip:
任务管理器1.1.zip
任务管理器1.2.zip
任务管理器1.3.zip
任务管理器1.4.zip
任务管理器1.5.zip
HOOK.zip

rar:
打包.rar

再插一句 那个项目及hook用debug运行 release优化成什么鬼 我真是想炸电脑了。。。
很多注释都没删 可能影响美观度  代码风格并不重要 理解思路才是好的

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (16)
雪    币: 80
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
worldchief 活跃值 2015-10-29 14:52
2
0
基础扎实
雪    币: 60
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
white、、 活跃值 2015-10-29 15:04
3
0
我在想如果是纯Win32来做 会不会很费力?
雪    币: 1196
活跃值: 活跃值 (537)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 活跃值 5 2015-10-29 15:09
4
0
hah  谢谢    我会继续努力滴
雪    币: 1196
活跃值: 活跃值 (537)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 活跃值 5 2015-10-29 15:14
5
0
win32控制台的话  的确  
只不过是减少了按钮点击、右键菜单之类的操作  
然后我们还是让他显示PRINTF 只不过那个窗口会超大超长
然后我们是通过输入按键实现相关操作 再定义更多宏  相对来说确实复杂
雪    币: 756
活跃值: 活跃值 (1124)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 活跃值 2015-10-29 15:52
6
0
换个压缩软件
雪    币: 1196
活跃值: 活跃值 (537)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 活跃值 5 2015-10-29 16:45
7
0
好了
雪    币: 756
活跃值: 活跃值 (1124)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 活跃值 2015-10-29 16:54
8
0
你之前的用的什么快压,别人都打不开
雪    币: 1196
活跃值: 活跃值 (537)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
Tennn 活跃值 5 2015-10-29 17:07
9
0
我得卸载它。。。
雪    币: 756
活跃值: 活跃值 (1124)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 活跃值 2015-10-29 17:10
10
0
雪    币: 272
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AASSMM 活跃值 2015-10-29 18:10
11
0
任务管理器的精髓是查看各个进程cpu占用百分比
雪    币: 13
活跃值: 活跃值 (64)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
GeekCheng 活跃值 2 2015-10-29 19:19
12
0
纯Ring3。。。
雪    币: 105
活跃值: 活跃值 (27)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
toofunny 活跃值 1 2015-11-1 01:01
13
0
发这种东西的人太多了,所以不会闪闪发光了。换作几年前,发个简单的PE解析器都能加精。
雪    币: 229
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
转身 活跃值 2015-11-10 18:01
14
0
感谢楼主分享
雪    币: 134
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天台子 活跃值 2015-11-10 19:03
15
0
看不懂了
雪    币: 11
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天OO天 活跃值 2015-12-18 09:12
16
0
卤煮已经是个小神了,
雪    币: 1
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
山密特 活跃值 2017-4-17 14:18
17
0
可以的
游客
登录 | 注册 方可回帖
返回