当前位置:网站首页>禁止运行游戏的程序开发
禁止运行游戏的程序开发
2022-08-06 07:48:00 【九阳道人】
禁止运行游戏的程序开发
众所周知,游戏有害身体和心理健康,网络上有不少方法和工具可以禁止游戏运行,但是缺点是你怎么设置的禁止,然后点击取消禁止就又能开始玩游戏了。基于此再次开发出一个只能启动不能取消启动的程序。
本文目的是基于C语言开发出一个PC端应用层的程序,当运行程序后禁止相关游戏运行,此程序是不可逆向设置的,此程序不会被关闭,程序开机后会自动启动,程序运行后窗口会隐藏,在后台默默运行。
除非是专业的程序员,否则一般人则无法删除掉此程序,想要玩游戏只有重装系统,这样就能在一定程度上达到戒除游戏的效果。
开发原理:
- 利用互斥体实现进程的唯一性。
- 利用双进程守护实现此进程不会被普通用户杀死。
- 利用注册表和快速启动目录共同实现开机自动启动,同时不断循环写入自启动项,这样用户就无法删除自启动方式,类似流氓程序。
- 隐藏程序窗口,后台默默运行。
现在最火的游戏多数是企鹅厂的,下面就以杀死企鹅的wegame和杀死LOL程序为列。将下面两个代码编译为exe程序后放在同一目录,随便运行一个后,妈妈就再也不用担心我的学习。
1、杀死游戏的主进程代码
#include <windows.h>
#include <TlHelp32.h>
#include <stdio.h>
#include <ShlObj_core.h>
// 隐藏控制台
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
// 快速启动目录启动
void StartupRun(LPCWSTR exePath)
{
// TODO: 在此处添加实现代码.
TCHAR szStartupPath[MAX_PATH] = {
};
TCHAR szExePath[MAX_PATH] = {
};
// 获取启动目录
BOOL bRet = ::SHGetSpecialFolderPath(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
if (!bRet)
return;
// 原文件地址
wcscat_s(szExePath, exePath);
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
IShellLink *pIsl;
hr = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pIsl);
if (SUCCEEDED(hr))
{
IPersistFile* pIPF = NULL;
pIsl->SetPath(szExePath);
hr = pIsl->QueryInterface(IID_IPersistFile, (void**)&pIPF);
if (SUCCEEDED(hr))
{
int exeLength = lstrlen(exePath);
//创建快捷方式的目标地址
TCHAR szDir[MAX_PATH] = {
};
memcpy_s(szDir, MAX_PATH, szStartupPath, wcslen(szStartupPath) * 2);
//printf("szStartupPath is %ls\nszDir is %ls\n", szStartupPath, szDir);
wcscat_s(szDir, L"\\svchost.lnk");
//printf("dir is %ls", szDir);
pIPF->Save(szDir, FALSE);
pIPF->Release();
}
pIsl->Release();
}
CoUninitialize();
}
}
// 注册表自启动 + 快速目录自启
void AutoRun()
{
// 获得程序全路径
wchar_t PathName[MAX_PATH] = {
};
GetModuleFileName(NULL, PathName, MAX_PATH);
// 修改注册表,添加自动启动
// 默认权限
HKEY hKey;
// 打开注册表键
if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
{
return;
}
// 修改注册表值,实现开机自启
if (ERROR_SUCCESS != ::RegSetValueExW(hKey, L"SystemSetting", 0, REG_SZ, (BYTE *)PathName, (1 + ::lstrlen(PathName)) * 2))
{
::RegCloseKey(hKey);
return;
}
// 关闭注册表键
::RegCloseKey(hKey);
// 添加到快速启动目录
StartupRun(PathName);
}
// 防双开
bool IsAlreadyRun()
{
HANDLE hMutex = NULL;
hMutex = ::CreateMutex(NULL, FALSE, L"kill_lol");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
return true;
}
}
return false;
}
// 守护进程
DWORD WINAPI daemon(LPVOID lParam)
{
HANDLE event1;
HANDLE event2;
STARTUPINFOA si = {
0 };
PROCESS_INFORMATION pi = {
0 };
event1 = CreateEventA(NULL, FALSE, TRUE, "Local\\p1");
while (true)
{
if (!(event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "Local\\p2")))
{
CreateProcessA("spoolsl.exe",
NULL,
NULL,
NULL,
NULL,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi
);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
CloseHandle(event2);
Sleep(500);
}
return 0;
}
// 赖毛自启动
DWORD WINAPI ThreadAutoRun(LPVOID lParam)
{
while (true)
{
AutoRun();
Sleep(2000);
}
}
int main()
{
// 1、防双开
if (IsAlreadyRun())
{
::exit(0);
}
DWORD ThreadId;
// 2、自启动
CreateThread(NULL, 0, ThreadAutoRun, NULL, 0, &ThreadId);
// 3、双守护进程
CreateThread(NULL, 0, daemon, NULL, 0, &ThreadId);
// 4、杀死LOL游戏相关进程
while (true)
{
// 创建一个进程快照
HANDLE hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 stcPe32 = {
sizeof(PROCESSENTRY32) };
// 用API进行遍历快照
if (TRUE == Process32First(hSnapProcess, &stcPe32))
{
do
{
if (!wcscmp(L"WeGameMiniLoader.exe", stcPe32.szExeFile) || !wcscmp(L"wegame.exe", stcPe32.szExeFile) || !wcscmp(L"LeagueClient.exe", stcPe32.szExeFile)
|| !wcscmp(L"Client.exe", stcPe32.szExeFile))
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, stcPe32.th32ProcessID);
if (hProcess == NULL)
continue;
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
} while (Process32Next(hSnapProcess, &stcPe32));
}
Sleep(1000);
}
return 0;
}
2、守护进程代码
#include <windows.h>
#include <stdio.h>
#include <ShlObj_core.h>
// 隐藏控制台
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
// 快速启动目录启动
void StartupRun(LPCWSTR exePath)
{
// TODO: 在此处添加实现代码.
TCHAR szStartupPath[MAX_PATH] = {
};
TCHAR szExePath[MAX_PATH] = {
};
// 获取启动目录
BOOL bRet = ::SHGetSpecialFolderPath(NULL, szStartupPath, CSIDL_STARTUP, TRUE);
if (!bRet)
return;
// 原文件地址
wcscat_s(szExePath, exePath);
HRESULT hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
IShellLink *pIsl;
hr = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pIsl);
if (SUCCEEDED(hr))
{
IPersistFile* pIPF = NULL;
pIsl->SetPath(szExePath);
hr = pIsl->QueryInterface(IID_IPersistFile, (void**)&pIPF);
if (SUCCEEDED(hr))
{
int exeLength = lstrlen(exePath);
//创建快捷方式的目标地址
TCHAR szDir[MAX_PATH] = {
};
memcpy_s(szDir, MAX_PATH, szStartupPath, wcslen(szStartupPath) * 2);
//printf("szStartupPath is %ls\nszDir is %ls\n", szStartupPath, szDir);
wcscat_s(szDir, L"\\syshost.lnk");
//printf("dir is %ls", szDir);
pIPF->Save(szDir, FALSE);
pIPF->Release();
}
pIsl->Release();
}
CoUninitialize();
}
}
// 注册表自启动 + 快速目录自启
void AutoRun()
{
// 获得程序全路径
wchar_t PathName[MAX_PATH] = {
};
GetModuleFileName(NULL, PathName, MAX_PATH);
// 修改注册表,添加自动启动
// 默认权限
HKEY hKey;
// 打开注册表键
if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey))
{
return;
}
// 修改注册表值,实现开机自启
if (ERROR_SUCCESS != ::RegSetValueExW(hKey, L"SystemLocalHost", 0, REG_SZ, (BYTE *)PathName, (1 + ::lstrlen(PathName)) * 2))
{
::RegCloseKey(hKey);
return;
}
// 关闭注册表键
::RegCloseKey(hKey);
StartupRun(PathName);
}
// 防双开
bool IsAlreadyRun()
{
// TODO: 在此处添加实现代码.
HANDLE hMutex = NULL;
hMutex = ::CreateMutex(NULL, FALSE, L"kill_lol2");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
return true;
}
}
return false;
}
// 赖毛自启动
DWORD WINAPI ThreadAutoRun(LPVOID lParam)
{
while (true)
{
AutoRun();
Sleep(2000);
}
}
int main()
{
// 1、防双开
if (IsAlreadyRun())
{
::exit(0);
}
DWORD ThreadId;
// 2、自启动
CreateThread(NULL, 0, ThreadAutoRun, NULL, 0, &ThreadId);
// 3、双进程守护
HANDLE event1;
HANDLE event2;
STARTUPINFOA si = {
0 };
PROCESS_INFORMATION pi = {
0 };
event2 = CreateEventA(NULL, FALSE, TRUE, "Local\\p2");
while (true)
{
if (!(event1 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "Local\\p1")))
{
CreateProcessA("Kill_LOL.exe",
NULL,
NULL,
NULL,
NULL,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi
);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
CloseHandle(event1);
Sleep(500);
}
return 0;
}
3、程序下载链接
链接:https://pan.baidu.com/s/1U6kyUpW5juDtwR-KqtOzzw?pwd=1234
提取码:1234
边栏推荐
- 【Yugong Series】August 2022 Go Teaching Course 030-Object Inheritance
- qwqの科技flag
- typescript变量
- I set the global mapping table prefix in yml, but the database does not recognize it
- vscode configure typescript and simple use
- 2022 第四周全球 AI 模型周报
- [Popular Science] What basic knowledge do I need to learn to engage in Web3?
- 推荐系统-排序层-2017:NFM模型【FM家族】
- tuxera NTFS2022让磁盘读写管理格式化更轻松
- 在Windows上安装Go语言开发包
猜你喜欢

