首页 > 代码库 > RFID开发之圣诞老人无稽之谈
RFID开发之圣诞老人无稽之谈
0X01圣诞节的由来
因为个人爱好对智能卡有一点点皮毛的学习。年初的时候有个做智能卡黑产的朋友找到我,说他接了一个学校的单子,让我帮他写个可以Modify Data的程序(他手上的软件只可以复制卡),年初的时候需要做毕业设计,没空没帮他看。过了几个月,他把读卡器(0FC3读卡器。支持mifare1、S50、S70、SHC1102、mifare Ultralight、mifare light,具有二次开发功能)寄给了我,这样我不帮他也不好推辞了。。。
0X02收集孩子们的需求
拿到手上首先连接PC接通读卡器,USB接口,有报警灯/声,接通电源会DI一声。
进入RFID开发正题!
开发环境:Winxp+VS2010+c#+.NET框架
0X03开始准备圣诞礼物
开发步骤:将ICCard_Seat.ocx和MSCOMM32.OCX拷贝到C:\WINDOWS\system32,CMD命令运行注册COM组件。
regsvr32.exe "C:\WINDOWS\system32\ICCard_Seat.ocx" regsvr32.exe "C:\WINDOWS\system32\MSCOMM32.OCX"
注册完COM组件后,新建Winfrom项目,添加引用COM组件,即可在项目中引用封装好的方法,实现方法即可。
首先测试读卡器是否正常连接串口。
接下来测试读卡器的最基本功能,看看是否能正确读取卡内数据。以此开发的S50此卡为例,S50共有16个扇区,第 0 扇区中只用到块0,用于准确读取卡号。
我在这里使用了北京市政公交卡,在没有Key验证的情况下还是可以正常读取到卡号,卡号区一般不加密!
卡的第一道安全防护为卡得验证密码:如果验证密码不匹配,那么接下来的所有操作都不会进行,也不可进行。
验证卡密码:卡密码是大家最为关注的,如何得到,或者解开卡得密码是所有的关键,因为朋友已经用ACR122U自行解开了卡得Key,我这里就不再赘述。
对于RFID安全性感兴趣的请移驾radiowar wiki自行阅读增长姿势。
几乎每次对卡的读写操作都必须先验证卡密码,才可以进行下一步操作。S50有16个扇区(0-15扇区),每个扇区有4块(0-3块),每块16个字节,每个扇区的块0、1、2为数据块,用于存储数据。
每个扇区的块3也就是第四块为本区的控制块,前6个字节用于保存KeyA,后6个字节用于保存KeyB,中间剩下的字节用于存取控制。
每个扇区的密码和存取控制都是独立的,如果你想对此区做读写操作就需要先验证该区的密码。密码长度为12个字符。
将整个卡得结构分析为64块,例:0区0块即为块1,4区3块,即为块16.大概初步了解S50卡得结构,那么我们进行“详细”的数据分析。
以下的数据是基于多张S50卡,同样结构,不同数据的分析而得出的。
朋友告诉我卡内的余额为100元,12年7月13日开的卡,个人密码为888888
以我的S50卡为例,读出块22的数据为1207132207136C696C69616E88888800
我们不难发现120713,220713这个为日期格式。:(-所以对于数据要敏感。
经过多次刷卡变化的数据,发现了块28一直变化,即第7扇区的块0
E803000000000000EB00640001003B02
E8030000 这里涉及到网络传输字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。
关于高低位字节序,这里不多啰嗦。E8 03 00 00倒序为00 00 03 E8,转成10进制即为1000,通过对比另外几张卡发现这里的金额精确到0.1。
所以,所有的金额都是比原来的大10倍即个位数是 0.1元这个位置即角。十位才是1元,
所以 100元,我们的数据表示是 1000。这时候心血来潮了,让朋友更改了金额为
DC05000000000000EB00640001003B02
(150元),然后去刷卡试验。结果得到的是:卡上还是100元,并且消费机会报警声。那究竟会是什么原因导致此次实验失败呢(此处为智能卡的第二道防护)?
天色已晚,今天是圣诞节,老夫得赶紧为孩儿们准备圣诞礼物。这究竟是圣诞老人的有Ji之谈还是无Ji之谈?各位看官尽情发表观点。
未完待续
本次项目Demo下载地址:下载地址
以上纯属是圣诞老人无稽之谈,不具有导向性,代表性。仅为个人学习日志!欢迎交流,互相学习!
祝大家圣诞快乐!