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

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

2022-1-19 21:40
24499

铺垫:

自从我们从易语言换到C++,一些易语言中的简单操作却很难实现,比如精易模块用的如此熟络的“进程_名取 ID()”,又或者是为了一个功能专门添加一个模块的“追风__取模块句柄()”,这些都可以在今天的探究里得以解决~

准备:

1.Vs2019(别的也行)2.百度 3.一颗优秀的大脑 4.一个对象(估计你没有,我也没有)

准备完毕的话,咱们开工

开始:

他非要和我试试,我说可以。诶…我一说完他啪就站起来了,很快啊!找到了这几个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
);

必须要说一下,在创建快照的时候,进程快照和线程快照都不需要th32ProcessID的参数,我们直接填写0就可以,但是指定进程的模块快照需要填写该进程的ID

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
#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;
}

拿取模块地址讲讲,其他的都是以此类推的繁琐操作,作为浑元形意太极门掌门人的你们肯定不会有问题啊

1.第一步,声明变量

1
2
ULONG64 ModuleBaseAdr = 0;//模块地址 长整数来存
char p[20] = { 0 };//一会字节转字节集要用

2.第二步创建快照,获取快照句柄

1
HANDLE ModuleList = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);

TH32CS_SNAPMODULE是指所有的模块,id指定进程

3.第三步,构造模块信息结构体

1
MODULEENTRY32 ModuleInfo{ sizeof(MODULEENTRY32) };

也可以先构造,随后设置大小

4.第四步,判断能否获取,循环取出

1
if (Module32First(ModuleList, &ModuleInfo))

Module32First会返回一个布尔变量,如果该变量为false,说明我们因为一些原因无法获取,直接结束吧,如果为true,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
do
        {
            if (strcmp(ModuleInfo.szModule, Module)==0)
            {
                sprintf(p, "%d", ModuleInfo.modBaseAddr);
                ModuleBaseAdr = atoi(p);
                break;
//感谢指出 转换可以用
//ModuleBaseAdr =(DWORD)ModuleInfo.modBaseAddr;强转
            }
 
        } while (Module32Next(ModuleList, &ModuleInfo));

我们在Module32First中将进程快照的第一号进程信息写入了ModuleInfo中,所以我们先取信息,然后循环,strcmp(ModuleInfo.szModule, Module)可以帮我们比较是否是我们需要的模块名称。

如果是,那就取出当前模块的地址,受限于ModuleInfo.modBaseAddr的类型是字节,那我们用一步转换就好了,刚才的char p也排上了用处,最后atoi转换长整数,跳出循环,逻辑闭环。

如果不是,那就通过Module32Next(ModuleList, &ModuleInfo)取顺次的下一个模块信息,继续循环

最后:

1.选择多字节方案

2.百度可以解决很多问题

3.易语言真的是世界上最好的语言呢

4.看雪新人·多多指教


【公告】 讲师招募 | 全新“预付费”模式,不想来试试吗?

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

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

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

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

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