今天修改了一下之前做的一個Dll注入exe的Demo。之前由於項目需求,所以瞭解了一下遠程注入Dll方面的知識,其實這個Demo也沒有使用到遠程注入的方面,只是寫了一個Dll,在我的Dll中實現對將要注入進程裡的一個視窗進行子類化,寫好之後通過工具把我的dll注入到將要注入的應用程式中。
在我的dll中有一個讀取註冊表索引值的函數: BOOL ReadData(),通過函數把索引值儲存在一個全域變數dValue。在子類化的過程中,我首先攔截原進程的訊息,相應自己的訊息處理函數,子類化幾乎都是這樣做的。但是我攔截原進程的WM_LBUTTONDOWN或WM_LBUTTONUP訊息中的時候調用我的ReadData函數並把讀到的值存在dValue,但是發現dValue並不一定每次都能擷取到讀取的值,假如註冊表中的那個索引值就是1,dValue擷取到的有時是0有時是1,只是特別讓人費解的地方,迫於無奈我只能把ReadData函數這樣放,如下: 1 LRESULT CALLBACK MyProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
2 {
3 ReadData(); //只能在這裡讀才能保證穩定能dValue能擷取到索引值並儲存
4 switch(msg)
5 {
6 case WM_LBUTTONDOWM:
7 break;
8
9 case WM_LBUTTONUP:
10 break;
11
12 case default:
13 CallWindowProc(OldWndProc,hwnd,msg, wParam, lParam);
14 }
15 return TRUE;
16 } 不大清楚為什麼會這樣子,我嘗試過在WM_LBUTTONUP中調用ReadData之前先調用一個MessageBox,彈出的對話方塊要等單擊確定之後才去執行ReadData函數,這樣的話也能保證讀取到的索引值儲存在dValue中,我想是否因為視窗受到WM_LBUTTONUP會很快收到其他注入WM_MOUSEMOVE之類的訊息,所以ReadData還沒有處理完線程就跳到了WM_MOUSEMOVE訊息處理中,但是為什麼把ReadData放在訊息處理函數之外就能有充足的時間去執行完這個函數?有待研究。 在這次的修改BUG中,有點體會。寫程式一定要冷靜的分析問題,時刻保持思緒清晰。碰到問題了,首先要從大的方面去檢測問題的所在,然後一步一步的把範圍收縮,最終確定問題的根源所在。程式出問題了,一般把程式減縮成只有一個大概的架構進行測試,沒問題了再向原來的這個架構搭建其他程式再測試,如此不斷搭建不斷測試,最終就容易找到問題的根源。