在滲透測試中,有些工具的運行(例如高版本的Powershell)需要依賴Microsoft .NET Framework 4.0的環境。 而默認配置下,Win7不支持Microsoft .NET Framework 4.0。為了保證工具能夠在Win7下使用,這里就需要在命令行下實現安裝Microsoft .NET Framework 4.0。
經過一番搜索,我沒有找到介紹命令行下安裝Microsoft .NET Framework的資料。
于是我寫了這篇文章,介紹我的實現方法,開源C代碼,分享實現原理和腳本開發的細節。
簡介
本文將要介紹以下內容:
· Win7下安裝Microsoft .NET Framework 4.0的正常方法
· 命令行下的實現方法
· 實現原理
· 腳本開發的細節
Win7下安裝Microsoft .NET Framework 4.0的正常方法
Microsoft .NET Framework的安裝包分為兩種:
(1)Web Installer
下載地址:
https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=17851
Web Installer的文件很小,在安裝過程中需要Internet連接來下載其他所需的.NET Framework組件
(2)Standalone Installer
下載地址:
https://www.microsoft.com/en-US/Download/confirmation.aspx?id=17718
Standalone Installer的文件相對來說會很大,因為它包括了完整的組件,在安裝過程中不需要Internet連接。
這里以Standalone Installer為例,正常的流程如下:
1.下載Standalone Installer
獲得文件dotNetFx40_Full_x86_x64.exe。
2.運行dotNetFx40_Full_x86_x64.exe
彈出對話框,選擇同意協議后點擊Install按鈕。
如下圖:

3.等待安裝過程
如下圖:

4.安裝完成,彈出對話框
如下圖:

點擊Finish按鈕進入下一步。
5.再次彈出對話框,提示選擇是否重啟系統
如下圖:

在系統重啟后,完成所有安裝工作。
命令行下的實現方法
這里介紹我最開始的思路:
1.我們可以通過向安裝程序的面板發送按鍵消息來模擬用戶的點擊行為
2.為保證在命令行下安裝,需要對彈出的對話框發送隱藏窗口的消息
3.為保證按鍵準確,這里不應該采用計算坐標的方法模擬鼠標點擊,而是枚舉窗口獲得按鈕的句柄,向目標句柄發送鼠標點擊的消息
為了驗證我的思路,首先需要編寫程序查看是否能夠獲得每個安裝頁面的按鈕句柄。
我寫了如下C代碼:
#include <afx.h> #include <windows.h> BOOL CALLBACK EnumChildWindowProc(HWND Child_hWnd, LPARAM lParam) { WCHAR szTitle[1024]; if (Child_hWnd) { GetWindowText(Child_hWnd, szTitle, sizeof(szTitle)); printf("[*] Handle: %08Xn", Child_hWnd); printf("[*] Caption: %wsn", szTitle); return true; } return false; } int _tmain(int argc, _TCHAR *argv[]) { HWND hWnd3 = FindWindow(NULL, L"Microsoft .NET Framework 4 Setup"); if (hWnd3 == NULL) { printf("[!] I can't find the main window.n"); return 0; } EnumChildWindows(hWnd3, EnumChildWindowProc, 0); return 0; }
對于第一個安裝頁面,使用程序來枚舉所有子窗口,輸出句柄和標題,如下圖:

這里需要注意Install按鈕,默認為disable狀態,如果想要進入下一步,需要先將Install按鈕設置為enable狀態,再發送鼠標點擊的消息。
在代碼實現上加上一個if判斷來實現,關鍵代碼如下:
if (wcscmp(szTitle, L"&Install") == 0) { printf("[+] Catch it!n"); printf("[*] Handle: %08Xn", Child_hWnd); printf("[*] Caption: %wsn", szTitle); printf("[*] Enable the Install button.n"); EnableWindow(Child_hWnd, TRUE); printf("[*] Send the click command to &Install.n"); ::PostMessage(Child_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0,0)); ::PostMessage(Child_hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0)); }
完成這一步后我們進入下一步,等待安裝結束后進入第二個頁面,同樣枚舉一下所有子窗口,如下圖:


我們看到,之前頁面的子窗口還在,我們需要向Finish按鈕發送鼠標點擊消息,關鍵代碼如下:
if (wcscmp(szTitle, L"&Finish") == 0) { printf("[+] Catch it!n"); printf("[*] Handle: %08Xn", Child_hWnd); printf("[*] Caption: %wsn", szTitle); printf("[*] Send the click command to &Finish.n"); ::PostMessage(Child_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0)); ::PostMessage(Child_hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0)); }
接下來進入最后一步,再一次枚舉所有子窗口,如下圖:

我們看到,頁面的子窗口被刷新,在程序實現上這里需要重新獲得主窗口的句柄,我們向Restart Later按鈕發送鼠標點擊消息,關鍵代碼如下:
if (wcscmp(szTitle, L"Restart &Later") == 0) { printf("[+] Catch it!n"); printf("[*] Handle: %08Xn", Child_hWnd); printf("[*] Caption: %wsn", szTitle); printf("[*] Send the click command to Restart &Later.n"); ::PostMessage(Child_hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0)); ::PostMessage(Child_hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0)); }
至此,關鍵的實現代碼已經完成。
而要完整的實現在命令行下安裝Microsoft .NET Framework,還需要考慮以下問題;
1.當啟動安裝程序dotNetFx40_Full_x86_x64.exe前,需要檢查安裝環境,如果已經存在另一個安裝進程,那么會彈框提示沖突
如下圖:

這里需要在啟動前做一個判斷:如果存在另一個安裝進程,就結束安裝操作。
2.當啟動安裝程序dotNetFx40_Full_x86_x64.exe時,會啟動子進程Setup.exe,這里沒法做到通過設置啟動參數隱藏啟動進程Setup.exe來隱藏窗口
這里需要加一個循環判斷,只要發現主窗口就對其隱藏。
為了避免CPU占用過多,在做while循環時,應該加一個Sleep函數。
3.啟動安裝程序后需要模擬鼠標點擊
需要注意的是,接下來的安裝過程中,子窗口Install(名稱為&Install)會一直存在,為了避免重復向Install按鈕發送點擊消息,在實現上我使用了第二個函數來匹配其他按鈕。
4.安裝完成后,彈出新的窗口提示安裝成功,捕獲子窗口,向其發送鼠標按鍵的命令
這里捕獲的子窗口名稱為&Finish。
5.接下來,彈框提示是否重新啟動系統時,需要通過FindWindow()重新獲得句柄
這里可以放在第二個函數的同一個循環中,當發現子窗口Restart &Later時,向其發送鼠標按鍵的命令。
需要注意彈出的窗口為新窗口,不能使用之前的窗口句柄,需要通過FindWindow()重新獲得句柄。
完整實現代碼已開源,地址如下:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/Install_.Net_Framework_from_the_command_line.cpp
代碼支持命令行下安裝Microsoft .NET Framework 4、Microsoft .NET Framework 4.5和Microsoft .NET Framework 4.5.1
小結
本文介紹了通過發送鼠標消息在命令行下安裝Microsoft .NET Framework的方法,開源C代碼,分享實現原理和腳本開發的細節。
原文鏈接:https://www.4hou.com/posts/pXgX