UI自动化之-使用DD_XOFT实现带有安全控件、U盾的输入
一,場景描述
最近在做web端的UI自動化測試,涉及與第三方頁面的交互,發現selenium對帶有安全控件,U盾的輸入框使用senkeys方法不起作用,無法正常輸入內容,此時放棄selenium的輸入,更換其他思路。
問題總結,測試的時候發現,當使用U盾時,任務管理器的進程中會啟動多個安全輸入的進程,當殺死進程時,手動輸入密碼也不會成功,因此想到會不會是程序級的操作鼠標鍵盤層級太高,被監測到而無法輸入,因此想到使用較為底層的DD插件,經過嘗試發現是可行的,但是輸入成功率較低
二,解決方法
官網地址 http://www.ddxoft.com 下載一個名為DD81200x64.64.dll的插件(其實就是在它官方群的文件中下載的)。
3.1 電腦安裝DirectX C++庫
3.2 使用管理員打開Pycharm工具或者使用管理員打開cmd窗口,運行Python文件
3.3 進入BIOS,查找“secure boot”選項,設置成“disable”,或改以傳統方式啟動。
三,DD鍵鼠介紹
DD虛擬鍵盤碼表
DD自帶的方法
-
DD_chk()
功能:檢測驅動程序是否正常。
返回值: 0 , -1 ,-2 ,-3
分別表示: 驅動正常,鍵盤驅動錯誤,鼠標驅動錯誤,鍵盤鼠標驅動都錯誤 -
DD_btn(參數)
功能: 模擬鼠標點擊
參數:
1 =左鍵按下,2 =左鍵放開
4 =右鍵按下,8 =右鍵放開
16 =中鍵按下,20 =中鍵放開
64 =4鍵按下, 128 =4鍵放開
256 =5鍵按下, 512 =5鍵放開
例子:模擬鼠標右鍵 只需要連寫 dd_btn(4) ; dd_btn(8) -
DD_mov(參數x,參數y)
功能: 模擬鼠標移動
參數: 參數x , 參數y 以屏幕左上角為原點。
例子: 把鼠標移動到分辨率1920*1080 的屏幕正中間,
int x = 1920/2 ; int y = 1080/2;
DD_mov(x,y) ; -
DD_whl(參數)
功能: 模擬鼠標滾輪
參數: 1=前 , 2 = 后
例子: 向前滾一格, DD_whl(1) -
DD_key(參數1,參數2)
功能: 模擬鍵盤按鍵
參數: 參數1 ,請查看 DD虛擬鍵盤碼表。
參數2,1=按下,2=放開
例子: 模擬TAB按鍵,只需連寫
DD_key(15, 1);
DD_key(15, 2); -
DD_str(參數)
功能: 直接輸入鍵盤上可見字符和空格
參數: 字符串
例子: DD_str(“MyEmail@aa.bb.cc !@#$”) -
DD_todc(參數)
功能: 轉換Windows虛擬鍵碼到 DD 專用鍵碼.
參數: Windows虛擬鍵碼
例子:
int ddcode = DD_todc(VK_ESCAPE);
Dim ddcode As int32 = DD_todc(27);
四,安全控件工作原理
嘗試
首先大家都應該知道,安全控件肯定會對密碼做一個加密。銀行的安全加密級別,基本上是沒法直接正面破解的,所以就直接上模擬瀏覽器吧。然而在密碼框,webdriver用各種姿勢的按鍵輸入都無效。疑惑開始。
想想,安全控件是獨立的一個exe安裝在系統上的,可能是密碼輸入調用了瀏覽器之外的東西,所以瀏覽器層的模擬輸入無效。那就換系統級的模擬輸入吧。來,python調用winAPI接口模擬鍵盤輸入,無效;按鍵精靈,無效。
奇怪,再來。屏幕鍵盤,無效。我平時是用著兩臺電腦的,之間用mousewithoutborders共享鼠標鍵盤。發現直連鍵盤的那臺機能輸入,但另一臺機沒法輸入,在密碼輸入框,怎么按都沒有輸入。
好吧,用鍵盤鉤子監控一下鍵盤的輸入吧。發現正常輸入密碼時,監控到的字符變成空了。看來加密控件在hook層之前就動了手腳。
尋找原因
以上為熱身動作,開始吧。先搜索鍵盤輸入一個按鍵的傳遞流程,再搜索安全控件的功能(目的)和實現原理。
Windows 操作系統中,PS/2 鍵盤輸入信息的傳遞流程如下:
1)用戶敲擊按鍵,一個按鍵被按下時,鍵盤發送相應的電信號到計算機主板上的鍵盤控制器(i8042);
2)鍵盤控制器告知CPU有鍵按下,同時將按鍵信息以鍵盤掃描碼的形式寫到鍵盤 I/O 接口(其中 0x60 端口保存按鍵掃描碼,0x64 端口記錄鍵盤控制器的狀態),并產生終端請求IRQ1;
3)操作系統根據 IOAPIC 重定位表查到 IRQ1 所對應的中斷號(正常情況為0x93),在根據中斷向量表(IDT)查得這一中斷對應的中斷處理函數的地址,調用中斷處理程序(ISR)進行處理;ISR 讀出 0x60 端口的鍵盤掃描碼,將之轉換成系統掃描碼,封裝包含按鍵信息的 IO 請求包(IRP),將 IRP 發往鍵盤端口驅動(PS/2 鍵盤的端口驅動為 i8042 prt.sys);
4)鍵盤端口驅動將按鍵信息發往鍵盤類驅動(Kdbclass.sys,所有類型鍵盤通用);
5)鍵盤類驅動將按鍵信息封裝到系統消息中發往 csrss.exe,按鍵信息首先被保存到系統消息隊列中;
6)csrss.exe 將按鍵信息分發到各個應用程序的線程消息隊列;
7)焦點窗口所屬的程序從線程消息隊列中讀取被轉為 ASCII 碼(如果需要,還需要經過輸入法編輯器 IME 的處理)的按鍵信息,并調用 use32.dll 更新用戶界面。
以上,可以很清晰的看到 PS/2 類型鍵盤的傳遞流程。而銀行的安全控件,應該是從第2層拿了端口數據進行加密。對于這種情況,我們只需要查詢所要輸入字符的鍵盤掃描碼,發送到60/64端口即可。事實上我們網上搜到的大部分“驅動級模擬鍵盤輸入”,都是這種。
然而,這是對于 PS/2 這種鍵盤而言的。可是目前只有筆記本和部分老臺式機才保留有 PS/2 ,現在主流的服務器都是只接受 USB 鍵盤的。所以向端口發送鍵盤掃描碼這種方式并不好用。
如上圖所示,AcitveX 安全控件的防護原理如下:
1、 當用戶將輸入焦點定位到安全控件上,準備進行口令輸入時,激活相應安全控件。
2、用戶通過敲擊鍵盤上的字符,產生相應的電信號。觸動操作系統的相應的中斷 IRQ。
3、操作系統調用鍵盤驅動解釋相應電信號所代表的字符,并進行相應的數據加密。將驅動解釋出來的字符發送到操作系統消息隊列中。
4、安全控件將接收到的密文保存在控件內的私密控件中,然后在界面上顯示星號(*),并且停止字符的繼續傳播。
5、當用戶點擊網頁上的登錄提交按鈕時,安全控件中被通知執行提交動作。安全控件動態將已加密的口令內容添加到頁面中要提交的表單中,然后提交表單。
6、IE 將表單中的數據通過 HTTPS 通道傳送到服務器,進行相應的處理工作。
依靠微軟的驅動,先于用戶態下和核心態上層的病毒和木馬程序(如 hook 和篡改 SSDT、系統服務 API)獲取到鍵盤輸入,以杜絕病毒和木馬程序獲取到鍵盤輸入。。。
使用。但有些特殊的像游戲鍵盤,經常會編寫自己的鍵盤驅動,我們可以找相關的開發資料。另外,有些游戲對鼠標鍵盤的輸入要求高響應,經常會像安全控件的做法那樣,直接讀驅動解釋出來的數據。我們只需要找相應的外掛程序,也能作一些參考。
《驅動掛載對網銀的入侵以及相應的防御方式》中,就是通過驅動掛載監控到密碼的輸入。然而攻防是個博弈的過程,兩者都不斷在發展,技術不斷更新。。
總結
以上是生活随笔為你收集整理的UI自动化之-使用DD_XOFT实现带有安全控件、U盾的输入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka集群的安全认证机构 SASL_
- 下一篇: 干货|80天自学通过高级项目管理师