书香雨

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 70|回复: 0

【单电脑多开配置的框架设计】

[复制链接]

494

主题

517

帖子

158万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1584373
发表于 2025-9-28 14:23:55|字数:4,049 | 显示全部楼层 |阅读模式
技术点:
进程id
读写配置项
文件枚举
循环结构的应用
md5校验

每个软件启动的时候,系统会随机分配一个进程id,我们可以将当前的数据(账号,状态码等)与进程id进行绑定,如果进程id不存在,则说明该进程已退出,因此我们可以在登录成功的时候记录数据,软件初始化完成后清理数据

回到上一个问题
假设后台多开数设置为:10,现在7号程序(登录顺序为7)闪退掉线,在正常退出情况下,我们可以在程序退出的时候执行“退出函数”通知服务器后台,但是闪退的时候无法执行这个通知,这意味着后台的7号程序的状态码不会删除,后台认为7号程序依旧在线

当我们再登录一个程序的时候,这个程序在启动后会执行清理初始化,7号程序的进程id不存在,我们读取绑定的数据(账号,状态码等),执行退出指令,退出不成功弹出提示并结束软件


拓展:
但是这会存在一种极端情况,比如7号程序的进程id是:123,虽然7号程序已经闪退,但是我们又运行了一个新的程序,分配的进程id刚好也是:123

为了解决这个问题,我们可以判断md5

7号程序登录后,记录自身的md5到数据里,我们清理判断的时候,取当前进程123程序的md5,然后与记录值比较,不一样说明这个123不是7号程序,7号程序已经闪退,如此一来,多开问题就完美解决了


【源码-记录函数】(以易语言为例)

  
子程序名返回值类型公开备 注
易游_多开配置_记录逻辑型成功返回真,失败返回假
参数名类 型参考可空数组备 注
程序名称文本型   
用户名文本型   
状态码文本型   
变量名类 型静态数组备 注
数据目录文本型  
进程id整数型  
数据路径文本型  
自身数据字节集  
自身数据md5文本型  
数据目录 = 取特定目录 (1)“易游多开配置\” + 程序名称 + “\”
目录_创建 (数据目录)
进程id = 进程_取自进程ID ()
数据路径 = 数据目录 + 到文本 (进程id)“.dk”
写配置项 (数据路径, “data”, “用户名”, 用户名)
写配置项 (数据路径, “data”, “状态码”, 文本_加密 (状态码, 程序名称 + 用户名))
自身数据 = 读入文件 (数据路径)
自身数据md5 = 校验_取md5 (自身数据)
写配置项 (数据路径, “data”, “md5”, 自身数据md5)
判断 (读配置项 (数据路径, “data”, “用户名”, “”) ≠ 用户名)  ' 记录失败
返回 ()




判断 (读配置项 (数据路径, “data”, “状态码”, “”)文本_加密 (状态码, 程序名称 + 用户名))  ' 记录失败
返回 ()




判断 (读配置项 (数据路径, “data”, “md5”, “”) ≠ 自身数据md5)  ' 记录失败
返回 ()




返回 ()


i支持库列表   支持库注释   
shell操作系统界面功能支持库


【代码解析】
引入参数“程序名称”:
这是考虑了多个程序的情况,不同的程序名称代表不同的程序,退出地址也不相同,这是为了防止程序之间的登录数据互相影响

状态码加密:
状态码写出加密是防破解的操作,每一个细节都要做好

结构设计:
不同的程序名称对应不同的目录,每一次的登录数据则单独写出一个配置文件,账号、状态码等数据则存储在配置文件中

图片.png

图片.png

【源码-清理函数】(以易语言为例)
  
子程序名返回值类型公开备 注
易游_多开配置_清理文本型清理失败返回清理失败的数据路径,成功返回空
参数名类 型参考可空数组备 注
程序名称文本型   
访问方式整数型   0为使用WinInet的方式访问易游_网页,1为使用WinHttp对象的方式访问易游_网页
易游退出函数api地址文本型   
变量名类 型静态数组备 注
数据目录文本型  
数据成员文本型 0
数据路径文本型  
n整数型  
i整数型  
进程id整数型  
用户名文本型  
状态码文本型  
进程路径文本型  
进程数据字节集  
进程md5_当前值文本型  
进程md5_记录值文本型  
返回值文本型  
数据目录 = 取特定目录 (1)“易游多开配置\” + 程序名称 + “\”
n = 文件_枚举 (数据目录, “*.dk”, 数据成员, 真, , )
计次循环首 (n, i)
数据路径 = 数据成员
进程id = 到整数 (文件_取文件名 (数据路径))
判断 (进程_ID是否有效 (进程id))
用户名 = 读配置项 (数据路径, “data”, “用户名”, “”)
状态码 = 读配置项 (数据路径, “data”, “状态码”, “”)
状态码 = 文本_解密 (状态码, 程序名称 + 用户名)
返回值 = 易游_退出登录 (访问方式, 易游退出函数api地址, 状态码, 用户名)
' 1:   退出成功
' -103:请先登陆再调用此方法,状态码后台不存在
' 退出的目的也是为了让状态码不存在,因此返回-103任务是执行成功
判断 (返回值 ≠ “1” 返回值 ≠ “-103”)
' 信息框 (“[” + 数据路径 + “]执行退出失败,请重启软件”, 0, , )
' 结束 ()
返回 (数据路径)




文件_删除 (数据路径)




进程路径 = 进程_PID取路径 (进程id)
进程数据 = 读入文件 (进程路径)
进程md5_当前值 = 校验_取md5 (进程数据, , )
进程md5_记录值 = 读配置项 (数据路径, “data”, “md5”, “”)
' 如果不相等,说明目标程序进程已退出,同时运行了一个新的程序,新程序注册的进程id与目标程序进程id恰好相等
判断 (进程md5_当前值 ≠ 进程md5_记录值)
用户名 = 读配置项 (数据路径, “data”, “用户名”, “”)
状态码 = 读配置项 (数据路径, “data”, “状态码”, “”)
状态码 = 文本_解密 (状态码, 程序名称 + 用户名)
返回值 = 易游_退出登录 (访问方式, 易游退出函数api地址, 状态码, 用户名)
判断 (返回值 ≠ “1” 返回值 ≠ “-103”)
返回 (数据路径)



' 调试输出 (用户名, 状态码)
文件_删除 (数据路径)





计次循环尾 ()
返回 (“”)


i支持库列表   支持库注释   
shell操作系统界面功能支持库


【代码解析】
清理函数通过文件枚举的方法得到程序目录下的文件数据,文件名就是进程id,判断进程id是否存在
如果不存在,则执行退出函数
如果存在,则判断当前进程的md5与记录值md5是否相等,不相等,说明程序已闪退,后面又运行了某个程序,两者id恰好相同,需要执行退出函数

返回:【多开配置框架-总览】
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|书香雨 ( 湘ICP备17011672号-3 )

GMT+8, 2025-10-8 02:50 , Processed in 0.101847 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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