然後,正文開始……
其實虛擬狗幾天前就寫完了,可這幾天上不了網,所以沒寫博客……(你有完沒完!!!)
然後,正文開始……
第二步開始搞定RY2_Open函數……完了。真的完了,RY2_Open一句代碼都不用謝,Rockey2的庫在第一步枚舉Rockey2加密鎖的時候就把每把鎖的HID,UID,硬件版本(就是RY2_GetVersion獲得的版本,所以RY2_GetVersion也不用寫了)讀到內存了,所以直接調用RY2_Open就可以正確返回狗的句柄了,不過這也有一點不好,無法通過虛擬狗截取程序要求的UID和HID,因爲這部分的比較都在RY2_Open裏完成了。
接着就是關鍵的讀寫部分了RY2_Read和RY2_Write,通過OD跟蹤發現Rockey2的通訊都是通過HidD_SetFeature和HidD_GetFeature這兩個API完成的,封裝成了個函數,流程就是HidD_SetFeature發送命令和數據HidD_GetFeature接收返回數據分析了一下協議,很簡單:
HidD_SetFeature
FUN: RY2_Read RY2_Write RY2_GenUID RY2_Transform
CMD: 81 82 87 8B
ARG: block_index block_index FF 00
PAG: 0-8 0-8 FF [LEN]1
ARG: [uid]4 [uid]4 00 00 00 00 [uid]4
DAT: buffer512 buffer512 seed64 data32
重寫了Get_Report的HID_REPORT_TYPE_FEATURE分支返回數據,增加了Set_Report函數處理命令。這樣RY2_Read和RY2_Write也就完成了
至此,虛擬狗已經基本完成了,只剩RY2_GenUID和RY2_Transform兩個與算法相關的API了,由於沒有實物狗,是在無能爲力。RY2_GenUID用的應該不多,至少實際產品中應該不會用到,如果被調用的話我只寫了個彈出Seed的消息框,並不會生成UID,應該不會用到,如果被調用的話我只寫了個彈出Seed的消息框,並不會生成UID,不過有兩個例外,根據官方文檔和OD了一個寫狗程序,找到兩個Seed-UID對
seed:12345 uid:2AA426F3
seed:chinacoho and chi uid:2BF2DB93
RY2_Transform就直接返回一串0了。
狗內的數據部分我做成了一個外部的dat文件,包括HID、UID、block內數據,這樣就方便交流了。
有問題的朋友請留言,可以深入交流。
另:希望使用Rockey2的廠商一定要使用RY2_Transform函數,這樣才能更有效的保護自己的產品
代碼開源!感謝某位大神的幫助!地址:http://download.csdn.net/detail/douniwan5788/4114939
(發博客時發生了點小意外,Service Unavailable,登不上博客了,掛着代理纔上來,Google了一下還是個常見問題……)