關於防止同一程式多次執行的破解方法之補充篇 (3千字)

看雪資料發表於2001-10-28

關於防止同一程式多次執行的破解方法之補充篇

                    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

相關文章