jy00369213 发表于 2022-7-25 19:05

用E语言写的游戏登录器,经常出现错误,求指教

各位大佬好,我的这个E语言程序也是朋友帮忙写的,但是问题还蛮多的。详情大家帮忙看看,解决一下问题
先放上两个经常出问题的两个截图

登录器的思路是:读取服务器的MD5值,如果不一样,就从服务器下载对应的文件进行替换。代码如下:
' 下载配置文件
配置文件名 = “list.ini” ' 服务器上存放的配置文件的名称
.如果真 (数据_list = { })
数据_list = HTTP读文件 (网址目录 + 配置文件名)
.如果真 (数据_list = { })
信息框 (“更新文件,下载配置文件失败:” + 配置文件名, 0, “更新失败”, _启动窗口)
返回 ()
.如果真结束

.如果真结束
进度条1.位置 = 1


' 写出配置文件
路径 = 取运行目录 () + “\”
文件名 = 路径 + 配置文件名
.如果真 (取数据摘要 (数据_list) ≠ 取数据摘要 (读入文件 (文件名)))
.如果真 (假 = 写到文件 (文件名, 数据_list))
信息框 (“更新文件,写出配置文件失败:” + 配置文件名, 0, “更新失败”, _启动窗口)
返回 ()
.如果真结束

.如果真结束
进度条1.位置 = 2


' 从配置文件读取更新数据
节组 = 取配置节名 (文件名)
.如果真 (取数组成员数 (节组) ≤ 0)
' 信息框 (“无需更新。”, 0, “更新完成”, _启动窗口)
进度条1.位置 = 100
返回 ()
.如果真结束
.计次循环首 (取数组成员数 (节组), 次数)
文本1 = 读配置项 (文件名, 节组 [次数], “md5”, )
文本2 = 读配置项 (文件名, 节组 [次数], “dir”, )
.如果真 (文本1 ≠ “” 且 文本2 ≠ “”)
加入成员 (文件名组, 节组 [次数])
加入成员 (md5组, 文本1)
加入成员 (目录组, 文本2)
.如果真结束

.计次循环尾 ()
.如果真 (取数组成员数 (md5组) ≤ 0)
' 信息框 (“无需更新。”, 0, “更新完成”, _启动窗口)
进度条1.位置 = 100
返回 ()
.如果真结束


进度条1.最大位置 = 取数组成员数 (md5组) + 2
进度条1.位置 = 2
' 更新本地文件
文本1 = 取运行目录 ()
.计次循环首 (取数组成员数 (md5组), 次数)
' 读出待更新的本地文件
.如果 (取文本左边 (目录组 [次数], 1) ≠ “\”)
文件路径 = 目录组 [次数]
.否则
文件路径 = 文本1 + 目录组 [次数]
.如果结束
数据_本地 = 读入文件 (文件路径)


' 计算本地文件的MD5
md5_临时 = 取数据摘要 (数据_本地)
' 下面:判断MD5是否符合服务器提供的要求,不符合则下载,符合则略过
.如果真 (md5_临时 ≠ md5组 [次数])

' 从服务器下载文件
数据_下载 = HTTP读文件 (网址目录 + 文件名组 [次数])
md5_临时 = 取数据摘要 (数据_下载)
.如果真 (md5_临时 ≠ md5组 [次数])
信息框 (“更新文件,下载失败:” + 文件名组 [次数], 0, “更新失败”, _启动窗口)
返回 ()
.如果真结束

