第一次接触IC卡还是大学里,当时要做毕业设计,做一个食堂刷卡消费系统。做了毕业设计,转头就开始研究IC卡的破解。当时比较流行先用acr122u-A9或者pm3把原卡密码破解(122可以破解非全加密,pm3可以破解全加密),然后用uid卡复制。当时就有滚动码防复制系统,那个时候唯一的方法是发卡破解,技术门槛较高。

时光荏苒,一眨眼我胡子都长到地上,N年没碰IC卡。一个机缘巧合,需要复制卡,发现新出来很多卡,cuid、fuid、ufuid。。。索性就重新了解一下这个行业的现状。

IC基础

先简单铺垫一下基础知识吧,方便下文理解。只做简要描述,详细内容可自行查阅相关资料。

【IC卡读写】

IC卡内有很多个抽屉,每个抽屉都有一把密码锁,只有用正确的密码,才能打开抽屉,看看里面装了啥,或者往里面放东西拿东西。IC卡出厂的时候,厂家会设定默认密码。

【普通卡密】

小明和小红都有一张IC卡,抽屉的密码是一样的,宿管王大爷用统一的密码就能打开他们的抽屉,检查里面的东西。

这就产生一个问题,要是小明偷看了王大爷的密码,他也能打开小红的抽屉,甚至别人所有人的抽屉。小明还可以把自己抽屉里的东西摆放得和小红一模一样,王大爷一看抽屉,还以为是小红的抽屉。

【一卡一密】

小明和小红的抽屉密码是不一样的,王大爷一看,哎哟是小明的抽屉,就输入密码xiaoming,看到小红的抽屉就输入密码xiaohong。

但是密码怎么来的,只有王大爷知道,小明不知道。小明不知道算法,即使偷看王大爷开自己的抽屉,记住的也只是自己的密码,无法打开小红的抽屉。

而且,小明即使把自己的抽屉外观,伪装得和小红一模一样,由于不知道小红的抽屉密码,只要王大爷一输入密码xiaohong,就会发现不对劲,不是小红的抽屉。

滚动码原理

滚动码出现的需求就是uid卡可以完全复制IC卡,市面上出现大量复制卡。

假如IC卡内的数据是死的,是不变化的,那依样画葫芦,像复印机一样,一张复印N张,张张都能用。等于是一把钥匙被复制,会出现一些安全隐患,或者说是管理方不愿看到的(卖卡收费)。

滚动码的原理很简单,每刷一次卡,内卡有个数据都会变化。比如刚开始是0,刷一次变成1,再刷一次变2,到9之后再刷又变回0,俗称滚动(实际不一定0-9滚动,变化很多)。

不光卡内的滚动码会变,读卡器也会记录滚动码,只有当卡内的滚动码和读卡器保存的滚动码相同,才会被认为的正常的卡。

而复制的卡,因为卡内数据不会同步,正常的卡刷过后,滚动码变了,而复制卡内的滚动码还是原来的数字,就和读卡器内最新的滚动码不一样,被判定为复制卡。

现在高级一点的防复制防火墙,甚至一旦发现是复制卡,会破坏卡片,或者把卡片拉黑,导致正常卡也无法使用。

破解

破解有两种方式。

发卡

发卡破解难度较高,原理一句话就能说清。把各种数据计算方法破解了,把卡片的控制规则摸清了,相当于物业(管理员)给你发了一张全新的卡片。

严格来说,这种方式不是复制卡片。

有的人是分析大量的数据,找到其中的规律,有的人是拿到了厂家的软件,把软件破解了,再把其中的算法拿出来用。根据不同系统的复杂程度,此种破解方式难度不同。

现在市面上也有人集合了各个厂家的破解算法,提供收费服务。只要你告诉他是什么厂家的什么系统,他就能给你计算出一个全新有效的数据。只要把数据写入新卡,就能当一张物业发的新卡使用。

特殊复制卡

现在新出来一种卡片,gtu、guid、gid、gpu类似等等,都是同一种卡,只是叫法不同。都是G开头,滚动的拼音首字母。下文统一称呼为gtu卡。

