多開限制的原理

2021-06-20 18:48:37 字數 4066 閱讀 5338

1.建立新節法

為程式加入乙個全域性變數,讓這個全域性變數可以被程式的多個例項所共享,每當程式例項執行時就對該全域性變數進行修改。通過訪問該全域性變數,就可以知道有多少個例項在執行了。當然,為了系統的安全和穩定性,預設情況下是不允許這樣做得。為了阻止這種事情的發生,系統使用了copy-on-write(寫入時拷貝)機制,不過我們可以使用建立新節的方法來繞過它。

1.建立節

[cpp]view plain

copy

print?

#pragma data_seg("shared") 

bool bexist = false; //已經初始化變數 

int num; //未初始化變數

#pragma data_seg() 

#pragma data_seg("shared") 

bool bexist = false; //已經初始化變數

int num; //未初始化變數

#pragma data_seg()

注:在建立節的過程中,編譯器只將已經初始化的變數放入新節中。

2.將初始化或未初始化的資料放入希望的任何節中  

[cpp]view plain

copy

print?

__declspec(allocate("shared")) int num2 = 0; //新增初始化的變數 

__declspec(allocate("shared")) int num3; //新增未初始化的變數 

__declspec(allocate("shared")) int num2 = 0; //新增初始化的變數 

__declspec(allocate("shared")) int num3; //新增未初始化的變數

注:在向節中新增資料之前必須先建立該節。

3.設定節的屬性

[cpp]view plain

copy

print?

#pragma comment(linker, "/section:shared,rws") 

#pragma comment(linker, "/section:shared,rws")
注:節的屬性包括rws,其中r代表read,w代表weite,s代表shared。

使用:[cpp]view plain

copy

print?

#pragma data_seg("shared") 

hwnd hwnd=null;  

#pragma data_seg() 

#pragma comment(linker, "/section:shared,rws") 

#pragma data_seg("shared") 

hwnd hwnd=null;

#pragma data_seg()

#pragma comment(linker, "/section:shared,rws")

初始化函式中:

[cpp]view plain

copy

print?

if (hwnd==null)  

else  

if (hwnd==null)

else

2.互斥體法

缺點是無法啟用舊視窗

[cpp]view plain

copy

print?

hobject=createmutex(null,false,_t("互斥體"));  

if (getlasterror()==error_already_exists)    

hobject=createmutex(null,false,_t("互斥體"));

if (getlasterror()==error_already_exists)

3.查詢視窗標題法

1.findwindow

初始化函式中

[cpp]view plain

copy

print?

hwnd hwnd=::findwindow(null,_t("findwindow單例項"));  

if (hwnd!=null)  

setwindowtext(_t("findwindow單例項"));  

hwnd hwnd=::findwindow(null,_t("findwindow單例項"));

if (hwnd!=null)

setwindowtext(_t("findwindow單例項"));

2.enumwindows

[cpp]view plain

copy

print?

bool   callback   myenumwndproc(hwnd hwnd,lparam lparam)   

;  getwindowtext(hwnd,szcaption,256);  

if (_tcscmp(_t("enumwindows單例項"),szcaption)==0)  

return true;  

}   

bool   callback   myenumwndproc(hwnd hwnd,lparam lparam) 

; getwindowtext(hwnd,szcaption,256);

if (_tcscmp(_t("enumwindows單例項"),szcaption)==0)

return true;

}

初始化函式中

[cpp]view plain

copy

print?

enumwindows(myenumwndproc,null);  

setwindowtext(_t("enumwindows單例項"));  

enumwindows(myenumwndproc,null);

setwindowtext(_t("enumwindows單例項"));

3.getwindow

[cpp]view plain

copy

print?

tchar szcaption[max_path]=;  

hwnd hwnd=::getwindow(::getdesktopwindow(), gw_child);  

while(hwnd!=null)  

hwnd=::getwindow(hwnd, gw_hwndnext);  

}  setwindowtext(_t("getwindow單例項"));  

tchar szcaption[max_path]=;

hwnd hwnd=::getwindow(::getdesktopwindow(), gw_child);

while(hwnd!=null)

hwnd=::getwindow(hwnd, gw_hwndnext);

} setwindowtext(_t("getwindow單例項"));

4.列舉程序法

1.定時器一直去監視有沒有相同程序名字,發現則傳送wm_close訊息關閉視窗

2.初始化時列舉程序,配合掛鉤queryinfomation的核心函式,修改自己的程序名字

多開限制的原理

1.建立新節法 為程式加入乙個全域性變數,讓這個全域性變數可以被程式的多個例項所共享,每當程式例項執行時就對該全域性變數進行修改。通過訪問該全域性變數,就可以知道有多少個例項在執行了。當然,為了系統的安全和穩定性,預設情況下是不允許這樣做得。為了阻止這種事情的發生,系統使用了copy on writ...

全面分析遊戲限制多開原理

1,程序 現象 遊戲通過探測遊戲客戶端程序是否已經存在來防止重複開啟。破解方法 1 隱藏程序。可以用工具 hidetoolz,也可以自己寫驅動簡單的做個摘鏈隱藏。2 hook 遊戲遍歷程序的 api。3 修改程序名。拷貝乙份遊戲 exe 檔案的副本,重新命名即可。2,視窗標題 現象 遊戲通過探測遊戲...

全面分析遊戲限制多開原理

2,視窗標題修改 使用findwindow api函式來查詢自身視窗名來判斷多開 現象 遊戲只能單開1個遊戲,部分遊戲通過探測遊戲客戶端的視窗是否已經存在來防止重複開啟。破解方法 遊戲多開的辦法為將遊戲的視窗修改為任意字元。3,埠隱藏 現象 遊戲只能單開1個遊戲 部分遊戲通過預設開啟tcp或者udp...