首页
社区
课程
招聘
[推荐]C++创建各种快照,实现 【进程名取ID】【进程ID取全部线程ID】【取模块基址】等基础功能
发表于: 2022-1-19 21:40 29688

[推荐]C++创建各种快照,实现 【进程名取ID】【进程ID取全部线程ID】【取模块基址】等基础功能

2022-1-19 21:40
29688

HANDLE CreateToolhelp32Snapshot(
  [in] DWORD dwFlags,
  [in] DWORD th32ProcessID
);
 
BOOL Thread32First(
  [in]      HANDLE          hSnapshot,
  [in, out] LPTHREADENTRY32 lpte
);
 
BOOL Thread32Next(
  [in]  HANDLE          hSnapshot,
  [out] LPTHREADENTRY32 lpte
);
HANDLE CreateToolhelp32Snapshot(
  [in] DWORD dwFlags,
  [in] DWORD th32ProcessID
);
 
BOOL Thread32First(
  [in]      HANDLE          hSnapshot,
  [in, out] LPTHREADENTRY32 lpte
);
 
BOOL Thread32Next(
  [in]  HANDLE          hSnapshot,
  [out] LPTHREADENTRY32 lpte
);
#include <Windows.h>
#include <iostream>
#include <tlhelp32.h>
#include <vector>
using namespace std;
std::vector<DWORD> GetAllProcessThread(DWORD ProcessId)//一定要保证 是多字节模式,不然可能会出错
{
    std::vector<DWORD>v;
    HANDLE ThreadList = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    THREADENTRY32 ThreadInfo{ sizeof(THREADENTRY32) };
    if (Thread32First(ThreadList, &ThreadInfo))
    {
        do
        {
            if (ThreadInfo.th32OwnerProcessID == ProcessId)
            {
                v.push_back(ThreadInfo.th32ThreadID);
            }
        } while (Thread32Next(ThreadList, &ThreadInfo));
    }
    CloseHandle(ThreadList);
    return v;
}
DWORD GetProcessId(char* ProcessName)//一定要保证 是多字节模式,不然可能会出错
{
    DWORD ProcessId = 0;
    HANDLE hProcessList = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processInfo{ sizeof(PROCESSENTRY32) };
    if (Process32First(hProcessList, &processInfo))
    {
        do {
            if (strcmp(processInfo.szExeFile, ProcessName) == 0)
            {
                ProcessId = processInfo.th32ProcessID;
                break;
            }
        } while (Process32Next(hProcessList, &processInfo));
    }
    CloseHandle(hProcessList);
    return ProcessId;
}
ULONG64 GetModuleBaseAdress(DWORD ProcessId,char* Module)//一定要保证 是多字节模式,不然可能会出错
{
    ULONG64 ModuleBaseAdr = 0;
    char p[20] = { 0 };
    HANDLE ModuleList = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
    MODULEENTRY32 ModuleInfo{ sizeof(MODULEENTRY32) };
    if (Module32First(ModuleList, &ModuleInfo))
    {
        do
        {
            if (strcmp(ModuleInfo.szModule, Module)==0)
            {
                sprintf(p, "%d", ModuleInfo.modBaseAddr);
                ModuleBaseAdr = atoi(p);
//感谢指出 转换可以用
//ModuleBaseAdr =(DWORD)ModuleInfo.modBaseAddr;强转
                break;
            }
 
        } while (Module32Next(ModuleList, &ModuleInfo));
    }
    CloseHandle(ModuleList);
    return ModuleBaseAdr;
}
#include <Windows.h>
#include <iostream>
#include <tlhelp32.h>
#include <vector>
using namespace std;
std::vector<DWORD> GetAllProcessThread(DWORD ProcessId)//一定要保证 是多字节模式,不然可能会出错
{
    std::vector<DWORD>v;
    HANDLE ThreadList = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    THREADENTRY32 ThreadInfo{ sizeof(THREADENTRY32) };
    if (Thread32First(ThreadList, &ThreadInfo))
    {
        do
        {
            if (ThreadInfo.th32OwnerProcessID == ProcessId)
            {
                v.push_back(ThreadInfo.th32ThreadID);
            }
        } while (Thread32Next(ThreadList, &ThreadInfo));
    }
    CloseHandle(ThreadList);
    return v;
}
DWORD GetProcessId(char* ProcessName)//一定要保证 是多字节模式,不然可能会出错
{
    DWORD ProcessId = 0;
    HANDLE hProcessList = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 processInfo{ sizeof(PROCESSENTRY32) };
    if (Process32First(hProcessList, &processInfo))
    {
        do {
            if (strcmp(processInfo.szExeFile, ProcessName) == 0)
            {
                ProcessId = processInfo.th32ProcessID;
                break;
            }
        } while (Process32Next(hProcessList, &processInfo));
    }
    CloseHandle(hProcessList);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-1-20 10:56 被AlphaYang编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (12)
雪    币: 660
活跃值: (206)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主的文章好有意思支持了
2022-1-19 22:28
1
雪    币: 4378
活跃值: (4368)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
确实是新手, 编程多练习就好.   你要转换 char    只是因为你没有习惯 wchar_t

还比如 强制类型转换也不会
ModuleBaseAdr = (DWORD)ModuleInfo.modBaseAddr;

但是不会影响你继续学习,任何编程语言都有一个适应的过程.
2022-1-19 23:18
0
雪    币: 5104
活跃值: (3861)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
3.易语言真的是世界上最好的语言呢
2022-1-20 00:17
0
雪    币: 345
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
Mxixihaha 确实是新手, 编程多练习就好. 你要转换 char 只是因为你没有习惯 wchar_t 还比如 强制类型转换也不会 ModuleBaseAdr = (DWORD)ModuleInfo ...
看到大佬的评价了,半夜朋友叫我起来回帖,一个新号在论坛发帖能得到指点确实不易。

其实我接触C++和C语言有小一年了,但是这期间一直断断续续,中间搞过逆向,后来不敢做大,又去弄网络验证烂七八糟,新语言的实践机会少得多了,最近刚下定决心删掉易语言专攻C++,希望能有个结果吧。
易语言那句话算是调侃?还是梗?不可否认,win32窗口程序易语言确实及其简单上手,但我们确实应该深入探究,不应该浮在表面。
学C++一年多,买了几本书,看了很多网上的教程,说什么让我最头痛的话,那肯定有char char wchar wchar_t LPCWSTR string wstring byte这种字节集字符操作搞得我脑瓜嗡嗡,易语言的原因吧,我不太明白为什么本质上一样的东西需要搞出这么多名字,我遇到的第二个就是C++变量有点小多,我尽力搜集各种优秀源码,然后每句话分解意思,再尝试重新写一遍,写一些类似功能,扩张功能,希望这脚踏实地的走下去能有收获吧。

还需要更多思路,还有更多的路要走,道路很远~愿脚步更长!
2022-1-20 01:03
1
雪    币: 345
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
Mxixihaha 确实是新手, 编程多练习就好. 你要转换 char 只是因为你没有习惯 wchar_t 还比如 强制类型转换也不会 ModuleBaseAdr = (DWORD)ModuleInfo ...
我有新收获会发帖的,求指教
2022-1-20 01:06
0
雪    币: 43
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
欢迎萌新加入C大军
2022-1-20 01:47
0
雪    币: 2028
活跃值: (1096)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那肯定有char char wchar wchar_t LPCWSTR string wstring byte这种字节集字符操作搞得我脑瓜嗡嗡
这几句 太有同感,编译出错时 大多数是这个原因。
2022-1-20 09:39
0
雪    币: 185
活跃值: (2397)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
 加油,从E过渡到C/C++我觉得不是很难,E本就是翻译后的C,而C++只不过是C的拓展罢了,重要的还是学习计算机原理,慢慢来成为大佬指日可待。
2022-1-20 09:59
0
雪    币: 2277
活跃值: (6653)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
10
用C++重新实现一边精易模块,就靠你了
2022-1-20 14:11
1
雪    币: 4605
活跃值: (4527)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
多谢分享,收藏了
2022-1-20 14:56
0
雪    币: 423
活跃值: (501)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
加油,当初这些字节集 字符串操作 相互转换也是头疼到大.文章写的不错,希望多多更新
2022-1-21 08:54
0
雪    币: 188
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
e语言只是那茫茫多的现成模块好用,c则要自己动手写lib。
2022-3-7 11:58
0
游客
登录 | 注册 方可回帖
返回
//