然后,正文开始……
其实虚拟狗几天前就写完了,可这几天上不了网,所以没写博客……(你有完没完!!!)
然后,正文开始……
第二步开始搞定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了一下还是个常见问题……)