著名程式設計師劉濤濤WinMount程式BUG

2022-02-20 14:08:59 字數 4079 閱讀 1895

/* 日期:2013-08-12  22:44

/**************************************

只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!

同事說win也有mount工具,好奇心驅使就搜了一下.

發現國內的著名程式設計師劉濤濤寫了一款免費的win mount工具.

甚是喜歡.圖1

只可惜我在使用的過程中,

程式會占用100%cpu:(

0x2 bug重現(如何產生).

首先弄個壓縮軟體,我當前用的是 7z 加密壓縮任意乙個檔案.(不加密檔名).

然後用mount工具雙擊開啟.這個時候就可以看到mount建立了乙個新視窗.(輸入密碼框)

此時我無意中點到父視窗,發現程父視窗也是活動視窗. (原來是非模態視窗,有點意思)圖2

知道是非模態視窗後,我就下意識的關閉了父視窗,有意思的事情發生了,cpu就跟打了雞血一樣,乙個勁猛彪~圖3

一開始我不相信自己的眼睛,我在心裡想,肯定是系統或者其他什麼軟體出了問題了.

不可能是mount自身的問題.為了搞清楚到底是什麼原因導致的cpu占用100,我決定分析它.

od載入後,自己能想到的所有斷點,都試了一遍,都沒有斷下來.

在一陣狂試都沒有斷下後,終於放棄下斷點的方法了.

找了幾首經典歌曲,邊聽邊想思路.

mount佔cpu的時候,作業系統雖然有點卡,但並沒有卡死.

說明至少不是 

for(true) 

while(true)

這一類的死迴圈導致的卡死.

所有自己已知的如等待類函式也都下斷點測試過了.

最後想就從執行緒下手吧.

開啟執行緒視窗,可以看到有四個執行緒在拼命工作,(為了方便檢視,我們可以點一下user time)圖4

現在終於知道了,是這四個執行緒導致的,那麼從entry處分析就行了.

最終分析得知導致卡死的是  

kernel32.getqueuedcompletionstatus

這個函式.

我們來看一下函式原型和介紹.

1

getqueuedcompletionstatus

2 the getqueuedcompletionstatus function attempts to dequeue an i/o completion packet from a specified i/o completion port. if there is no completion packet queued, the function waits for a pending i/o operation associated with the completion port to complete. 34

bool getqueuedcompletionstatus(

5 handle completionport, //

handle to completion port

6 lpdword lpnumberofbytes, //

bytes transferred

7 pulong_ptr lpcompletionkey, //

file completion key

buffer

9 dword dwmilliseconds //

optional timeout value

10 );

1 6b1192e0          $  55

push

ebp2 6b1192e1 . 8bec mov

ebp, esp

3 6b1192e3 . 83ec 0c

sub esp, 0c

4 6b1192e6 . 56

push

esi5 6b1192e7 . 8b35 4870126b

mov esi, dword ptr ds:[;

kernel32.getqueuedcompletionstatus

6 6b1192ed . 8d49 00

lea ecx, dword ptr ds:

[ecx]

7 6b1192f0 > 6a ff push -1

8 6b1192f2 . 8d45 fc lea eax, dword ptr ss:[ebp-4

]9 6b1192f5 . 50

push

eax10 6b1192f6 . 8b47 08

mov eax, dword ptr ds:[edi+8

]11 6b1192f9 . 8d4d f4 lea ecx, dword ptr ss:

[ebp-c]

12 6b1192fc . 51

push

ecx13 6b1192fd . 8d55 f8 lea edx, dword ptr ss:[ebp-8

]14 6b119300 . 52

push

edx15 6b119301 . 50

push

eax16 6b119302 . ffd6 call

near esi

17 6b119304 . 8b45 fc mov eax, dword ptr ss:[ebp-4

]18 6b119307 . 85c0 test

eax, eax

19 6b119309 .^ 74 e5 je short wmcore.6b1192f0 ;

// 這裡導致死迴圈了~

20 6b11930b . 8b55 f8 mov edx, dword ptr ss:[ebp-8

]21 6b11930e . 8b40 14

mov eax, dword ptr ds:[eax+14

]22 6b119311 . e8 eaf7ffff call

wmcore.6b118b00

23 6b119316 .^ eb d8 jmp short wmcore.6b1192f0

通過幫助文件介紹我們知道 kernel32.getqueuedcompletionstatus 這個函式

的意思是從指定的iocp獲取cp,當cp隊列為空時.對此函式的呼叫將被阻塞.

阻塞?沒錯,阻塞就不會占用cpu100%,但是他的io控制代碼是父視窗建立的 父視窗關閉了,也把控制代碼析構了.

他的邏輯寫的是"死迴圈",所以控制代碼不存在了,就會不停的重複呼叫.也就會cpu占用100%了.

0x3 修復方案

1) 那個視窗改成模態視窗

2) 父視窗關閉時,應該先提前關閉非模態視窗.

這個應該也不能算是bug吧,只能算是我誤操作.  

而且一般人應該也不會像我那樣操作.直接關閉父視窗的  

--==mount英文官方==--

--==mount中文官方==--

--==mount官方招聘==--

才發現,英文版的是page是2011更新的.

中文版的page是2010更新的  

訪著名Linux核心程式設計師大鷹

在網路安全界,如果說起艾奇偉,或許大家都會茫然,但是如果說不認識大鷹,那一定會有人取笑你。這個名字確實很響亮,就象鷹一樣飛遍了網路安全界。登入他的主頁www.e4gle.org,全英文版面的設計可以看出其中的技術含量。尤其是他所在的組織的wss,已經達到了世界級水平。linux界的名人在生活中是什麼...

訪著名Linux核心程式設計師大鷹

在網路安全界,如果說起艾奇偉,或許大家都會茫然,但是如果說不認識大鷹,那一定會有人取笑你。這個名字確實很響亮,就象鷹一樣飛遍了網路安全界。登入他的主頁www.e4gle.org,全英文版面的設計可以看出其中的技術含量。尤其是他所在的組織的wss,已經達到了世界級水平。linux界的名人在生活中是什麼...

程式設計師何苦為難程式設計師

職場上有很多辛酸事,很多合夥人出局的故事,很多技術骨幹被裁員的故事。說來模板都類似,曾經是名校畢業,曾經是優秀員工,曾經被領導表揚,曾經業績突出,然而突然有一天,因為種種原因,被裁員了,想申訴,想求解釋,結論是,能力不匹配,未能與企業一起成長云云。這有兩說,一說是企業冷血,卸磨殺驢,嫌棄老人成本太高...