漏洞一:部分滚动码系统有一个漏洞,滚动码存在初始值(复位值)。因为读卡器是离线的,新卡的滚动码没法同步到读卡器内,就需要一个初始值来判断第一次刷卡。

可以看到,只要卡内的滚动码是初始值,读卡器就会判定为合法卡片。

正常情况下,每次刷卡,滚动码都会变化。神奇的gtu卡,有一种功能,就是锁定滚动码,卡片自动复原滚动码。只要把滚动码锁定成初始值或复位值,就能达到复制的目的。

漏洞二:部分系统存在逻辑漏洞。读卡器不会立即保存最新的滚动码,需要先把新的滚动码写入ic卡,如果写卡失败,滚动码就不会更新。换而言之,只要让滚动码写卡失败,就可以让滚动码不“滚”。

破解方式可以用gtu卡锁定滚动码,让读卡器写卡失败,也可以修改ic卡的控制字节。默认的控制字节“FF-07-80-69”是可读可写的,将保存滚动码的数据块的控制字节设为“只读”,读卡器就无法修改ic卡内的滚动码,写卡会失败。

此种破解方式需要一个前提,滚动码保存的位置相对独立。如果滚动码和正常刷卡要用的数据混合在一起,锁定区块,也就锁定了正常数据,会影响刷卡。

漏洞三:和漏洞二差不多,也是逻辑漏洞。部分读卡器更新滚动码的逻辑是这样的,读卡器把更新的滚动码写入卡片,然后再读一次卡片,把读到的滚动码保存到读卡器。正常情况新滚动码写入卡片,卡片里就是最新的滚动码,再读一遍没有问题,但是遇到gtp卡会锁定数据,这样读卡器读回的滚动码始终不会变化,保存的滚动码就不“滚动”了。

防御

上面提到的2个漏洞,并不是所有的系统都有,gtu卡也不是万能的。

对于漏洞一,有的系统不需要初始值来判断是否的第一次刷卡,自身存储内没有刷卡记录,则认为是首次刷卡。复位值也不一定存在,有的系统没有设计复位功能。

对于漏洞二,属于一个流程上的BUG,已有部分系统修正了这个漏洞。一旦读卡器写卡失败,虽然不会更新滚动码,但是也不会执行后面的操作(开门、电梯按钮亮灯等等),刷卡会无反应。漏洞三也应该有部分系统修正了,只要将新滚动码保存在读卡器的临时变量里,后面再正式写入内存,不要用读卡的方式去将卡片内滚动码保存。

在常规滚动码的基础上,部分系统还会有滚动码“暗桩”。举个例子,明面上滚动码从0-9在循环滚动,但实际上每循环一次,就会在一个不起眼的角落标记一个数字,代表了循环次数。如果分析破解滚动码时,没有发现暗桩,就无法正常使用。

 

更新一种防复制、防破解的算法流程

一种无法复制、无法破解的IC卡数据算法和读写流程

THE END

欢乐的时光特别快,又到时候讲拜拜~

欢迎补充,有错漏可以留言指出,谢谢支持。

4条评论

  1. 你好,看了你的帖子有个疑问。
    你上面的例子只能适用在一台刷卡器的情况下才能讲通。我们都知道现在小区里大门有刷卡器,单元门有刷卡器,电梯里也有刷卡器。如果你上面的描述没有问题的话。那就是说小区内只有一处的刷卡器能够让卡数据变化还是说不同的刷卡器有某种数据同步的机制??

  2. 这几天从淘宝买了NFC复制卡的机器,把公司物业的电梯卡复制到手环了,正常使用两天不知道会不会被封。。有同事说电梯卡是滚动码,我的复制流程只是把电梯卡解密,完全复制到一张空卡,再把空卡格式化,此时空卡有卡号无加密内容,让手环复制空卡,再用读卡器把M1数据写入手环。

发表评论

评论通过审核后才会显示
你的电子邮件地址不会被公开 * 为必填字段

Captcha Code

提交评论