梯控、IC卡滚动码防复制原理和破解

8/4/2022 4:19:16 PM
7501
0

第一次接触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在循环滚动,但实际上每循环一次,就会在一个不起眼的角落标记一个数字,代表了循环次数。如果分析破解滚动码时,没有发现暗桩,就无法正常使用。

全部评论



提问