用户名  找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
热搜: 活动 交友 discuz
查看: 453|回复: 7

[源码] 【内存读写】调用系统api,只依赖基础模块和易语言核心模块

[复制链接]

10

主题

25

回帖

207

积分

中级会员

积分
207
QQ
发表于 2024-10-29 01:36:33 | 显示全部楼层 |阅读模式
本帖最后由 闰土 于 2024-10-29 01:43 编辑

为了慢慢摸索学习炫语言,还是从最有趣的方向开始入手
如果有用过易语言的朋友,最初接触易语言也许大多都是从修改游戏这方面开始接触的吧



所以我也从头开始,准备写一个植物大战僵尸修改器,先写了个内存读写的类,暂时算是够用了


上传的压缩包里面只有.xc的源码文件,依赖基础模块,易语言核心模块,其余的都是调用系统api实现的

分享出来给大家参考
我也是刚接触炫语言没几天,也许写的有问题
请大家检查、指教






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

68

主题

332

回帖

1491

积分

管理员

积分
1491
发表于 2024-10-29 13:34:14 | 显示全部楼层
感谢大佬分享, 跟着大佬一起学习

18

主题

44

回帖

278

积分

中级会员

积分
278
发表于 2024-10-29 20:54:18 | 显示全部楼层
盲猜每个函数除了要反复的填同一个PID参数,还要OpenProcess和CloseHandle函数
建议封装成类
增加一个绑定进程函数,绑定进程时OpenProcess,一次搞定。
增加一个解绑进程函数,可以随时手动CloseHandle后再重新绑定新的进程
析构函数里面也CloseHandle(不需要手动CloseHandle函数)

另外。。。炫语言的数据类型里,字节集是一个类,类的操作比易语言的字节集操作舒服太多了
所以读写内存其他的根本不需要,只需要读写字节集就行
取的时候,通过字节集类自带的取方法按需求取出类型
写的时候,通过字节集类自带的置和添加方法,再去写入

试试看,真的会舒服很多

10

主题

25

回帖

207

积分

中级会员

积分
207
QQ
 楼主| 发表于 2024-10-29 21:52:58 | 显示全部楼层
C@iNi@o 发表于 2024-10-29 20:54
盲猜每个函数除了要反复的填同一个PID参数,还要OpenProcess和CloseHandle函数
建议封装成类
增加一个绑定 ...

是的,主要是熟悉一下数据类型转换,而且也是复刻我用易语言写的这个模块,而且只是自己用,目前来说算是够用的,啥时候有时间了改一下就好了,感谢建议

0

主题

7

回帖

22

积分

新手上路

积分
22
发表于 2024-10-30 14:39:34 | 显示全部楼层
还是很支持,兴趣为主很关键

0

主题

4

回帖

62

积分

注册会员

积分
62
QQ
发表于 2024-12-23 23:38:13 | 显示全部楼层
建议添加  取模块地址   我不会

6

主题

10

回帖

144

积分

注册会员

积分
144
QQ
发表于 2024-12-25 03:16:43 | 显示全部楼层
花芯 发表于 2024-12-23 23:38
建议添加  取模块地址   我不会

这个32 64 都可以取

        函数 长整型 取模块基址(文本型 进程名, 文本型 模块名)

               
                字符型 进程名字符[100]
                文本到字符型(进程名, 进程名字符, 取类型大小(进程名字符))
               
                字符型 模块名字符[100]
                文本到字符型(模块名, 模块名字符, 取类型大小(模块名字符))

                #嵌入代码
                wchar_t *processName = 进程名字符; // 进程名
                wchar_t *moduleName = 模块名字符;  // 模块名
                DWORD processId = 取进程ID_(进程名);
                INT64 moduleBaseAddress = 取模块地址_(processId, 模块名);
                XCL_log("进程ID", processId, "模块基址", X_Base_DecToN(moduleBaseAddress, 16));
                return moduleBaseAddress;
                #嵌入代码结束




        函数 长整型 取模块地址_(DWORD 进程ID, 文本型 模块名)
                字符型 模块名字符[100]
                文本到字符型(模块名, 模块名字符, 取类型大小(模块名字符))
                #嵌入代码
                wchar_t *moduleName = 模块名字符;

                HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, 进程ID);
                if (hSnapshot == INVALID_HANDLE_VALUE) {
                        return 0;
                }

                MODULEENTRY32 me32;
                me32.dwSize = sizeof(MODULEENTRY32);

                if (Module32First(hSnapshot, &me32)) {
                        do {
                                if (wcscmp(me32.szModule, moduleName) == 0) {
                                        uintptr_t moduleBaseAddress = reinterpret_cast<uintptr_t>(me32.modBaseAddr);
                                        CloseHandle(hSnapshot);
                                        return moduleBaseAddress;
                                }
                        } while (Module32Next(hSnapshot, &me32));
                }

                CloseHandle(hSnapshot);
                return 0;
                #嵌入代码结束


        函数 长整型 取进程ID_(文本型 进程名)
                字符型 进程名字符[100]
                文本到字符型(进程名, 进程名字符, 取类型大小(进程名字符))
       
                #嵌入代码
                wchar_t *processName = 进程名字符;

                HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
                if (hSnapshot == INVALID_HANDLE_VALUE) {
                        return 0;
                }

                PROCESSENTRY32 pe32;
                pe32.dwSize = sizeof(PROCESSENTRY32);

                if (Process32First(hSnapshot, &pe32)) {
                        do {
                                if (wcscmp(pe32.szExeFile, processName) == 0) {
                                        DWORD processId = pe32.th32ProcessID;
                                        CloseHandle(hSnapshot);
                                        return processId;
                                }
                        } while (Process32Next(hSnapshot, &pe32));
                }

                CloseHandle(hSnapshot);
                return 0;
                #嵌入代码结束

6

主题

10

回帖

144

积分

注册会员

积分
144
QQ
发表于 2024-12-25 03:24:58 | 显示全部楼层
花芯 发表于 2024-12-23 23:38
建议添加  取模块地址   我不会

这个漏了..

函数 空类型 文本到字符型(文本型 文本, 字符型* 缓冲区, 整型 缓冲区大小)
        如果 (缓冲区 == NULL || 缓冲区大小 < 文本.取大小() + 1)
                返回 // 缓冲区不足

        计次循环 (整型 i = 0; 文本.取大小())
                缓冲区 = 文本.取字符(i)

        缓冲区[文本.取大小()] = '\0' // 确保末尾添加终止符
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|炫语言 | 炫彩界面库 | 用户所需, 正是我所做! ( 鄂ICP备2023014763号-1 )

GMT+8, 2025-4-8 02:49 , Processed in 0.079364 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表