' 覆盖写出更新本地文件
创建目录 (取文本左边 (文件路径, 倒找文本 (文件路径, “\”, , 假) - 1))
.如果真 (写到文件 (文件路径, 数据_下载) = 假)
信息框 (“更新文件,写出失败:” + #换行符 + 文件路径, 0, “更新失败”, _启动窗口)
返回 ()
.如果真结束

.如果真结束

进度条1.位置 = 2 + 次数
.计次循环尾 ()


然后前面有一些代码是加载E语音的图片资源表:代码如下:


.版本 2
.支持库 iext

.子程序 _窗口化监视_周期事件

透明标签3.标题 = “”
Audition句柄 = FindWindowA (0, “Audition”)
.如果 (进程_是否存在 (“Audition.exe”, 假) = 真)
    Audition句柄 = FindWindowA (0, “Audition”)

    .如果真 (IsWindow (Audition句柄))
      SetParent (Audition句柄, 游戏窗口.取窗口句柄 ())
      MoveWindow (Audition句柄, 到整数 (主程序左边), 到整数 (主程序顶边), 到整数 (主程序宽度), 到整数 (主程序高度), 真)
      是否启动 = 真
      游戏窗口.宽度 = 到整数 (游戏窗口宽度)
      游戏窗口.高度 = 到整数 (游戏窗口高度)
      游戏窗口.左边 = 到整数 (游戏窗口左边)
      游戏窗口.顶边 = 到整数 (游戏窗口顶边)
      游戏窗口.可视 = 真
      窗口化监视.时钟周期 = 0
      _启动窗口.可视 = 假
      载入 (按钮窗口, 游戏窗口, 假)
      移动按钮窗口 ()

    .如果真结束


.否则
    _启动窗口.可视 = 真
.如果结束





.子程序 LoadLibraryA_Li, 逻辑型, 公开
.参数 进程句柄, 整数型
.参数 文件名, 文本型, , 全路径
.局部变量 AllocMem, 整数型
.局部变量 Injector, 整数型
.局部变量 hThread, 整数型
.局部变量 length, 整数型

length = 取文本长度 (文件名) + 1
AllocMem = VirtualAllocExc (进程句柄, 0, length, 4096, 64)
.判断开始 (AllocMem > 0)
    WriteProcessMemoryc (进程句柄, AllocMem, 文件名, length, 0)
    Injector = API_GetProcAddressc (API_GetModuleHandlec (“kernel32.dll”), “LoadLibraryA”)
    hThread = CreateRemoteThreadc (进程句柄, 0, 0, Injector, AllocMem, 0, 0)
    API_WaitForSingleObjectc (hThread, 10 × 1000)
    VirtualFreeExc (进程句柄, AllocMem, length, 32768)
    CloseHandlec (hThread)
    返回 (真)
.默认
    返回 (假)
.判断结束


.子程序 _go2_被单击


.判断开始 (选择框2.选中 = 真)
    游戏窗口宽度 = “1024”
    游戏窗口高度 = “797”
    游戏窗口顶边 = “35”
    游戏窗口左边 = “200”

    主程序宽度 = “1024”
    主程序高度 = “768”
    主程序顶边 = “0”
    主程序左边 = “0”


.默认

.判断结束
.判断开始 (选择框2.选中 = 假)
    游戏窗口宽度 = “1024”
    游戏窗口高度 = “797”
    游戏窗口顶边 = “35”
    游戏窗口左边 = “200”

    主程序宽度 = “1024”
    主程序高度 = “737”
    主程序顶边 = “33”
    主程序左边 = “0”

.默认

.判断结束

写到文件 (“C:\Windows\SysWOW64\cps.sys”, #cps)
置文件属性 (“C:\Windows\SysWOW64\cps.sys”, 1)
.判断开始 (选择框1.选中 = 真)
    写到文件 (取运行目录 () + “\TaskKeyHookCN.dll”, #fps1000)' 写出1000针DLL文件
.默认
    写到文件 (取运行目录 () + “\TaskKeyHookCN.dll”, #fps60)' 写出1000针DLL文件
.判断结束
写到文件 (取运行目录 () + “\Audition.exe”, #audition)
加载默认补丁 ()


最后进入游戏还有一段代码,代码如下:
.版本 2

.子程序 正式进入游戏
.局部变量 进程ID, 整数型
.局部变量 游戏目录, 文本型
.局部变量 进程句柄, 整数型
.局部变量 目录, 文本型


判断A = 0
载入 (游戏窗口, , 假)
游戏窗口.可视 = 假


进程ID = 进程_创建 (取运行目录 () + “\Audition.exe”, “\Audition /T3ENTER ” + ip)
进程句柄 = OpenProcess (#PROCESS_ALL_ACCESS, 假, 进程ID)
LoadLibraryA_Li (进程句柄, 取运行目录 () + “\libAuLanderHook.dll”)
CloseHandlec (进程句柄)
进程ID = 0
窗口化监视.时钟周期 = 1000


.子程序 _按钮3_被单击

销毁 ()


.子程序 加载默认补丁


从逻辑上讲貌似没有什么问题,但实际进入后确实问题不少,并且登录器在运行下载时会假死无响应。
如果有大佬愿意帮忙感激不尽!提前谢谢大佬了

你好,再见 发表于 2022-7-25 19:05

取数据摘要 ( ) 这个命令不能用于大文件,看看你要取md5的文件大小是多少,超过100M就很容易出错
建议采用多线程取md5,内存映射文件什么的
网上有相关模块{:301_998:}

syg521 发表于 2022-8-12 12:19

这是问道登录器么
页: [1]
查看完整版本: 用E语言写的游戏登录器,经常出现错误,求指教