一文3000字解析Pytest单元测试框架【保姆级教程】

【云原生--Kubernetes】配置管理

Datax3.0+DataX-Web打造分布式可视化ETL系统

2022 第四周全球 AI 模型周报

性能测试的基本概念是什么?做好性能测试需要掌握哪些知识?

《UnityShader入门精要》总结(1)理论篇

Process finished with exit code -1073740791 (0xC0000409)

WinForm(三)揭开可视化控件的面纱

【Yugong Series】August 2022 Go Teaching Course 030-Object Inheritance

翻译文章的软件
随机推荐
PHP踩坑记录-empty判断浮点型
OpenAtom XuperChain 开源双周报 |2022.7.25-2022.8.5
JMeter集合点
限制命令长度如何反弹shell
2022.08.01 洛谷P7845 「dWoi R2」Change
On-line project database properties added
commonJs和es6的区别
明日立秋 autumn begins,天气渐凉
Process finished with exit code -1073740791 (0xC0000409)
Unity 引导系统.点击目标物体后提示文字变色进入下一步
CrossOver22试用期到了如何免费使用?
BuuWeb
Ceph性能测试方案收集列表
数据库中的外键是否必要存在
Chapter 13 Bayesian Network Practice
pacman包 管理各种R包
vscode配置typescript及简单使用
Why do interviewers keep asking technical questions on your resume until they can't answer them?
How to improve the quality of articles without being "recommended and affected" by the post assistant
autoReg | 自动线性和逻辑回归和生存分析