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...