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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

UI自动化之-使用DD_XOFT实现带有安全控件、U盾的输入

發布時間:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UI自动化之-使用DD_XOFT实现带有安全控件、U盾的输入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,場景描述

最近在做web端的UI自動化測試,涉及與第三方頁面的交互,發現selenium對帶有安全控件,U盾的輸入框使用senkeys方法不起作用,無法正常輸入內容,此時放棄selenium的輸入,更換其他思路。

  • python模擬鼠標鍵盤操作pymouse、pykeyboard,失敗!
  • python win32con,win32api中的鍵盤,鼠標方法,失敗!
  • 系統事件的拷貝和粘貼,Ctrl+C,Crtl+V,失敗!
  • 操作系統的鍵盤事件輸入,DD插件,成功!
  • 問題總結,測試的時候發現,當使用U盾時,任務管理器的進程中會啟動多個安全輸入的進程,當殺死進程時,手動輸入密碼也不會成功,因此想到會不會是程序級的操作鼠標鍵盤層級太高,被監測到而無法輸入,因此想到使用較為底層的DD插件,經過嘗試發現是可行的,但是輸入成功率較低

    二,解決方法

  • 采用第三方虛擬鍵盤DD XOFT,通過系統的鍵鼠事件輸入,控件鍵鼠完成安全控件的輸入
    官網地址 http://www.ddxoft.com 下載一個名為DD81200x64.64.dll的插件(其實就是在它官方群的文件中下載的)。
  • 以下是官方的Python Demo代碼,先在本地嘗試能否運行
  • from ctypes import * import timeprint("Load DD!") path = r'C:\Users\Administrator\Downloads\master-master\master-master\Example\App_python\vs2017\DD\DD94687.64.dll' dd_dll = windll.LoadLibrary(path) time.sleep(2) print("dd_dll:",dd_dll)st = dd_dll.DD_btn(0) #DD Initialize print("st:",st) if st==1:print("OK") else:print("Error")exit(101)print("Keyboard Left win") #LWin is 601 in ddcode, 1=down, 2=up. dd_dll.DD_key(601, 1) dd_dll.DD_key(601, 2) time.sleep(2)print("Mouse move abs.") dd_dll.DD_mov(200, 200) time.sleep(2)print("Mouse move rel.") dd_dll.DD_movR(50, 50) time.sleep(2)print("Mouse Right button ") #1==L.down, 2==L.up, 4==R.down, 8==R.up, 16==M.down, 32==M.up dd_dll.DD_btn(4) dd_dll.DD_btn(8) time.sleep(2)
  • 代碼運行條件:
    3.1 電腦安裝DirectX C++庫
    3.2 使用管理員打開Pycharm工具或者使用管理員打開cmd窗口,運行Python文件
    3.3 進入BIOS,查找“secure boot”選項,設置成“disable”,或改以傳統方式啟動。
  • Demo文件運行成功,就可以將按鍵輸入與自動化的代碼組合在一起進行代碼編寫了
  • 以下是比較全的使用DD實現賬號密碼輸入
  • from ctypes import * import time import os import win32apiclass op_keyboard():def __init__(self):parentDirPath = os.path.dirname(os.path.abspath(__file__))path = parentDirPath + ("\\DD94687.64.dll") # 這個dll是當前路徑下面的print(path)self.dd_dll = windll.LoadLibrary(path)# DD虛擬碼,可以用DD內置函數轉換。self.vk = {'5': 205, 'c': 503, 'n': 506, 'z': 501, '3': 203, '1': 201, 'd': 403, '0': 210, 'l': 409, '8': 208, 'w': 302,'u': 307, '4': 204, 'e': 303, '[': 311, 'f': 404, 'y': 306, 'x': 502, 'g': 405, 'v': 504, 'r': 304, 'i': 308,'a': 401, 'm': 507, 'h': 406, '.': 509, ',': 508, ']': 312, '/': 510, '6': 206, '2': 202, 'b': 505, 'k': 408,'7': 207, 'q': 301, "'": 411, '\\': 313, 'j': 407, '`': 200, '9': 209, 'p': 310, 'o': 309, 't': 305, '-': 211,'=': 212, 's': 402, ';': 410}# 需要組合shift的按鍵。self.vk2 = {'"': "'", '#': '3', ')': '0', '^': '6', '?': '/', '>': '.', '<': ',', '+': '=', '*': '8', '&': '7', '{': '[', '_': '-','|': '\\', '~': '`', ':': ';', '$': '4', '}': ']', '%': '5', '@': '2', '!': '1', '(': '9'}def down_up(self, code):# 進行一組按鍵。(1:按下;2:抬起)self.dd_dll.DD_key(self.vk[code], 1)self.dd_dll.DD_key(self.vk[code], 2)def dd(self, i): # 自己可以定義各種操作# 500是shift鍵碼。if i.isupper():# 如果想輸入大寫,先按下shift,再輸入字母,然后松掉shift。# 按下抬起。self.dd_dll.DD_key(500, 1)self.down_up(i.lower())self.dd_dll.DD_key(500, 2)elif i in '~!@#$%^&*()_+{}|:"<>?':# 輸入特殊字符一樣的道理。self.dd_dll.DD_key(500, 1)self.down_up(self.vk2[i])self.dd_dll.DD_key(500, 2)else:# 輸入常規的字符self.down_up(i.lower())# self.dd_dll.DD_key(self.vk[i], 1)# time.sleep(1)# self.dd_dll.DD_key(self.vk[i], 2)def click(self):'''模擬鼠標,位置在鼠標位置'''self.dd_dll.DD_btn(4)self.dd_dll.DD_btn(8)def shifang(self):win32api.FreeLibrary(self.dd_dll._handle)if __name__ == "__main__":op = op_keyboard()for i in '123456':op.dd(i)op.shifang()

    三,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盾的输入的全部內容,希望文章能夠幫你解決所遇到的問題。

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