程式多開原理記錄

2021-09-07 21:04:34 字數 3133 閱讀 3306

windows系統下,程式防止多開的幾種常見方法:

1)使用findwindow api函式。

通過查詢視窗標題(或/和類名)來判斷程式是否正在執行。如果找到了,表明程式正在執行,這時可退出程式,達到不重複執行的效果;反之表明程式是第一次執行。

這種方法不適用於以下情況,程式的標題是動態變化的、系統中執行了相同標題(或/和類名)的程式

2)mutex/event/semaphore

通過互斥物件/訊號量/事件等執行緒同步物件來確定程式是否已經執行。最常用的函式如:createmutexa(注意:qq堂、qq遊戲大廳就是採用這樣方法來限制程式多開的)

4)dll全域性共享區

dll全域性共享區在對映到各個程序的位址空間時僅被初始化一次,且是在第一次被windows載入時,所以利用該區資料就能對程式進行多開限制。

5)全域性atom

將某個特定字串通過globaladdatom加入全域性原子表(global atom table),程式執行時檢查該串是否存在來限制程式多開。(該atom不會自動釋放,程式退出前必須呼叫globaldeleteatom來釋放atom)

6)檢查視窗屬性

將某些資料通過setprop加入到指定視窗的property list,程式執行時列舉視窗並檢查這些資料是否存在來限制多開。

以上只列舉了最常見的幾種方法,具體應用中可以有n種選擇,或綜合運用多種方法來限制。

上面說過,qqt採用createmutex函式來限制多開,那麼我怎麼知道是使用這個函式來限制的呢?

答案就是跟蹤程式,查詢程式是使用哪種方法來限制的。比如先看看是否使用createmutex來限制,如果不是,再看看是不是使用findwindow,以此類推,直到找到方法為止。當然,有些程式也會綜合使用多種方法來限制多開,方法也是一樣的,只是麻煩點而已。

下面講一講使用createmutex函式來限制多開的方法:

createmutex函式宣告如下(具體請查閱相關資料,如msdn)

handle createmutex(

lpsecurity_attributes lpmutexattributes,// pointer to security attributes

bool binitialowner, // flag for initial ownership

lpctstr lpname// pointer to mutex-object name

);以下是使用createmutex函式來限制多開的典型delphi**

hmutex:=createmutex(nil,true,'qqtang');//建立互斥量

// 呼叫失敗? 已經存在?

if(hmutex=0) or (getlasterror=error_already_exists)then

begin

//程式第二(或以上)次執行時,getlasterror會返回error_already_exists,表明互斥量已存在

//可以在這裡編寫退出**

end;

該段**首先呼叫createmutex函式建立一名為 qqtang 的互斥物件,如果呼叫createmutex函式失敗(hmutex=nil)或互斥物件早已存在(getlasterror=error_already_exists),則退出程式。

10002fb9 . 51 push ecx ; /mutexname = "qqtang"

10002fba . 6a 01 push 1 ; |initialowner = true

10002fbc . 6a 00 push 0 ; |psecurity = null

10002fbe . ff15 60e40010 call dword ptr [<&kernel32.createmutexa>] ; \createmutexa 建立互斥量

10002fc4 . 8b95 d4feffff mov edx,dword ptr [ebp-12c]

10002fca . 8902 mov dword ptr [edx],eax

10002fcc . 8b85 d4feffff mov eax,dword ptr [ebp-12c]

10002fd2 . 8338 00 cmp dword ptr [eax],0 ; 檢查createmutexa函式是否呼叫失敗

10002fd5 . 0f84 cd000000 je core.100030a8 ; 把je改為jmp即可

10002fdb . ff15 5ce40010 call dword ptr [<&kernel32.getlasterror>] ; [getlasterror

10002fe1 . 3d b7000000 cmp eax,0b7 ; 檢查物件是否已存在

10002fe6 . 0f85 bc000000 jnz core.100030a8 ; (也可以在這裡把jnz改為jmp)

10002fec . 8b8d d4feffff mov ecx,dword ptr [ebp-12c]

10002ff2 . c701 00000000 mov dword ptr [ecx],0

10002ff8 . 6a 00 push 0 ; /title = null

10002ffa . 68 5cc60010 push core.1000c65c ; |class = "qqtangwinclass"

10002fff . 6a 00 push 0 ; |hafterwnd = null

10003001 . 6a 00 push 0 ; |hparent = null

10003003 . ff15 40e70010 call dword ptr [<&user32.findwindowexa>] ; \findwindowexa 查詢qqt視窗

選中這行:

10002fd5 . 0f84 cd000000 je core.100030a8

然後按空格,在彈出的視窗中把「je 100030a8」修改為「jmp 100030a8」,按[彙編]。

右鍵單擊cpu視窗,在彈出選單中選「複製到可執行檔案」-》「所有改動」,選[全部複製]。右鍵單擊彈出的視窗,選「儲存檔案」儲存即可。

是否覺得上面的修改比較麻煩呢?呵呵,授人於魚不如授人於漁,上面是告訴你為什麼要這樣修改,修改的原理是什麼,你明白修改原理後,有新版本時你就可以自己修改了。

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

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

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

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

康托展開原理

康托展開結合組合數學會比較容易理解。假設有 這三個數,那麼全部的排列組合有 6種,按從小到大的順序有 123,132,213,231,312,321。而康託展開能以n 2的時間複雜度求出比某個排序組合小的個數。比如說 比 213 小的數有2個,比312小的數有4個。原理 假設有 這4個數,根據組合數...