usb編程器源代碼(usb通信編程)
前沿拓展:
一、 媒介
2014年美國黑帽大會上研討人員JakobLell和Karsten Nohl展現了badusb的進擊辦法后,海內與badusb相干的文章固然有了一些,然則大部門人把相干文章都閱讀后照樣會有種“不明覺厲”的感到,badusb仍有一層朦朧的面紗。顛末一段光陰的進修和研討后,筆者盼望經由進程自己的一些心得體會可以或許贊助其余人更清楚地認識badusb,也盼望這篇文章可以或許起到必定的啟迪。這篇文章重要分為五個部門——常識掃盲部門、badusb固件編寫部門、badusb設置裝備擺設界面部門、技巧瞻望部門和總結部門。
二、硬件籌備
本文應用的硬件是Arduino Leonardo開辟板,然則不難將Leonardo開辟板調換為別的Arduino開辟板。
三、常識掃盲
1. 固然USB協定有必定的破綻,然則不是任何USB裝備都能制造badusb的。制造badusb有兩個焦點,一個是可以或許為USB裝備編寫相應的固件,另一個是可以或許將編寫的固件燒錄到USB裝備中。要編寫相應的固件就需要控制USB裝備中微節制器(或許說芯片)的指令標準文檔(假如Intel不供給開辟文檔,那末除Intel自己沒有人能為Intel處理器編寫法式);而要將固件燒錄到USB裝備中,要末應用相應的硬件編程器,要末就需要USB裝備自己曾經存在的bootloader來幫助停止燒錄事情(bootloader是USB裝備廠商在臨盆時就放在USB裝備中的,網上某些優盤的優盤量產對象也是從廠商流出的,而不是第三方編寫的)。要同時滿意兩個焦點前提照樣比較難的,即就是JakobLell和Karsten Nohl頒布的badusb應用代碼也是針對滿意必定前提的優盤,由于流出的優盤量產對象無限(既然有優盤量產對象,可以或許推想相應的優盤中確定有bootloader或許相似bootloader的固件存在,那末經由進程逆向優盤量產對象就可以夠或許控制PC端軟件和特定優盤的通訊方法,進而實現自己的燒錄對象)。
2. Arduino 和 teensy這類開辟板之以是輕易制造badusb,是由于它們采用的微節制器民間有詳細的闡明文檔。最常用的是atmel公司的微節制器,atmel官網供給了各類開辟文檔和開辟相干的庫等。
3. Atmel廠商的微節制器整合了SRAM, FLASH和EEPROM。SRAM就比如電腦的內存,不消關懷;FLASH高地點寄存的是bootloader,低地點則寄存用戶燒錄的固件,芯片加電時間接履行用戶的固件,然則芯片復位時會先履行bootloader(這一點是燒錄的癥結),再履行用戶的固件;EEPROM則重要用來寄存數據,用戶可以或許隨便改動EEPROM中的數據,固件也能夠或許從EEPROM里讀取數據(本文的固件示例和PC端法式都應用了這一特征)。
4. Avr libc是一個開源名目,針對atmel廠商的各類微節制器開辟C說話庫、編譯器、燒錄對象等一系列幫助對象,另有針對Windows平臺的WinAvr名目。Arduino ide的焦點其實也是avr libc。
5. Arduino的開辟板有相應的bootloader(在FLASH高地點)可以或許和avr libc名目中的avrdude.exe軟件通訊,實現固件的燒寫和讀取舉措。在Arduino開辟板復位時,會加載bootloader,這時就可以夠或許應用avrdude.exe和bootloader通訊。復位操縱可以或許經由進程開辟板上的復位按鈕,或許編程實現軟復位操縱(假如開辟板支撐的話)。
6. Intel hex 是一種用于編程器的特別的文件格局,正是由于這類格局,使得咱們可以或許自在節制數據的存儲地點。Intel hex的文件格局剖析可以或許自行網上搜刮。
四、常識獲得道路
1. USB常識獲得
假如只是為了簡略懂得USB裝備為何可以或許模仿鍵盤、鼠標等別的裝備,網上有很多博客是對于USB標準詳解的,也能夠或許簡略地看《USB開辟大全》和《USB應用開辟實例詳解》前面對于USB通用協定部門,假如不是對硬件感興趣沒需要窮究。
2. Arduino、Avr libc常識獲得
這兩樣其實都是開源的,以是只要有充足的精神和氣力,看源代碼深刻懂得相干常識是沒成績的。然則假如只是想體驗一下制造badusb,可以或許只看一下Arduino的民間文檔和avrdude.exe的相干文檔,看這些文檔時也沒需要窮究每一個細節,能必定程度上“照葫蘆畫瓢”就可以夠或許了。
五、Badusb固件編寫
這里給的固件示例在履行時會從EEPROM中指定的地點讀取數據,依據讀取的數據和制定的規矩發送相應的按鍵相應給PC主機。
#include"Keyboard.h"#include"EEPROM.h" intmodifier_key = -1; //modifier_key不為-1闡明Win鍵、Ctrl鍵或許Shift鍵按下,這個示例特指Win鍵intkeycode; //寄存要發送的按鍵代碼unsignedint delay_time = 0; //固件履行下條指令時提早的光陰unsignedint address = 0; //從EEPROM讀取數據的地點,這里要和EEPROM寄存數據的地點同等charnum_char[10] = {0}; //某個數字的字符串情勢,這個數字用于delay()的參數,也就是作為就寢的光陰int num= 0;intindex = 0; //change this to match your platform:voidsetup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); Keyboard.begin(); delay(1000); //期待一段光陰,讓USB裝備和PC主機通訊實現初始化事情 while((keycode = EEPROM.read(address++))!= 0){//輪回從EEPROM中讀取數據直到讀到數值0(不是數字0),這個值是在向EEPROM中寫入數據時在末端增加的。 if (keycode == '$') { //假如從EEPROM中讀到的數值即是'的ASCII碼 modifier_key = 131; //將modifier_key的值設為Win鍵的鍵值,這個值會和后續的按鍵組合后發送給PC主機 continue; }/* 將兩個'&'字符之間的數字作為后續一個按鍵發送后就寢的光陰,這里之以是要有這個節制值是由于各種身分都邑影響按鍵按下到某個窗口彈出的光陰,假如在窗口未彈出就發送了某個按鍵,這個按鍵就生效了,后續的按鍵組合起來也不完備了。比如在按下Win+R鍵后,還沒等運轉對話框彈出,固件就發送了"cmd"按鍵,那末此次啟動cmd確定就失敗了。 */ if (keycode == '&') { while ((keycode = EEPROM.read(address++))!= '&') { num_char[index++] = keycode; } sscanf(num_char, "%d",&num); delay_time = num; //將EEPROM中讀取的數據轉換為數值后保留到delay_time,節制下次發送按鍵后就寢光陰 memset(num_char, 0, sizeof(num_char));//清空num_char為下次轉換做籌備 continue; } if (keycode == ';') { //假如從EEPROM中讀取的數值即是';'的ASCII碼,將發送一個回車鍵的按鍵碼 keycode = 176; //176即是回車鍵的按鍵碼 } Write(keycode); //現實發送按鍵的舉措 };}//voidloop() { // do nothing: while (true);} voidWrite(int code){ if (modifier_key != -1) { //在這個例子中,modifier_key不即是-1就即是Win鍵的按鍵碼 Keyboard.press(modifier_key); //按下Win鍵,不放 Keyboard.press(code); //按下另一個按鍵,不放 Keyboard.releaseAll(); //同時攤開Win鍵和另一個按鍵,發送Win+某個按鍵給PC主機 modifier_key = -1; delay(delay_time); //這個光陰要末即是0,要末即是兩個'&'字符之間指定的值 } else { Keyboard.write(code); //不然間接按下某個按鍵并攤開 delay(delay_time); //這個光陰要末即是0,要末即是兩個'&'字符之間指定的值 } delay_time = 0;}這里針對這個固件給幾個例子贊助懂得:
1. 從EEPROM中順次讀取到’、’r'($r)表現badusb會按下Win+R鍵。
2. 從EEPROM中順次讀取到’、’r'、’;'($r;)表現badusb會按下Win+R,而后按回車鍵。
3. 從EEPROM中順次讀取到’&’、’5′、’0′、’0′、’&’、’、’r'、’;'(&500&$r;)表現badusb會按下Win+R鍵,而后期待500毫秒(包管運轉對話框彈出),再按下回車鍵。
4. 從EEPROM中順次讀取到(&500&$rpowershell&400&;Get-Date;)表現badusb先按下Win+R鍵,期待500毫秒后輸入powershell,按回車鍵后期待400毫秒,再輸入Get-Date,末了按下回車鍵。
六、Badusb設置裝備擺設界面
所謂的Badusb設置裝備擺設界面,就是avrdude.exe的UI界面精簡版,再額定供給了節制Badusb履行的舉措的功效(本色就是改動了EEPROM特定地點的數據,由于固件是依據EEPROM中的數據履行舉措的)。
圖1 PC法式界面
這個法式重要就是avrdude.exe的UI界面,只要executable處和address處是為了自定義Badusb舉措計劃的。partno的選項和programmer的選項是剖析選定的avrdude.conf獲得的,以是不抉擇avrdude.conf的話partno和programmer的下拉框將為空;端標語是經由進程注冊表獲獲得的。
當點擊upload按鈕或許dump按鈕時,先應用編程方法實現復位操縱(前面會說明怎樣實現的),在長久的停息后應用CreateProcess履行avrdude.exe法式;而假如用戶在executable處輸入了字符串,PC法式會依據用戶輸入的字符串和Address處給定的地點天生intel hex格局的文件(還記得前面常識掃盲部門提到的intel hex格局?認識了intel hex的格局后,完全可以或許自己寫出天生hex文件的代碼,以是這里就不貼出代碼了),再挪用avrdude.exe把天生的intel hex文件燒錄到eeprom。上面給個詳細的演示。
圖2 燒錄固件并指定Badusb履行舉措
Executable處輸入的字符串唆使badusb履行的舉措,這里badusb先按下Win+R鍵,期待500毫秒后輸入powershell,按下回車鍵,期待600毫秒后輸入Get-Date而后按下回車鍵,再輸入echoabcdefghijklmnopqrstuvwxyz按下回車鍵,末了再次輸入Get-Date和回車鍵。至于界面中別的一些零散的參數筆者怎樣曉得的前面會說,其實不可完全可以或許一個一個測驗考試。
后果演示視頻鏈接:https://v.qq.com/x/page/l03900zm1pe.html
視頻沒有演示badusb的迫害多大(比如從服務器下載木馬履行、盜取小我信息等),究竟這些更多的屬于powershell劇本常識、cmd敕令之類的,不是這篇文章的目標。
演示視頻中重要閱歷了如下幾個階段:
1. 抉擇了avrdude.conf文件后partno和programmer下拉框會展現avrdude.exe支撐的芯片型號和編程器(編程器本色上是和bootloader通訊的協定)。
2. 插上開辟板(有提醒音)后,port下拉框會展現開辟板的串標語。
3. 在executable編纂框中輸入badusb需要履行的按鍵序列”&500&$rcmd”,再抉摘要燒錄到FLASH的固件(只需要燒錄一次固件,今后都不需要了),點擊upload后兩次彈出敕令窗口停止燒錄(第一次燒錄固件,第二次向EEPROM中寫入數據),發明開辟板重啟后彈出了運轉對話框并輸入了”cmd”。
4. 改動executable編纂框的內容為”&500&$rcmd;”(多了一個分號,也就是多按了一個回車鍵),再次點擊upload(由于沒有抉擇固件,以是不會停止固件的燒錄,只會改動EEPROM的數據),發明開辟板重啟后彈出運轉對話框緊接著敏捷彈出了敕令窗口。
5. 之后又改動了兩次executable編纂框的內容并燒錄以改動EEPROM的數據,發明一次是只彈出了powershell窗口,一次是彈出了powershell窗口后又履行了三條powershell指令。
七、技巧瞻望
此次的示例只是展現了應用arduino leonardo開辟板模仿usb鍵盤,而windows一旦鎖屏,模仿成鍵盤鼠標之類的badusb就生效了。而有人發明在鎖屏狀況下拔出網卡會讓windows操縱系統發送dhcp哀求給新拔出的網卡分派ip,那末是否是可以或許讓usb裝備模仿成網卡兼dhcp服務器兼dns服務器,到達在鎖屏狀況下經由進程badusb挾制流量、盜取信息的目標?固然有局限性,然則也闡明了一個成績——badusb不只是簡略地應用usb協定的破綻,還可以或許聯合操縱系統的一系列特征(缺點?)在看似不可能的環境下履行,badusb的技巧另有很多可以或許摸索的處所。
八、總結
1. 理一下思緒,要制造badusb,就要包管能編寫出相應的固件并能經由進程某種手腕將固件燒錄到usb裝備中。要想經由進程這兩點,最便利的就是應用arduino或許teensy這類開辟板,不然就需要看有無民間的集成開辟環境,比如Cypress官網就供給了詳細的開辟文檔、示例、開辟環境等。
2. arduino開辟板重要應用的是atmel廠商的微節制器,編譯對象和燒錄對象也是來自開源名目avr libc。可以或許在arduino ide中“文件->首選項->設置”勾上表現編譯和上傳的詳細輸入,而后應用ide的上傳功效上傳一個示例代碼,在輸入窗口就可以看到很多有用的信息。附上一個示例:
圖3 arduino ide詳細輸入信息(a)
3. 看到圖4的輸入信息,應當可以或許聯想到經由進程軟件復位開辟板其實是經由進程以1200bps速度和開辟板停止串口通訊,再進一步去看Windows串口通訊時發明還需要設置幾個其余參數,這時怎樣辦呢?只能看arduinoide是怎樣設置那些參數的,經由進程如下幾個步調尋找到arduino ide設置相干參數的源代碼(arduino ide的源代碼github上有):
①在源代碼根目次應用findstr /Sn /c:”Foundupload port”查找含有字符串“Found upload port”的文件,發明門路為arduino-core\src\cc\arduino\packages\uploaders\SerialUploader.java:276:(findstr是Windows供給的在文檔中查找字符串的對象)
②檢查Serial Uploader代碼,發明字符串“Found upload port”在waitForUploadPort辦法中,進一步發明挪用了waitForUploadPort辦法的是uploadUsingPreferences辦法,在uploadUsingPreferences辦法中發明挪用了Serial.touchForCDCReset辦法,經由進程辦法名字預測這個函數和開辟板復位無關。
③再次應用findstr /Sn /c:”touchForCDCReset”找到touchForCDCReset辦法的實現是在文件arduino-core\src\processing\app\Serial.java:90:中。
④在Serial.java中發明有這么一行代碼:
serialPort.setParams(1200,8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);到這里可以或許勇敢預測出應用串口通訊的方法復位開辟板時除1200這個參數值外其余參數的值了。
圖4 arduino ide詳細輸入信息(b)
4. 經由進程圖5可以或許看到arduino ide在挪用avrdude.exe燒錄固件到我的開辟板時的一系列參數(-p就是partno,-c就是programmer,-b就是baudrate,可以或許發明和我前面演示時設定的參數是同樣的,由于我的那些參數就是依據這里表現的設置的)。有興趣的可以或許看看“Arduino裝置門路\hardware\arduino\avr”目次下的boards.txt、platform.txt和programmers.txt,應當會有很多勞績。
5. 想應用arduino開辟板制造有用的,或許擴大性強的badusb,需要理清如下邏輯:
①arduino開辟板應用的重如果atmel廠商的微節制器,而atmel廠商的微節制器集成為了SRAM,FlASH和EEPROM,此中arduino開辟板中的FLASH高地點寄存了某種bootloader,低地點則寄存用戶上傳到開辟板的固件;arduino開辟板的EERPOM可以或許依據自己的環境應用。
②arduino開辟板復位時,先啟動bootloader,一段光陰(平日是幾秒)后啟動用戶的固件。而avrdude.exe燒錄進程其實就是在復位時和arduino開辟板的bootloader通訊,以是只要在bootloader啟動階段應用avrdude.exe能力勝利燒錄。必定要掌握好光陰。
③固件法式可以或許從eeprom或flash中讀取數據,而intelhex格局文件可以或許節制將數據寫入特定存儲器的特定地點,應用這一點可以或許極大的擴大badusb的功效,并且將要履行的指令放在flash或許eeprom中也能在必定程度上起到暗藏后果。
拓展知識:
- 1海信42k11p怎么折開(海信42K11P:全方位展示超清畫質)
- 2電視頻道沒了怎么恢復(快速解決方法)
- 3Fardior燃氣灶售后維修電話號碼查詢(Fardior燃氣灶售后維修電話查詢)
- 4艾木歐防盜門沒電打不開怎么辦(艾木歐防盜門沒電無法啟動?解決方法總結)
- 5ENS指紋鎖售后熱線(ENS指紋鎖售后熱線-專業解決您的問題)
- 6打電話顯示關機是什么原因(如何解決手機無法接通問題)。
- 7v500hk1 cs5故障維修(v500hk1 cs5故障維修指南)
- 8創維液晶電視的遙控器怎么調試(創維電視遙控器調試指南)
- 9林內空氣能售后服務官網熱線(林內空氣能售后服務官網熱線)
- 10朝友精工保險柜24小時售后電話(朝友精工保險柜24小時售后電話 - 完善24小時保
-
美的中央空調24小時服務熱線電話(為什么美的空調制熱就關機美的空調制熱為何
2024-09-12
-
開利空調全國服務熱線(中央開利空調內機制冷噪音如何有效降噪)
2024-09-12
-
天津斯麥格SMEG冰箱售后故障報修中心(冰箱冷藏傳感器)
2024-09-12
-
開利空調24小時熱線(開利空調常見故障及維修方法你知道如何自行解決嗎?)
2024-09-12
-
三菱中央空調廠家售后電話24小時人工電話(三菱空調開不到是怎么回事排除故障
2024-09-12