极域脱控破解分析+代码实现(杀死和重启,挂起和恢复,解除全屏按钮限制,获取极域安装路径,极域密码破解)
免責聲明:以下內容僅供學習使用
本文的工具成品下載見githubmythwarehelper倉庫,附加資源也在內
已完成功能:殺死極域,獲取極域安裝路徑,從注冊表破解極域密碼,重啟極域,掛起極域,恢復極域,解除極域全屏窗口限制
搜索極域進程
極域主進程
極域的進程由StudentMain.exe啟動,因此,只需要使用CreateToolhelp32Snapshot創(chuàng)建快照,遍歷所有進程的所有模塊,找到其中可執(zhí)行文件為StudentMain.exe那一個進程即可。
以下是代碼實現(xiàn)
struct Jiyu {DWORD id;char filepath[260];BOOL flag; } jiyu;Jiyu ModuleIsAble(DWORD ProcessPid, LPCSTR Modulename) {Jiyu tj;if (Modulename[0] == '\0') {tj.flag = FALSE;return tj;}MODULEENTRY32 me;me.dwSize = sizeof(MODULEENTRY32);HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessPid);if (Module32First(hSnapshot, &me)) {do {//printf("thread - %s\n", me.szModule);if (!strcmp(Modulename, me.szModule)) {CloseHandle(hSnapshot);strcpy(tj.filepath, me.szExePath);tj.id = ProcessPid;tj.flag = TRUE;return tj;}} while (Module32Next(hSnapshot, &me));}CloseHandle(hSnapshot);tj.flag = FALSE;return tj; }Jiyu GetProcessPidFromFilename(LPCSTR Filename) {Jiyu tj;if (Filename[0] == '\0') {tj.flag = FALSE;return tj;}PROCESSENTRY32 te;te.dwSize = sizeof(PROCESSENTRY32);HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (Process32First(hSnapshot, &te)) {do {HANDLE temphandle = OpenProcess(PROCESS_ALL_ACCESS, false, te.th32ProcessID);//printf("%ld\n", te.th32ProcessID);tj = ModuleIsAble(te.th32ProcessID, Filename);if (tj.flag == TRUE) {CloseHandle(hSnapshot);return tj;}CloseHandle(temphandle);} while (Process32Next(hSnapshot, &te));}tj.flag = FALSE;return tj; }極域廣播窗口
極域廣播窗口是一個窗體,窗體標題固定為“屏幕廣播”,因此可以直接使用FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName)函數(shù)來獲取進程句柄,在第二個參數(shù)處填入窗體名即可
HWND Class = FindWindowW(NULL, L"屏幕廣播");//Class為獲取到的窗口句柄 if (Class != NULL) {//廣播窗口存在GetWindowThreadProcessId(Class, &pid);//由窗口句柄獲取pidHANDlE ClassHandle = OpenThread(THREAD_ALL_ACCESS, false, GetMainThreadFromId(pid));//由pid獲取可操控窗口的句柄//... } else {//廣播窗口不存在//... }獲取極域安裝路徑(用來在殺死極域后重啟)
極域安裝路徑存儲在系統(tǒng)注冊表SOFTWARE\\WOW6432Node\\TopDomain\\e-Learning Class Standard\\1.00\\TargetDirectory
以下為獲取函數(shù)
UINT GetMythwarePathFromRegedit(char *str) {HKEY retKey;char tstr[200] = "SOFTWARE\\WOW6432Node\\TopDomain\\e-Learning Class Standard\\1.00";DWORD dwDisposition = REG_OPENED_EXISTING_KEY;LONG ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, tstr, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &retKey, &dwDisposition);if (ret != ERROR_SUCCESS) {//打開注冊表失敗return FALSE;}BYTE tByte[MAX_PATH * 2 + 1];DWORD nSize = MAX_PATH * 2 + 1;int sum = 0;ret = RegQueryValueEx(retKey, "TargetDirectory", NULL, NULL, tByte, &nSize);if (ret == ERROR_SUCCESS) {for (int i = 0; i < int(nSize); i += 1) {*(str + sum) = tByte[i];if (*(str + sum++) == '\\') {*(str + sum++) = '\\';}}//獲取極域安裝路徑成功return TRUE;}//獲取極域安裝路徑失敗return FALSE; }殺死極域進程
taskkill
在命令行中輸入
taskkill /f /im studentmain.exe
即可殺死極域進程,但有時候會失效
ntsd
ntsd是一個用戶態(tài)進程調試工具,從Windows 2000就開始被附隨在System32目錄下。它能夠結束除System、smss.exe、csrss.exe、lsass.exe及各種rootkit程序外所有的程序。但在Windows Vista及以上版本的Windows中不含ntsd, 必須手動下載至電腦中才可使用?!俣劝倏?/p>
在命令行中輸入
./ntsd.exe -c q -pn studentmain.exe
即可殺死極域進程,目前博主沒有遇到失效的情況
如需下載ntsd.exe可訪問我的mythwarehelper倉庫
掛起和恢復極域進程
再不使用外部DLL的情況下,C++沒有原生的掛起和回復進程的函數(shù),因此不能白嫖 掛起進程只能自己實現(xiàn),進程由線程構成,因此如果掛起了一個進程的每一個線程,就相當于是掛起了這個進程。掛起線程可使用SuspendThread,恢復線程可使用ResumeThread
以下是代碼實現(xiàn)
/* 函數(shù)功能:掛起進程中的所有線程 參數(shù)1:進程ID 參數(shù)2:若為TRUE時對進程中的所有線程調用SuspendThread,掛起線程若為FALSE時對進程中的所有線程調用ResumeThread,恢復線程 */VOID SuspendProcess(DWORD dwProcessID, BOOL fSuspend) {HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID);if (hSnapshot != INVALID_HANDLE_VALUE) {THREADENTRY32 te = {sizeof(te)};BOOL fOk = Thread32First(hSnapshot, &te);for (; fOk; fOk = Thread32Next(hSnapshot, &te)) {if (te.th32OwnerProcessID == dwProcessID) {HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);if (hThread != NULL) {if (fSuspend) {SuspendThread(hThread);} else {ResumeThread(hThread);}}CloseHandle(hThread);}}CloseHandle(hSnapshot);} }解除全屏按鈕限制
極域的廣播窗口有一個全屏切換按鈕,在強制全屏時會設置為無法使用,變成灰色,Windows的按鈕即為控件,交互式控件有兩個狀態(tài),一個是可用,一個是不可用,可以通過調用EnableWindow函數(shù)來設置此類控件的狀態(tài),也可以借此設置全屏切換按鈕的狀態(tài),在老師設置按鈕為不可用時,調用此函數(shù)設置按鈕為可用,就可以自行退出全屏了
以下是代碼實現(xiàn)
//這是一個EnumChildWindows函數(shù)的回調函數(shù),EnumChildWindows的父窗口句柄為極域的廣播窗口句柄 BOOL CALLBACK EnumChildWindowsProc(HWND hwndChild, LPARAM lParam) {HMENU hmenu = GetMenu(hwndChild);if (LOWORD(hmenu) == 1004) {//1004為全屏切換按鈕的HMENU值if (!IsWindowEnabled(hwndChild)) {EnableWindow(hwndChild, TRUE);} else {EnableWindow(hwndChild, FALSE);}//找到這個按鈕就跳出遍歷return FALSE;}return TRUE; }破解極域密碼
極域的密碼存儲在系統(tǒng)注冊表SOFTWARE\\TopDomain\\e-Learning Class\\Student
極域的密碼在部分版本中使用明文存儲,但新版都是存儲的密文
解密代碼來源
解密分析視頻
以下是破解代碼:
BOOL GetMythwarePasswordFromRegedit(char *str) {HKEY retKey;BYTE retKeyVal[MAX_PATH * 10] = { 0 };DWORD nSize = MAX_PATH * 10;LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\TopDomain\\e-Learning Class\\Student", 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &retKey);if (ret != ERROR_SUCCESS) {return FALSE;}ret = RegQueryValueExA(retKey, "knock1", NULL, NULL, (LPBYTE)retKeyVal, &nSize);RegCloseKey(retKey);if (ret != ERROR_SUCCESS) {return FALSE;}for (int i = 0; i < int(nSize); i += 4) {retKeyVal[i + 0] = (retKeyVal[i + 0] ^ 0x50 ^ 0x45);retKeyVal[i + 1] = (retKeyVal[i + 1] ^ 0x43 ^ 0x4c);retKeyVal[i + 2] = (retKeyVal[i + 2] ^ 0x4c ^ 0x43);retKeyVal[i + 3] = (retKeyVal[i + 3] ^ 0x45 ^ 0x50);}for (int i = 0; i < int(nSize); i += 1) {printf("%x ", retKeyVal[i]);if (i % 8 == 0) puts("");}int sum = 0;for (int i = 0; i < int(nSize); i += 1) {if (retKeyVal[i + 1] == 0) {*(str + sum) = retKeyVal[i];sum++;if (retKeyVal[i] == 0) break;}}return TRUE; }總結
以上是生活随笔為你收集整理的极域脱控破解分析+代码实现(杀死和重启,挂起和恢复,解除全屏按钮限制,获取极域安装路径,极域密码破解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jetson NX和Nano上使用Ten
- 下一篇: 一起做一款自己的英语学习助手吧(小程序)