From e599e1d7a094678696a15dd7d9da8ddc8f85de3e Mon Sep 17 00:00:00 2001 From: Mingxu Ye <142279449+MaxLHy0424@users.noreply.github.com> Date: Sun, 25 Aug 2024 18:55:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91=20CRCSN=20v5.0.0=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 修改退出函数名称 * feat: release 编译禁用断言 * feat: 将所有 'TheCursor' 替换为 'Cursor' * feat: 修改窗口尺寸 * feat: 清理代码 * docs: 更新下载源 * feat: 清理代码 * feat: 修改调试配置 * feat: 优化启动提示 * feat: 修改函数名 * feat: 添加 Cmd * revert: 回退窗口大小的更改 * style: 清理代码 * refactor: 清理代码 * build: 修改编译的二进制文件名称 * rm: 移除分支显示 * style: 优化代码书写 * change: 修改个别标识符 * rm: 移除 "移除" * change: 修改命名空间 * build: 修改标签名 * chore: 修改调试的二进制文件 * feat: 添加评估副本提示 * change: 修改 head.hpp 为 ld.hpp * docs: 修改下载链接 (暂不可用) * docs: 修改大小写 * docs: 跟进最新开发副本 * fix: 修复标题乱码 * docs: 移除多余标点 * change: 修改 CMd 路径 * chore: 禁用调试优化 * change: 定义类 Menu 时将构造对象 UI * build: 重构 Makefile, 添加清理功能 * change: 修改启动文件 * rm: 移除非管理员权限下的 "破解" 选项. * docs: 跟进开发版 * change: 在 void 函数后加上 return * docs: 更新文档 * change: 修改函数 * change: 将函数定义改为 C++ 20 引入的方式 * change: 修改版本号 * docs: 将所有软件专有名词的字体改为斜体 * rm: 移除所有返回值为 void 的函数末尾的无用 return 语句 * fix: 默认初始化 Opt * fix: 修复数据类型不符 * change: 修改窗口不透明度 * refactor: 重构 launcher * docs: 修改启动参数部分 * change: 修改缓存变量 * change: 添加 .gitkeep 说明 * refactor: 优化规则初始化 * change: 修改部分标识符的命名 * change: 调整变量声明未知 * change: 修改破解/恢复基本函数 * change: 修改函数 * change: 修改头文件 * change: 优化判断语句兼容性 * docs: 更新文档 * change: 修改版本号 * change: 修改变量定义位置 * fix: 修复启动错误 * change: 加一个空格 * change: 修改窗口大小 * change: 修改命令函参数错误提示 * change: 修改静态分析配置 * change: 修改调试配置 * fix: 修复部分系统不兼容的问题 * docs: 更新描述 * docs: 修复几处描述谬误 * refactor: 修改类型标识符大小写 * rm: 移除最后一行的 exit * change: 修改变量名 * change: 修改函数传参 * docs: 添加帮助信息 * change: 默认窗口大小 * docs: 更新下载链接 * chore: 修改工作区配置 * chore: 清空提示内容 * chore: 调整顺序 * refactor: 将所有宏定义改为全大写+下划线分割的方式, 将部分不等于操作改为异或 * refactor: 修改文件名 * fix: 修改字符集和退出 cmd 后的输出没有即使清除 * change: 抛弃分支区分, 改为使用 start 命令启动, 屏蔽字符集更改输出 * change: 跳过检测 /command 参数 (launcher.cmd 需要) * change: 重命名 logo.png, 并移至 img 下 * build: 给二进制文件添加图标 * docs: 修改下载信息 * chore: 将所有 cpp 代码文件移入 src * build: 修改 cpp 文件路径 * refactor: 合并 Crack 和 Recovery 的 Base 函数为 OpBase 函数 * chore: 修改伪文件 * rm: 移除多余分号 * docs: 修改鸣谢 * build: 修改编译文件路径 * change: 修改启动路径 * chore: 添加 .gitkeep * chore: 调整顺序 * chore: 修改调试配置 * rm: 移除 bin/x86_64/.gitkeep * build: 优化创建目录 * build: 优化创建目录 * build: 优化创建目录 * build: 优化创建目录 * build: 优化创建目录 * fix: 类型不符 * change: 使用 typedef 修改部分数据类型名称 * rm: 移除退出码 * change: 修改标题 * change: 窗口控件设置变量名称 * change: 修改依赖项 * build: 合并 clean_std 与 clean_full * chore: 添加换行 * build: 指定 favicon.ico 架构, 移除创建 .gitkeep * change: 标题缩进 * change: 移除结构体名 * build: 添加检测 src 下所有文件 * build: 检测构建生成目录 * build: 修改变量名 * build: 修复重复构建 * fix: 标题缩进不协调 * fix: 提示文本错误 * change: 函数 OpBase 为 OpCore * change: Exit() 函数调用改成宏定义 * change: 回退自定义类型 * rm: 不需要的宏定义 * feat: 启动提示 (在 Microsoft Defender 执行云扫描时防止用户以为软件卡死了) * style * fix: 类型不正确 * change: OpBase 函数模式说明字符 * docs: update * style * chore: 修改编译命令 * build: 添加 -C 选项 * fix: 遗漏使用宏定义 * chore: 修改调试配置 * feat: 添加宽松视图 * style * style: 提升可读性 * fix: 错误的命令参数意外生效 * change: 命令行参数报错提示 * refactor: 标识符名 * change: 提示文本 * change: 默认改为紧凑视图 * docs: update * refactor: 标识符名 * chore: 修改调试配置 * build: update * revert: 命令行参数报错 * build: 修改标识符名 * style * style * build: clean * refactor: 修改临时变量名 * change: 文件名 * ci: update * revert: 等式判断 * change: 命名空间 CRCSN 改名为 Pvt (即 Private) * refactor: 等于/不等于判断 * perf: 改 std::string 为 const char* * change: 版本号 * style * change: 使用自定义数据类型别名 * perf: 移除 sleepTime 变量 * change: 使用 const char* 的自定义别名 cstr * style * change: 变量名 * change: 禁用评估副本 * change: 临时变量的变量名 * perf: 优化无参数时的性能 * change: 选项错误存储变量名称 * docs: update * style * fix: 与 launcher.cmd 书写顺序不一致 * docs: update * change: 修改参数报错 * docs: update * docs: update * perf: 优化头文件引用 * style * change: 私有函数库命名空间 * docs: fix * fix: 检测到错误命令行参数后没能及时终止 * change: 临时变量名称 * change: output * change: 回退发行版类别 * fix * style * docs: update * feat: 添加通道机制 * style * docs: update * fix: 再次从 conhost 启动软件并附加参数 -Wc 后, 窗口仍未锁定状态 * fix: 在线程分离前切换前端窗口导致置顶窗口发生异常 * change: 锁定窗口不再禁用最小化窗口控件 * change: 切换通道 * build * refactor * change: 通道名大小写 * change: 通道名 * change: 通道名 * style * revert * style * refactor: 将暴露在外的函数移入类 CUI, 访问权限为 protected. * refactor: 命名空间名 * fix: 通道错误 * docs: 完善说明 * docs: fixed * refactor: 临时变量标识符名 * feat: 退出按钮高亮为红色 * style * refactor: 退出按钮高亮改为使用宏定义 * change: 退出按钮默认颜色 * change: 退出按钮高亮颜色 * change: output * change: tips * refactor * refactor: 移除不需要的文本运算符 * change: 分支名 * change: 浅色颜色的宏定义名改为后置 PALE * docs: revert * docs: fix * build: update clean * docs: fix * chore: changed * style * change: 允许修改窗口大小的参数 * docs: update * refactor: 部分宏定义名 * change: output * change: 通道名大小写 * change: 头文件名 * refactor: 缓存变量名称 * build: refactor * docs: update link * docs: fix * refactor: 类和结构体的构造函数使用统一初始化 * refactor: 私有模块头文件名称 * revert: 私有模块头文件名称 * refactor: 私有模块命名空间名 * change: 自定义通道显示大小写 * refactor: 参数错误标识符 * refactor * change: 窗口透明度 * docs: update * refactor: 将 _exit 移入私有模块内 * docs: fix * fix: 退出后窗口缩放控件仍被禁用 * change: 通道 * build: fix --- .vscode/c_cpp_properties.json | 31 +++-- .vscode/launch.json | 4 +- .vscode/tasks.json | 12 +- LICENSE | 4 +- Makefile | 23 +++- README.md | 144 +++++++++++++------- bin/.gitkeep | 1 - extern.hpp | 30 ---- favicon.rc | 1 + img/favicon.ico | Bin 0 -> 1499 bytes img/title.png | Bin 0 -> 5762 bytes launcher.cmd | 40 ++++-- logo.png | Bin 18499 -> 0 bytes main.cpp | 250 ---------------------------------- src/header.hpp | 12 ++ src/main.cpp | 84 ++++++++++++ src/modules.hpp | 127 +++++++++++++++++ src/ui.hpp | 214 +++++++++++++++++++++++++++++ 18 files changed, 614 insertions(+), 363 deletions(-) delete mode 100644 extern.hpp create mode 100644 favicon.rc create mode 100644 img/favicon.ico create mode 100644 img/title.png delete mode 100644 logo.png delete mode 100644 main.cpp create mode 100644 src/header.hpp create mode 100644 src/main.cpp create mode 100644 src/modules.hpp create mode 100644 src/ui.hpp diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index c5db5fee0..eb94cc666 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -1,29 +1,32 @@ { - "configurations": [ + "configurations":[ { - "name": "Win32", - "includePath": [ + "name":"Win32", + "includePath":[ "${workspaceFolder}\\*" ], - "defines": [ + "defines":[ "_DEBUG", "UNICODE", "_UNICODE" ], - "compilerPath": "C:\\Software\\MSYS2\\ucrt64\\bin\\g++.exe", - "compilerArgs": [ + "compilerPath":"C:\\Software\\MSYS2\\ucrt64\\bin\\g++.exe", + "compilerArgs":[ "-fexec-charset=GBK", - "-lm", + "-Wall", + "-Wextra", + "-DNDEBUG", "-static", "-Ofast", - "-Os" + "-Os", + "-flto" ], - "intelliSenseMode": "windows-gcc-x64", - "cStandard": "c23", - "cppStandard": "gnu++23", - "mergeConfigurations": false, - "configurationProvider": "ms-vscode.makefile-tools" + "intelliSenseMode":"windows-gcc-x64", + "cStandard":"c23", + "cppStandard":"gnu++23", + "mergeConfigurations":false, + "configurationProvider":"ms-vscode.makefile-tools" } ], - "version": 4 + "version":4 } \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 4dd204c35..cde49a3c6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,10 +5,10 @@ "name":"Debug", "type":"cppdbg", "request":"launch", - "program":"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe", + "program":"${workspaceRoot}\\bin\\__debug__.exe", "args":[], "stopAtEntry":false, - "cwd":"${fileDirname}", + "cwd":"${workspaceRoot}", "environment":[], "externalConsole":true, "internalConsoleOptions":"neverOpen", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 5220d2019..aa31eb5ca 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,14 +5,18 @@ "type":"shell", "command":"g++", "args":[ - "\"${file}\"", + "src/main.cpp", + "-C", "-fexec-charset=GBK", "-std=gnu++23", "-Wall", "-Wextra", - "-g", + "-pipe", + "-m64", + "-O0", + "-g3", "-o", - "\"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe\"", + "bin/__debug__.exe", ], "group":{ "kind":"build", @@ -30,7 +34,7 @@ "label":"run", "type":"shell", "dependsOn":"build", - "command":"${fileDirname}\\bin\\${fileBasenameNoExtension}.exe", + "command":"${workspaceRoot}/bin/__debug__.exe", "group":{ "kind":"test", "isDefault":true diff --git a/LICENSE b/LICENSE index 1894c0fd1..c2755fe94 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 MaxLHy0424 +Copyright (c) 2023 MaxLHy0424 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/Makefile b/Makefile index 7d446e185..9b1a3e761 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,21 @@ -main: - g++ main.cpp -fexec-charset=GBK -std=gnu++23 -Wall -Wextra -static -Ofast -Os -flto -o .\bin\main.exe \ No newline at end of file +msys2 = C:\\Software\\MSYS2 +argv = -fexec-charset=GBK -C -std=gnu++23 -Wall -Wextra -pipe -m64 -DNDEBUG -static -Ofast -Os -flto -o +build: bin/x86_64/main-msvcrt.exe bin/x86_64/main-ucrt.exe +bin/x86_64: + $(msys2)\\usr\\bin\\mkdir.exe bin/x86_64 -p +bin: bin/x86_64 +neededFile = src/main.cpp bin/favicon.o +bin/x86_64/main-msvcrt.exe: $(neededFile) src/*.hpp bin + $(msys2)\\mingw64\\bin\\g++.exe $(neededFile) $(argv) $@ +bin/x86_64/main-ucrt.exe: $(neededFile) src/*.hpp bin + $(msys2)\\ucrt64\\bin\\g++.exe $(neededFile) $(argv) $@ +bin/favicon.o: favicon.rc img/favicon.ico bin + $(msys2)\\usr\\bin\\windres.exe -i $< -o $@ -F pe-x86-64 +clean_std: + $(msys2)\\usr\\bin\\rm.exe -rf\ + bin/__debug__.exe\ + bin/favicon.o +clean_full: clean_std + $(msys2)\\usr\\bin\\rm.exe -rf\ + bin/x86_64 +.PHONY: build clean_std clean_full \ No newline at end of file diff --git a/README.md b/README.md index 6ecac041f..ddefe6d62 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,141 @@ -![logo](logo.png)\ +![logo](img/title.png)\ **Computer Room Control Software Nemesis: 轻松破解机房控制.**\ -©️ 2024 MaxLHy0424, All Rights Reserved. +©️ 2023 MaxLHy0424. All Rights Reserved. -[下载最新发行版 (v4.10.7).](https://github.com/MaxLHy0424/CRCSN/releases/download/v4.10.7/CRCSN_v4-10-7_x64.7z) +# 获取 -# 使用方法 +**最新发行版: v5.0.0.**\ +**[更新日志](https://github.com/MaxLHy0424/CRCSN/releases/tag/v5.0.0) | [直链下载](https://github.com/MaxLHy0424/CRCSN/releases/download/v5.0.0/CRCSN-v5.0.0.7z)** -**CRCSN 涉及到修改注册表等操作, 使用时建议关闭防病毒软件. 若 CRCSN 被报为恶意软件, 请添加排除项.** +或者: -> 仅为最新发行版编写, 其他版本可能有所不同. +- [GitHub Repository Release](https://github.com/MaxLHy0424/CRCSN/releases); +- [中国大陆云盘镜像站点 (不含预发行版)](https://www.123pan.com/s/UzthTd-MkTRh.html). -## 0 启动 +# 使用指南 -一般情况下, 运行`launcher.cmd`即可启动 CRCSN. +**由于 CRCSN 存在敏感操作, 使用时建议关闭防病毒软件. 若 CRCSN 被报为恶意软件, 请添加排除项.** + +> [!NOTE] +> 适用于 v5.0.0. + +## 1 启动 + +一般情况下, 运行 `launcher.cmd` 即可启动 CRCSN. 如果默认的启动方式不满足您的需求, 可以根据下文修改. -### 0.1 强制以管理员限运行 +### 1.1 修改软件 Runtime 找到: -```Batch -: MSHTA VBScript:CreateObject("Shell.Application").ShellExecute("%~S0","GoTo:RunAs","","RunAs",1)(Window.Close) & GoTo:EOF + +```dos +set runtime=msvcrt ``` -将开头的`: `去掉即可. 再运行启动脚本, 将会启用该项. +软件支持的 Runtime 如下: -如需禁用, 将`: `加回去头即可. + - `msvcrt` (默认): 开发工具链为 *MSYS2* `mingw-w64-x86_64-toolchain`, Runtime 为老旧的 *Microsoft Visual C Runtime*, 支持大部分 Windows OS. + - `ucrt` (推荐): 开发工具链为 *MSYS2* `mingw-w64-ucrt-x86_64-toolchain`, Runtime 为新式的 *Universal C Runtime*, 支持 Windows 10 以上的 Windows OS (部分 Windows OS 在安装最新补丁后支持运行). -### 0.2 修改等待时间 +根据上述内容, 选择需要版本的对应字符串替换即可. + +### 1.2 窗口操作 + +> [!IMPORTANT] +> 此命令行参数区分大小写. 找到: -```Batch -TimeOut /NoBreak /T 2 + +```dos +set argv= ``` -修改最后的数字 (单位: 秒), 禁用可改为`0`. -### 0.3 修改控制台颜色 +窗口操作的主参数为 `-W`, 附加参数如下: -> 此项参数区分大小写. + - `f`: 置顶窗口并每间隔 100ms 将窗口设为焦点. + - `s`: 允许缩放和最大化窗口 (可能导致意外行为); + - `a`: 将窗口不透明度设为 80% (仅支持新版控制台); -找到倒数第二行, 在末尾加上`-color=`, 并在后面添加参数 (详见`Color`命令帮助), 例如: -```Batch -.\bin\main.exe -color=3 +不可以仅使用主参数, 附加参数的顺序不影响应用效果. + +使用示例: + +```dos +set argv=-Wa +``` + +```dos +set argv=-Wfas ``` -### 0.4 窗口置顶 +### 1.3 疏松视图 -> 此项参数区分大小写. +> [!IMPORTANT] +> 此命令行参数区分大小写. + +软件默认使用紧凑视图. + +找到: -找到倒数第二行. 如需启用, 请在末尾加上`-Wp`, 见下: -```Batch -.\bin\main.exe -Wp +```dos +set argv= ``` -如需禁用, 将`-Wp`删去即可. +添加参数 `--sparse-view`, 变成: -## 1 破解 +```dos +set argv=--sparse-view +``` -输入`1`, 回车, 根据需要破解的控制软件输入对应的字符, 回车, 输入`y`(不区分大小写), 回车, 开始破解. +即可使用宽松视图. -## 2 恢复 +> [!NOTE] +> 可以和[上一节](#12-窗口操作)中的参数一同使用, 两者顺序可以调换. 例如: +> +> ```dos +> set argv=--sparse-view -Wfa +> ``` -输入`2`, 回车, 根据需要恢复的控制软件输入对应的字符, 回车, 输入`y`(不区分大小写), 回车, 开始恢复. +### 1.4 深度自定义 -# 常见问题 +启动脚本属于 Windows 命令脚本, 可以根据需要自行修改. -## 1 运行软件时控制台总是输出 "命令提示符已被管理员禁用", 无法正常使用. +## 2 功能使用及说明 -可以运行注册表编辑器, 定位到`HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System`下, 看看有没有一个叫`DisableCMD`的值, 有的话就删掉, 再试试. +### 2.1 软件信息 -## 2 软件无法在 32 位 Windows 系统中使用. +位于软件窗口顶部往下几行, 从上到下, 依次显示: 软件名称, 软件版本, 仓库链接, 版权信息. -由于开发中使用的一些头文件无法在 MinGW GNU GCC 下编译, 所以暂不提供 32 位发行版. +### 2.2 快捷操作 -## 3 破解后一些软件运行时提示 "找不到文件" 之类的错误, 而运行的软件并没有损坏. +位于 "软件信息" 区域下方. 通过鼠标点击按钮 `> 退出` 可以直接退出软件, 点击 `> 命令提示符` 可以在当前软件窗口内打开命令提示符. + +> [!TIP] +> 启动命令提示符后, 可以使用命令 `mode con cols=行数 lines=列数` 调整窗口大小. 退出后将会重置. -在不影响软件正常运行的情况下, 可以给软件文件修改一个名称, 再试试. 或者打开注册表编辑器, 定位到`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\`, 找到和要运行的软件的文件名称相同的项, 删除即可. +### 2.3 破解 & 恢复 -# 贡献代码 +位于 "快捷操作" 区域下方. 如果 `[ 破 解 ]` 和 `[ 恢 复 ]` 下输出的文本为 `(i) 需要管理员权限.`, 请以管理员权限重新启动软件. + +确认以管理员权限启动后, 使用鼠标在 `[ 破 解 ]` 下点击需要破解的控制软件, 以禁用破解. 如需恢复, 可以在 `[ 恢 复 ]` 下点击需要恢复的控制软件, 即可恢复控制. + +# 常见问题 + +## 1 软件无法非 x86_64 架构的 Windows OS 中使用. + +受限于开发工具链, 构建出的二进制文件架构仅支持 x86_64 架构. + +## 2 运行软件时控制台总是输出 "命令提示符已被管理员禁用", 无法正常使用. + +可以运行注册表编辑器, 定位到 `HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System` 下, 看看有没有一个叫 `DisableCMD` 的值, 有的话就删掉, 再试试. + +## 3 破解后一些软件运行时提示 "找不到文件" 之类的错误, 而运行的软件并没有损坏. -**欢迎各位贡献代码!** 所有贡献者将会在下方列出, 以示感谢. 但务必遵守以下规则: -- 提交代码请创建拉取请求, 不要直接提交; -- 修改`README.md`时, 注意语句通顺, 不要有错误内容; -- 提交的代码的风格请与项目保持统一, 尽可能提升运行效率, 同时可通过最新 MinGW-w64 GNU GCC (MSYS2: mingw-w64-ucrt-x86_64-toolchain) 编译, 并且不附带警告. +在不影响软件正常运行的情况下, 可以给软件文件修改一个名称, 再试试. 或者打开注册表编辑器, 定位到 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\`, 找到和要运行的软件的文件名称相同的项, 删除即可. -## 贡献者 +# 鸣谢 -- [MaxLHy0424 (Mingxu Ye)](https://github.com/MaxLHy0424) \ No newline at end of file +- Bilibili 用户 [lateworker_晚工](https://space.bilibili.com/39337803) 提供界面代码 (详见[此处](https://www.bilibili.com/video/BV1X14y1n7S4/), 软件有修改之处); +- Bilibili 用户 [痕继痕迹](https://space.bilibili.com/39337803) 指导软件界面设计; +- GitHub 用户 [Zhu-Xinrong (Kendall)](https://github.com/Zhu-Xinrong) 指导软件图标设计. diff --git a/bin/.gitkeep b/bin/.gitkeep index 416b45d9a..e69de29bb 100644 --- a/bin/.gitkeep +++ b/bin/.gitkeep @@ -1 +0,0 @@ -# 编译后的二进制文件在这里 \ No newline at end of file diff --git a/extern.hpp b/extern.hpp deleted file mode 100644 index 6f0ff4a2d..000000000 --- a/extern.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include -char Dat[3]{}; -bool Continue(){ - printf("是否继续? (Y/N): "); - for(;;){ - scanf("%s",&Dat[1]); - if((Dat[1]=='y'||Dat[1]=='n'||Dat[1]=='Y'||Dat[1]=='N')&&(Dat[2]==0)){ - break; - } - printf("输入错误, 请重试: "); - } - return ((Dat[1]=='Y'||Dat[1]=='y')?(true):(false)); -} -void PinWnd(){ - HWND foreWnd{GetForegroundWindow()}; - DWORD foreId{GetWindowThreadProcessId(foreWnd,NULL)},curId{GetCurrentThreadId()}; - for(;;){ - AttachThreadInput(curId,foreId,TRUE); - ShowWindow(foreWnd,SW_SHOWNORMAL); - SetWindowPos(foreWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); - SetWindowPos(foreWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); - SetForegroundWindow(foreWnd); - AttachThreadInput(curId,foreId,FALSE); - SetWindowPos(foreWnd,HWND_TOPMOST,0,0,100,100,SWP_NOMOVE|SWP_NOSIZE); - Sleep(100UL); - } -} \ No newline at end of file diff --git a/favicon.rc b/favicon.rc new file mode 100644 index 000000000..241fd904b --- /dev/null +++ b/favicon.rc @@ -0,0 +1 @@ +0 ICON "img/favicon.ico" \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe08d19bc594596c39e61c94f8431898961611e0 GIT binary patch literal 1499 zcmWkudpOez82)~{Tg=X6=eVTxwUiOc>xe@qbO*L0nhLNbgeq;vDI0R zY)sZlJy#bFPs`{mNCfSyVFfg3NhiW(*AW0p%`A|*@SA%9@cUdj8$DyBgI8?MH*={c z`*FRv(6vx~W^UfA1f7wLZW`6+1Bt_tYF=9Suw81Us6l! z5~oLnyp8ww-Y_0haT<%;NX2dB=;AulcKL zuhT~FnXkOll&w!Prazt>6{V)o#`sa9MeltJn}ROdR{kmQ(ctz!YR}OeEHG%!G4i#P z2!%zg=@Xt$gFG*mWHeEWB^z2E%&>Y>U*GYSPTreWR;Y2O2)A9Wsx+#=D^f;h9_N0^ zHwZPU_p-_8rd%f+d92Faoc>COOQ^YuFrFwoRYS`R9(MkG%nwK%kG|Wc# zYV|7Muc-RSE!IIxdM;31jJk|*%aNM_@k^@Jh9FHW$`T9^;H;u;GxI2x{WZJG%_0Ip zONQ}OKzZ;`FU>G=E%l_VgChH7LM&PUGK|boprg98XN?W3 zqsiJ4D&|TwO3y@|?t#0Q!yqY$97WiNh{a?iaDuO<$m9TY0rUpJD1a+nWICn}&gj(=|? zH2x(Fn)%&{)faZcn(Yhf^-dMySm9tk@9%Nv+8AKCnEzH%+82ixjQa$&$R|6Y-J#Rx z$J~j)5dwQBlTZIRz6@U}S-nm9{h*oq5HyTDSaJw?B2+yS_pVQ*!(Dr-wSJV@@reenF|1asWL?%sgsjsNQI*xg?1K|b7 zZy}X*+S7F3FaU6HjZqJ2Uken!Lzz=Vh{*p&blZlk+_h>1bbzPVgQ6pQ!io|pY@Fby zXIg`VPb%%i0u^z2(w8MhCm*F`VZ4pd`=1sfiM3%ElmmyO{#&DW@$+I}Q(?Jgac}Zq zzM_%lale1QF1Mvg;pR;THVvMeRljpdp6ux-D~WIosZT@$<54`2mLd5{>y#Z_dGY|P zLb^rha8NLKn4mn8WXJ}<7i3SeASUOz|NFMfm!!h8zqQ(e`Z-O_ zCzi_P^2T*bt|)lKdao5mf?Wor97FV-anK<0I#cy4CXWJz^c%yM-YeYXs3UNBcCO{h zp&suQRhJ6|z}OqVWImy67ujtcI-HjDrgEum>bByYb`3OW4JY+5I~^_S5k<|i06(7H zIk^=zrfgC3W#tdvGpn<0t*qR}MdEx1QpE|I+WeJ`FOL^Ja;^)_tqb;wE%Xl*zKC;* z*Y9&@tLxip0$5p@$7LBr4uBJE)x?&EiLXuW$d}Als-iHmiTu1*r#S(A?p6f!+0(s- znI+XGC$s%`DA!?BMTI`hW@h|S982#Um21(w(#&4iD$dm3!Z>pbEB&ApNA&X_2-E#Y s(b_0Xzc!5k%*?zQwmhKyX2NXXVnH)iP58drLc0NQb==CiyGbDWAM>AqVgLXD literal 0 HcmV?d00001 diff --git a/img/title.png b/img/title.png new file mode 100644 index 0000000000000000000000000000000000000000..95fb3d80513c750ada36e21b87f1ac8393a5a8d2 GIT binary patch literal 5762 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 nul +set CHANNEL=0 +if %CHANNEL%==0 ( + title CRCSN Launcher +) else if %CHANNEL%==1 ( + title [Beta] CRCSN Launcher +) else if %CHANNEL%==2 ( + title [Dev] CRCSN Launcher +) else ( + title [CUSTOM] CRCSN Launcher +) +mode con cols=50 lines=25 +set arch=x86_64 +set runtime=msvcrt +set argv= +cd /d "%~dp0" %1 -Echo CRCSN Launcher v1.3.9 -Echo. -Echo (C) 2024 MaxLHy0424, All Rights Reserved. -TimeOut /NoBreak /T 2 -: MSHTA VBScript:CreateObject("Shell.Application").ShellExecute("%~S0","GoTo:RunAs","","RunAs",1)(Window.Close) & GoTo:EOF -:RunAs - CLS - .\bin\main.exe -GoTo RunAs \ No newline at end of file +echo CRCSN Launcher +echo v2.0.0 +echo (C) 2023 MaxLHy0424. All Rights Reserved. +echo. +echo (i) 按任意键启动 CRCSN (%arch%, %runtime%)... +pause > nul +msHta vbScript:createObject("shell.application").shellExecute("%~s0","goTo:runAs","","runAs",1)(window.close) & goTo:eof +:runAs + echo (i) 请稍候... + start .\bin\%arch%\main-%runtime%.exe %argv% /command + exit \ No newline at end of file diff --git a/logo.png b/logo.png deleted file mode 100644 index b87ec18971cc98a503ed5b1a2475492ad3df5892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18499 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%0A8&~6=8J}}pdSn^AkyojM=V&NLBTc-!oeH8GBL0g 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 diff --git a/main.cpp b/main.cpp deleted file mode 100644 index 867f42fe0..000000000 --- a/main.cpp +++ /dev/null @@ -1,250 +0,0 @@ -#include"extern.hpp" -void Info(){ - puts("[信息]\n"); - puts(" Computer Room Control Software Nemesis"); - puts(" v4.10.7\n"); - puts(" https://github.com/MaxLHy0424/CRCSN"); - puts(" (C) 2024 MaxLHy0424, All Rights Reserved.\n"); - puts("---------------------------------------------\n"); - printf("按任意键返回."); - system("Pause>NUL"); - return; -} -void Crack(){ -BEGIN: - puts("[破解]\n"); - puts(" - 返回"); - puts(" 1 极域电子教室"); - puts(" 2 联想云教室\n"); - printf("请输入: "); - for(;;){ - scanf("%s",&Dat[0]); - if((Dat[1]==0)&&(Dat[0]=='-'||Dat[0]=='1'||Dat[0]=='2')){ - break; - } - printf("输入错误, 请重试: "); - } - if(Dat[0]=='-'){ - return; - } - if(Continue()){ - puts("\n-----------------------------------\n"); - switch(Dat[0]){ - case '1':{ - system("TaskKill /F /IM StudentMain.exe"); - system("TaskKill /F /IM DispcapHelper.exe"); - system("TaskKill /F /IM InstHelpApp.exe"); - system("TaskKill /F /IM GATESRV.exe"); - system("TaskKill /F /IM ProcHelper64.exe"); - system("TaskKill /F /IM MasterHelper.exe"); - if(IsUserAnAdmin()){ - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\StudentMain.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DispcapHelper.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\VRCwPlayer.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\InstHelpApp.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\InstHelpApp64.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\TDOvrSet.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\GATESRV.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ProcHelper64.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\MasterHelper.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Net Stop STUDSRV /Y"); - system("Net Stop TDNetFilter /Y"); - system("Net Stop TDFileFilter /Y"); - } - break; - }case '2':{ - system("TaskKill /F /IM vncviewer.exe"); - system("TaskKill /F /IM tvnserver32.exe"); - system("TaskKill /F /IM WfbsPnpInstall.exe"); - system("TaskKill /F /IM WFBSMon.exe"); - system("TaskKill /F /IM WFBSMlogon.exe"); - system("TaskKill /F /IM WFBSSvrLogShow.exe"); - system("TaskKill /F /IM ResetIp.exe"); - system("TaskKill /F /IM Fireware.exe"); - system("TaskKill /F /IM BCDBootCopy.exe"); - system("TaskKill /F /IM refreship.exe"); - system("TaskKill /F /IM LenovoLockScreen.exe"); - system("TaskKill /F /IM PortControl64.exe"); - system("TaskKill /F /IM DesktopCheck.exe"); - system("TaskKill /F /IM DeploymentManager.exe"); - system("TaskKill /F /IM DeploymentAgent.exe"); - system("TaskKill /F /IM XYNTService.exe"); - if(IsUserAnAdmin()){ - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\vncviewer.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\tvnserver32.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WfbsPnpInstall.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WFBSMon.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WFBSMlogon.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WFBSSvrLogShow.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ResetIp.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FuncForWIN64.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\CertMgr.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Fireware.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\BCDBootCopy.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\refreship.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LenovoLockScreen.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\PortControl64.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DesktopCheck.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DeploymentManager.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DeploymentAgent.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Reg Add \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\XYNTService.exe\" /F /T REG_SZ /V debugger /D ?"); - system("Net Stop BSAgentSvr /Y"); - system("Net Stop tvnserver /Y"); - system("Net Stop WFBSMlogon /Y"); - } - break; - } - } - puts("\n-----------------------------------\n"); - printf("按任意键返回."); - system("Pause>NUL"); - } - system("CLS"); - goto BEGIN; -} -void Recovery(){ -BEGIN: - puts("[恢复]\n"); - if(!IsUserAnAdmin()){ - puts("请以管理员权限运行.\n"); - puts("--------------------\n"); - printf("按任意键返回."); - system("Pause>NUL"); - return; - } - puts(" - 返回"); - puts(" 1 极域电子教室"); - puts(" 2 联想云教室\n"); - printf("请输入: "); - for(;;){ - scanf("%s",&Dat[0]); - if((Dat[1]==0)&&(Dat[0]=='-'||Dat[0]=='1'||Dat[0]=='2')){ - break; - } - printf("输入错误, 请重试: "); - } - if(Dat[0]=='-'){ - return; - } - if(Continue()){ - puts("\n-----------------------------------\n"); - switch(Dat[0]){ - case '1':{ - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\StudentMain.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DispcapHelper.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\VRCwPlayer.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\InstHelpApp.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\InstHelpApp64.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\TDOvrSet.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\GATESRV.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ProcHelper64.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\MasterHelper.exe\" /F"); - system("Net Start STUDSRV"); - system("Net Start TDNetFilter"); - system("Net Start TDFileFilter"); - break; - }case '2':{ - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\vncviewer.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\tvnserver32.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WfbsPnpInstall.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WFBSMon.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WFBSMlogon.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\WFBSSvrLogShow.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\ResetIp.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\FuncForWIN64.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\CertMgr.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\Fireware.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\BCDBootCopy.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\refreship.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\LenovoLockScreen.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\PortControl64.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DesktopCheck.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DeploymentManager.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\DeploymentAgent.exe\" /F"); - system("Reg Delete \"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\XYNTService.exe\" /F"); - system("Net Start BSAgentSvr"); - system("Net Start tvnserver"); - system("Net Start WFBSMlogon"); - break; - } - } - puts("------------------------------------\n"); - printf("按任意键返回."); - system("Pause>NUL"); - } - system("CLS"); - goto BEGIN; -} -void Tools(){ - puts("[工具]\n"); - puts("正在开发.\n"); - puts("---------------\n"); - printf("按任意键返回."); - system("Pause>NUL"); - return; -} -int main(int argc,char* argv[]){ - system("Title CRCSN"); - if(argc==1){ - goto BEGIN; - } - { - struct Options{ - std::string color; - bool wndPin; - }Opt{}; - std::string tmp{}; - for(int i{1};i7)){ - tmp.erase(0,7); - Opt.color="Color "+tmp; - }else if((Opt.wndPin==false)&&(tmp=="-Wp")){ - Opt.wndPin=true; - } - else{ - puts("启动参数错误.\n"); - puts("---------------\n"); - printf("按任意键继续."); - system("Pause>NUL"); - goto BEGIN; - } - } - system(Opt.color.c_str()); - if(Opt.wndPin==true){ - std::thread(PinWnd).detach(); - } - } -BEGIN: - system("CLS"); - puts("[首页]\n"); - puts(" ? 信息"); - puts(" 1 破解"); - puts(" 2 恢复"); - puts(" 3 工具\n"); - printf("请输入: "); - for(;;){ - scanf("%s",&Dat[0]); - if((Dat[1]==0)&&(Dat[0]=='?'||Dat[0]=='1'||Dat[0]=='2'||Dat[0]=='3')){ - break; - } - printf("输入错误, 请重试: "); - } - system("CLS"); - switch(Dat[0]){ - case '?':{ - Info(); - break; - }case '1':{ - Crack(); - break; - }case '2':{ - Recovery(); - break; - }case '3':{ - Tools(); - break; - } - } - goto BEGIN; -} \ No newline at end of file diff --git a/src/header.hpp b/src/header.hpp new file mode 100644 index 000000000..985f3b9e7 --- /dev/null +++ b/src/header.hpp @@ -0,0 +1,12 @@ +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +#include +typedef const char* cstr; +typedef int i32; +typedef short i16; +typedef unsigned long long u64; +typedef unsigned short u16; +#define CHANNEL 0 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 000000000..9f053f152 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,84 @@ +#include"header.hpp" +#include"ui.hpp" +CUI ui; +#include"modules.hpp" +auto main(i32 argc,cstr argv[])->i32{ + bool optErr{}; + if(argc>1){ + std::string tmp; + for(i32 i{1};i2)){ + for(u64 j{2};j 退出 ",EXIT,CON_RED_PALE); + if(Mod::opt.sparseView){ + ui.push("\0"); + } + ui.push(" > 命令提示符 ",Mod::cmd); + ui.push("\n[ 破 解 ]\n"); + if(IsUserAnAdmin()){ + ui.push(" > 极域电子教室 ",Mod::Crack::mythware); + if(Mod::opt.sparseView){ + ui.push("\0"); + } + ui.push(" > 联想云教室 ",Mod::Crack::lenovo); + }else{ + ui.push(" (i) 需要管理员权限."); + } + ui.push("\n[ 恢 复 ]\n"); + if(IsUserAnAdmin()){ + ui.push(" > 极域电子教室 ",Mod::Recovery::mythware); + if(Mod::opt.sparseView){ + ui.push("\0"); + } + ui.push(" > 联想云教室 ",Mod::Recovery::lenovo); + }else{ + ui.push(" (i) 需要管理员权限."); + } + ui.show(); + return 0; +} \ No newline at end of file diff --git a/src/modules.hpp b/src/modules.hpp new file mode 100644 index 000000000..ba3300bcc --- /dev/null +++ b/src/modules.hpp @@ -0,0 +1,127 @@ +namespace Mod{ + struct{ + bool wndSize,frontShow,alphaWnd,sparseView; + }opt{}; + auto init(bool size,bool alpha){ + system("chcp 936 > nul"); + #if CHANNEL==0 + SetConsoleTitle("CRCSN"); + #elif CHANNEL==1 + SetConsoleTitle("[Beta] CRCSN"); + #elif CHANNEL==2 + SetConsoleTitle("[Dev] CRCSN"); + #else + SetConsoleTitle("[CUSTOM] CRCSN"); + #endif + if(!size){ + SetWindowLongPtr(GetConsoleWindow(),GWL_STYLE,GetWindowLongPtr(GetConsoleWindow(),GWL_STYLE)&~WS_SIZEBOX&~WS_MAXIMIZEBOX); + } + system("mode con cols=50 lines=25"); + SetLayeredWindowAttributes(GetForegroundWindow(),0,((alpha)?(204):(255)),LWA_ALPHA); + } + auto frontShow(){ + HWND foreWnd{GetConsoleWindow()}; + DWORD foreId{GetWindowThreadProcessId(foreWnd,NULL)},curId{GetCurrentThreadId()}; + while(true){ + AttachThreadInput(curId,foreId,TRUE); + ShowWindow(foreWnd,SW_SHOWNORMAL); + SetWindowPos(foreWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); + SetWindowPos(foreWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); + SetForegroundWindow(foreWnd); + AttachThreadInput(curId,foreId,FALSE); + SetWindowPos(foreWnd,HWND_TOPMOST,0,0,100,100,SWP_NOMOVE|SWP_NOSIZE); + Sleep(100ul); + } + } + auto exit(Parameter){ + SetWindowLongPtr(GetConsoleWindow(),GWL_STYLE,GetWindowLongPtr(GetConsoleWindow(),GWL_STYLE)|WS_SIZEBOX|WS_MAXIMIZEBOX); + return true; + } + #define EXIT Mod::exit + auto cmd(Parameter){ + system("cls & cmd & cls"); + init(opt.wndSize,opt.alphaWnd); + return false; + } + struct{ + struct{ + std::string exe[9],svc[3]; + }mythware; + struct{ + std::string exe[18],svc[3]; + }lenovo; + }rule{ + { + { + "StudentMain","DispcapHelper","VRCwPlayer", + "InstHelpApp","InstHelpApp64","TDOvrSet", + "GATESRV","ProcHelper64","MasterHelper" + },{ + "STUDSRV","TDNetFilter","TDFileFilter" + } + },{ + { + "vncviewer","tvnserver32","WfbsPnpInstall", + "WFBSMon","WFBSMlogon","WFBSSvrLogShow", + "ResetIp","FuncForWIN64","CertMgr", + "Fireware","BCDBootCopy","refreship", + "lenovoLockScreen","PortControl64","DesktopCheck", + "DeploymentManager","DeploymentAgent","XYNTService" + },{ + "BSAgentSvr","tvnserver","WFBSMlogon" + } + } + }; + auto opBase(char op,std::string* exe,u16 n,std::string* svc,u16 m){ + system("cls"); + std::string cmd; + switch(op){ + case 'C':{ + for(u16 i{};ilineData; + protected: + auto hideCursor(){ + CONSOLE_CURSOR_INFO cursorInfo; + GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo); + cursorInfo.bVisible=false; + SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo); + } + auto showCursor(){ + CONSOLE_CURSOR_INFO cursorInfo; + GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo); + cursorInfo.bVisible=true; + SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo); + } + auto removeAttributes(){ + DWORD mode; + GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),&mode); + mode&=~ENABLE_QUICK_EDIT_MODE,mode&=~ENABLE_INSERT_MODE,mode|=ENABLE_MOUSE_INPUT; + SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),mode); + } + auto addAttributes(){ + DWORD mode; + GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),&mode); + mode|=ENABLE_QUICK_EDIT_MODE,mode|=ENABLE_INSERT_MODE,mode|=ENABLE_MOUSE_INPUT; + SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),mode); + } + auto getCursor()->COORD{ + CONSOLE_SCREEN_BUFFER_INFO tmp; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&tmp); + return tmp.dwCursorPosition; + } + auto setCursor(const COORD& tmp={0,0}){ + SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),tmp); + } + auto waitMouseEvent(bool move=true)->MOUSE_EVENT_RECORD{ + INPUT_RECORD record; + DWORD reg; + while(true){ + Sleep(10ul); + ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&record,1,®); + if((record.EventType==MOUSE_EVENT)&&(move|(record.Event.MouseEvent.dwEventFlags!=MOUSE_MOVED))){ + return record.Event.MouseEvent; + } + } + } + auto getConsoleSize(){ + CONSOLE_SCREEN_BUFFER_INFO tmp; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&tmp); + height=tmp.dwSize.Y; + width=tmp.dwSize.X; + } + auto clearScreen(){ + getConsoleSize(); + setCursor({0,0}); + for(i16 i{};iCUI&{ + lineData.push_back(Text(txt,Color(colorDef,((fn==nullptr)?(colorDef):(colorHighlight))),fn)); + return *this; + } + auto pop()->CUI&{ + lineData.pop_back(); + return *this; + } + auto clear()->CUI&{ + lineData.clear(); + return *this; + } + auto show(){ + removeAttributes(); + hideCursor(); + MOUSE_EVENT_RECORD mouseEvent; + Sleep(100); + initPosition(); + bool isExit{}; + while(!isExit){ + Sleep(50); + mouseEvent=waitMouseEvent(); + switch(mouseEvent.dwEventFlags){ + case MOUSE_MOVE:{ + refresh(mouseEvent.dwMousePosition); + break; + }case MOUSE_CLICK:{ + if((mouseEvent.dwButtonState)&&(mouseEvent.dwButtonState!=MOUSE_WHEEL)){ + isExit=implement(mouseEvent); + } + break; + } + } + } + clearScreen(); + Sleep(100); + } +}; +#endif \ No newline at end of file