關於防止同一程式多次執行的破解方法之補充篇
by
liangs
上次寫了一篇關於防止同一程式多次執行的破解方法,主要針對
使用FindWindowA函式的程式,具體可參見論壇精華Ⅲ。這次寫一
篇針對使用CreateMutexA函式程式的破解方法,因為使用這個API
函式的程式實在是太多了!
這次的目標是瑞星防毒軟體2002版v13.23,選中它的原因就是因
為它就是使用CreateMutexA函式來防止同時執行多個程式的。
在破解前,大家可以在自己的機器上執行瑞星試試,當一個程式
執行後,再想執行另一個程式時就會發現什麼反映都沒有,程式只
是將剛才執行的第一個程式的程式視窗彈到前面。
下面是我兩次跟蹤程式API的呼叫結果:
==========================================================================
★程式執行第一個程式的結果★
CreateMutexA(LPDATA:00000000,BOOL:00000000,LPSTR:0043A88C:"{F25D2D81-9FA5-11d4-BE4D-444553540001}")::0040DAB3
CreateMutexA'returns: 00000018
GetLastError()::0040DABF
GetLastError'returns: 00000000 //注意這個返回值
==========================================================================
★程式執行第二個程式的結果★
CreateMutexA(LPDATA:00000000,BOOL:00000000,LPSTR:0043A88C:"{F25D2D81-9FA5-11d4-BE4D-444553540001}")::0040DAB3
CreateMutexA'returns: 00000018
GetLastError()::0040DABF
GetLastError'returns: 000000B7 //哈哈,看到了吧這個返回值與上面不一樣了
=========================================================================
由於瑞星是用VC6開發的,那麼上面一段API語句我把它翻譯成如下的VC程式碼:
當然瑞星程式裡的這段程式碼肯定就是這麼寫的。
hMutex=CreateMutex(
NULL, //nosecurityattributes
FALSE, //initiallynotowned
"F25D2D81-9FA5-11d4-BE4D-444553540001" //命名Mutex的全域性物件名,在所有程式都可以訪問到
);
if(hMutex==NULL||ERROR_ALREADY_EXISTS==::GetLastError())
{
//程式第二次或以後執行時,會得到Mutex已經建立的錯誤
AfxMessageBox("程式已經執行!"); //這句是我寫的,瑞星就退出了,沒有提示
return FALSE;
}
=========================================================================
對應於上面VC程式碼的程式彙編程式碼如下:
* Possible StringData Ref from Data Obj ->"{F25D2D81-9FA5-11d4-BE4D-444553540001}"
|
:0040DAA4 688CA84300 push 0043A88C
:0040DAA9 6A00
push 00000000
:0040DAAB 6A00
push 00000000
* Reference To: KERNEL32.CreateMutexA, Ord:003Fh
|
:0040DAAD FF1550F14200 Call dword ptr
[0042F150] //建立mutex物件
:0040DAB3 898504070000 mov dword ptr
[ebp+00000704], eax
* Reference To: KERNEL32.GetLastError, Ord:011Ah
|
:0040DAB9 FF15ACF14200 Call dword ptr
[0042F1AC]
:0040DABF 3DB7000000 cmp eax,
000000B7 //物件已經存在,返回000000B7
:0040DAC4 0F85CB000000 jne 0040DB95
//這句當然是一定要使它跳轉的
========================================================================
將0040DAC4處的程式碼0F85CB000000改為90E9CB000000,再執行程式試試,
呵呵,這回執行N個程式都沒問題了吧。
一點補充:
要使瑞星的多個程式同時能執行防毒功能還需處理以下兩個地方
0040D6E4處是CRC的檢測,004132D7是檢測是否有另一個程式正在
執行防毒操作。這兩處很容易搞定,這裡就不多說了。
(1):0040D6E4 0F8594000000 jne 0040D77E //改為Jmp
(2):004132D7 0F859A000000 jne 00413377 //改為Jmp
修改後的優點:
可同時執行N個程式,分別對N的硬碟同時進行防毒,提高了N倍的效率,
經實際使用測試,呵呵,沒發現不良影響。
申明:本文僅以技術交流為目的,轉載請保持文章的完整性!
2001/10/28