找到
5
篇与
打卡研究
相关的结果
-
利用ESP8266-12E破解钉钉WIFI打卡 钉钉越来越普及,大量的公司都在采用钉钉,同时,使用钉钉的考勤方式。 钉钉打卡方式存在一个WIFI打卡模式,需要连接指定WIFI进行打卡,识别的方式是WIFI的名称和MAC地址, ESP8266-12E是安信可官方推出的wifi模组,可以自建AP,同时还可以修改mac地址,所以就试了试使用ESP8266自建的AP来破解打卡,完美破解。 下面试破解的代码,用的arduino开发的,arduino如何安装,可看我另外一篇文章: Arduino-IDE搭建ESP8266开发环境 Arduino-IDE搭建ESP8266开发环境 代码是复制的太极创客8266 AP模式的代码,增加了设置mac地址 #include <ESP8266WiFi.h> #define AP_ssid "XXXXXXXX" //这里改成公司的WIFI名称 #define password "XXXXXXXX" //密码随便,一样不一样都行 uint8_t macAddr[6] = {0x00,0x00,0x00,0x00,0x00,0x00}; //改成公司的路由器mac地址 bool flag; void setup() { // 启动串口通讯 Serial.begin(9600); Serial.println(); //设置为接入点模式 WiFi.mode(WIFI_AP); //启动AP,并设置账号和密码 Serial.printf("设置接入点中 ... "); //启动校验式网络(需要输入账号密码的网络) WiFi.softAP(AP_ssid, password); //监控状态变量result flag = WiFi.softAP(AP_ssid, password); if (flag) { Serial.println(""); // 通过串口监视器输出信息 Serial.print("当前工作模式:"); // 告知用户设备当前工作模式 Serial.println(WiFi.getMode()); Serial.print("接入点名字:"); Serial.println(AP_ssid); // 告知用户建立的接入点WiFi名 Serial.print("接入点密码:"); Serial.println(password); // 告知用户建立的接入点WiFi密码 Serial.println("接入点模式成功开启"); //不输入参数获取MAC地址 //Serial.printf("MAC地址为 %s\n", WiFi.softAPmacAddress().c_str()); //输入参数获取MAC地址 //WiFi.softAPmacAddress(macAddr); wifi_set_macaddr(SOFTAP_IF, macAddr); delay(1000); WiFi.softAPmacAddress(macAddr); Serial.printf("MAC地址为 %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]); } else { //若没有开启成功 Serial.println("开启失败"); } Serial.println("初始化结束"); } void loop() {} -
利用ESP8266制作钉钉WIFI打卡神器升级版 之前研究的一版破解WiFi打卡的工具,但是WIFI名称、密码、MAC地址全部写死在程序里了,改动需要修改代码重新下载。升级了下网页配置功能 利用自己之前学的一点html知识,结合做前端朋友的帮助,写了一个配网页面,配置时,会对密码和MAC地址进行校验,密码长度必须超过8位或者不输入,MAC先进行格式校验,后对每两个数据进行十六进制校验,通过后,修改所有参数,通过EEPROM库将数据保存在flash。然后重启设备,重新启动后读取配置信息,开启AP并修改MAC地址 下面是最新版的代码,有需要的可以自己下载arduino,买个ESP8266-12F模块,下载进去即可使用 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <EEPROM.h> //首页html const char* home_page_str = "<html>\n <head>\n <meta charset=\"utf-8\" name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n <title>配置页面</title>\n <script src=\"config.html\" type=\"text/javascript\" charset=\"utf-8\"></script>\n <style>\n .formBox{\n width: 100%;\n float: left;\n margin: 0 auto\n }\n .formBox > form {\n width: 80%;\n margin: 0 auto;\n }\n form > input{\n width: 100%;\n height: 40px;\n }\n </style>\n </head>\n <body>\n <div align=\"center\">\n <h1>欢迎使用WIFI打卡神器</h1>\n \n </div><br><br>\n <div align=\"center\" class=\"formBox\">\n <form action=\"/result.html\">\n <h3>WIFI名称:</h3>\n <input type=\"text\" name=\"ssid\" value=\"\" required><br>\n <h3>WIFI密码:</h3>\n <input type=\"text\" name=\"password\" value=\"\"><br>\n <h3>MAC地址:</h3>\n <input type=\"text\" name=\"mac\" value=\"\" required><br>\n <input type=\"submit\" style=\"margin-top: 30px; font-size: 20px;\" value=\"配置\">\n </form> \n </div>\n </body>\n <script>\n \n let {mac,password,ssid} = config;\n document.getElementsByName('mac')[0].value = mac || '';\n document.getElementsByName('password')[0].value = password || '';\n document.getElementsByName('ssid')[0].value = ssid || '';\n \n \n </script>\n</html>"; //定义配置类型 typedef struct { unsigned char Default_Tag;//默认标记 char stassid[32];//定义WIFI名称 char stapsw[64];//定义WIFI密码 uint8_t mac[6]; //定义mac地址 }config_type; //定义默认配置 config_type const Default_Config = { .Default_Tag = 254, .stassid = "www.dzahz.cn\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", .stapsw = {'\0'}, .mac = {0x44,0x55,0xC4,0x37,0xB9,0xC0} }; config_type config; //配置信息 ESP8266WebServer server(80); void setup() { // 启动串口通讯 Serial.begin(115200); Serial.println(); Serial.printf("设置接入点中 ... "); //读取WIFI配置 loadConfig(); if(config.Default_Tag != Default_Config.Default_Tag) //判断是否初始化配置 { config = Default_Config; saveConfig(); } Serial.printf("ssid:%s\n",config.stassid); Serial.printf("pasword:%s\n",config.stapsw); Serial.printf("mac:%x:%x:%x:%x:%x:%x\n",config.mac[0],config.mac[1],config.mac[2],config.mac[3],config.mac[4],config.mac[5]); //启动AP delay(500); wifi_set_macaddr(SOFTAP_IF, config.mac); delay(500); WiFi.mode(WIFI_AP); if(config.stapsw[0] == '\0') WiFi.softAP(config.stassid, NULL); else WiFi.softAP(config.stassid, config.stapsw); //设置wedserver回调 server.on("/",HTTP_GET, homepage); server.on("/result.html",HTTP_GET, config_result); server.on("/config.html",HTTP_GET, query_par); server.onNotFound(handleNotFound); //启动服务 server.begin(); } //十六禁止格式判断,传输数据指针 bool hex_jud(char *str) { if((str[0] > '9') || (str[0] < '0')) //一个如果不是数字,则判断是否是A-F { if((str[0] > 'F') || (str[0] < 'A')) { if((str[0] > 'f') || (str[0] < 'a')) { return false; } } } if((str[1] > '9') || (str[1] < '0')) //一个如果不是数字,则判断是否是A-F { if((str[1] > 'F') || (str[1] < 'A')) { if((str[1] > 'f') || (str[1] < 'a')) { return false; } } } return true; } /**************************************** *函数名称:saveConfig *函数功能:保存配置信息 *输入参数:无 *输出参数:无 *备 注: *****************************************/ void saveConfig() //保存配置函数 { EEPROM.begin(1024); //申请1024的内存 配置保存在前256 uint8_t *p = (uint8_t *)(&config); for (int i = 0; i < sizeof(config); i++) { EEPROM.write(i, *(p + i)); } EEPROM.commit(); } /**************************************** *函数名称:loadConfig *函数功能:读取配置信息 *输入参数:无 *输出参数:无 *备 注: *****************************************/ void loadConfig() { EEPROM.begin(1024); uint8_t *p = (uint8_t *)(&config); for (int i = 0; i < sizeof(config); i++) { *(p + i) = EEPROM.read(i); } EEPROM.commit(); } //acsii转十六进制格式 uint8_t acsii_hes(char *str) { uint8_t h; uint8_t l; if((str[0] <= '9') && (str[0] >= '0')) h = str[0] - '0'; else if((str[0] <= 'F') && (str[0] >= 'A')) h = str[0] - 'A' + 10; else if((str[0] <= 'f') && (str[0] >= 'a')) h = str[0] - 'a' + 10; if((str[1] <= '9') && (str[1] >= '0')) l = str[1] - '0'; else if((str[1] <= 'F') && (str[1] >= 'A')) l = str[1] - 'A' + 10; else if((str[1] <= 'f') && (str[1] >= 'a')) l = str[1] - 'a' + 10; return (h << 4) | l; } //自定义主页访问处理函数 void homepage() { server.send(200, "text/html", home_page_str); Serial.println("用户访问了主页"); } //查SSID接口 void query_par() { char str[256]; sprintf(str,"const config = {\"ssid\":\"%s\",\"password\":\"%s\",\"mac\":\"%2X:%2X:%2X:%2X:%2X:%2X\"}",config.stassid,config.stapsw,config.mac[0],config.mac[1],config.mac[2],config.mac[3],config.mac[4],config.mac[5]); server.send(200, "text/html", str); } //查WIFI密码接口 void read_stapsw() { server.send(200, "text/plain", config.stapsw); } //查mac接口 void read_mac() { char str[50]; sprintf(str,"%2X:%2X:%2X:%2X:%2X:%2X",config.mac[0],config.mac[1],config.mac[2],config.mac[3],config.mac[4],config.mac[5]); server.send(200, "text/plain", str); } //配置接口 void config_result() { char ssid[32]; char password[64]; char mac[64]; char str[512]; int len; int i; //取出所有信息 sprintf(ssid,"%s",server.arg("ssid").c_str()); sprintf(password,"%s",server.arg("password").c_str()); sprintf(mac,"%s",server.arg("mac").c_str()); Serial.printf("ssid:%s\n",ssid); Serial.printf("pasword:%s\n",password); Serial.printf("mac:%s\n",mac); //校验密码长度 len = strlen(password); if((len < 8) && (len != 0)) { sprintf(str,"<html><meta charset=\"utf-8\"><body><p>密码长度错误,长度:%d<b></body></html>",len); server.send(200, "text/html",str); return; } //校验MAC格式 len = strlen(mac); Serial.printf("maclen:%d\n",len); if(len != 17) //校验总长度 { server.send(200, "text/html","<html><meta charset=\"utf-8\"><body><p>mac格式错误<b></body></html>"); return; } for(i = 0; i < 5; i++) //校验: { Serial.printf("mac:%d\n",mac[i*3+2]); if(mac[i*3+2] != ':') { server.send(200, "text/html","<html><meta charset=\"utf-8\"><body><p>mac格式错误<b></body></html>"); return; } } for(i = 0; i < 6; i++) //校验是否十六进制 { if(hex_jud(&mac[i*3]) == false) { server.send(200, "text/html","<html><meta charset=\"utf-8\"><body><p>mac格式错误<b></body></html>"); return; } } //保存信息 len = strlen(ssid); for(i = 0; i < 32; i++) //先清除原有配置 config.stassid[i] = 0; for(i = 0; i < len; i++) config.stassid[i] = ssid[i]; len = strlen(password); for(i = 0; i < 32; i++) //先清除原有配置 config.stapsw[i] = 0; for(i = 0; i < len; i++) config.stapsw[i] = password[i]; for(i = 0; i < 6; i++) //十六进制 { config.mac[i] = acsii_hes(&mac[i*3]); } saveConfig(); server.send(200, "text/html", "<html><meta charset=\"utf-8\"><body><p>设置成功,设备重启<b></body></html>"); delay(500); system_restart(); //复位 } // 设置处理404情况的函数'handleNotFound' void handleNotFound() { // 当浏览器请求的网络资源无法在服务器找到时, server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。 } void loop() { //监听客户请求并处理 server.handleClient(); } -
ESP32C3刷固件,清除Flash lb3sxzcb.png图片 打开烧录软件,按下图选择,点 OK lb3syion.png图片 如图,出现固件和地址选项,在 combine 文件夹下有四种 .bin 可以选择 lb3sz8d5.png图片 点 START,出现 等待上电同步 时长按 BOOT lb3szl0k.png图片 此时出现下载中,待进度条走动,可松开 BOOT 键 lb3t00gc.png图片 等待烧写完成后,按 RST 键即可 lb3t0cr4.png图片 烧录器、固件下载: 下载地址:https://neictop-1256272185.cos.ap-guangzhou.myqcloud.com/2022/11/30/1669821489.zi 提取码: -
合宙ESP32C3 的Arduino开发教程环境配置 介绍 ESP32C3 和ESP32S3都是基于RISCV的内核的处理器,是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件,所以它的性能好,又因为这个开源设计所以价格极低没有授权费用。 这次我使用的是合宙出的,后面会都是用自己设计的板子,板子不带CH343的加上个屏一共是22.5,当然只是当前价格。 laqy1ccz.png图片 laqy15hu.png图片 东西收到是这样,C3和S3主要还是屏幕支持上差别,比如 ESP32-C3支持QSPI 适合4.3寸以下,SPI QSPI,MCU(8080)接口的屏。ESP32-S3除了支持ESP32-C3上述接口外还支持RGB接口,对一些7寸左右屏幕提供支持 性能上,ESP32C3是单核160Mhz,这种开发板标配4MB的FLASH laqy20uw.png图片 开发环境的配置 合宙ESP32C3开发板一定要安装驱动,芮然买回来,插上默认能识别到串口,并显示端口号,但是还是不能用的,一定要安装CH343驱动才行,安装成功后,合宙ESP32C3端口信息会是上图那样带CH343字样。这是开发合宙ESP32C3第一步。 CH343驱动下载地址:https://www.wch.cn/downloads/CH343SER_EXE.html 安装ESP32C3支持固件包 如果原来Arduino IDE默认安装了ESP32支持固件包,型号列表里面是默认不带ESP32C3以及ESP32S2等型号的。 laqy4t0u.png图片 ESP32支持固件包下载地址:https://github.com/espressif/arduino-esp32 附上快速下载地址: laqy50ye.png图片 如果是第一次安装ESP32支持固件,需要在Arduino IDE的菜单-文件-首选项-附加开发板网址管理器当中添加对应的链接 laqy5949.png图片 1.https://dl.espressif.com/dl/package_esp32_index.json 2.https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json上面第一个网址是标准的ESP32开发板地址,后面那个是完整的开发板型号的地址,里面包含C3,S2等型号。 如果是通过上面的github链接将支持固件包离线下载下来了,就可以忽略添加这个网址的步骤。 将下载下来的ESP32支持固件包解压并放置到指定文件夹下 放置路径:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6 这个ESP32支持固件包下来下来压缩包有260多MB,解压后有721MB laqy6cbw.png图片 下载下来的支持固件包比默认安装的ESP32标准固件包文件要多,在拷贝到这个文件夹里面,会遇到有相同的文件的提示,出现这个情况,选择并点击 替换掉原有的文件。 laqy6j1u.png图片 最关键一步来了 将文件解压之后,进入到: C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\toolslaqy8kz0.png图片 双击鼠标左键运行get.exe可执行文件。会弹出一个DOS界面安装窗口: laqy8vh5.png图片 一定要看到全部安装了上图那些内容才算成功,不然在Arduino IDE里面有可能看不到ESP32C3 /S2等型号的ESP32,或者就是有显示ESP32C3,S2等型号,但是选择这些型号,在进行代码编译,到最后会报错:esptool.exe": file does not exist 其他相关建议 在安装完驱动后,或者在点击get.exe运行时安装不全就退出的情况时,建议重启电脑,并再次尝试安装,get.exe安装一定要看到安装齐全才行,安装窗口界面,安装完,会自动关闭的,安装的时候一定要留心安装完整了。我在这个地方就踩过坑,以为自动安装的,安装完了,就没有问题了,以为可以看到能选择ESP32C3的型号的出现就可以使用了,结果跑去编译代码,到最后还是会报错,后面重启电脑,重新运行get.exe,看着窗口安装,并截图下来了,以此作为安装依据。当然最后成功编译,并烧录了第一个程序。 Creating esp32c3 image... Merged 2 ELF sections Successfully created esp32c3 image. "C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.6/tools/gen_esp32part.exe" -q "d:\\arduino\\MyHexDir/partitions.csv" "d:\\arduino\\MyHexDir/Blink.ino.partitions.bin" "C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.6/tools/riscv32-esp-elf/bin/riscv32-esp-elf-size" -A "d:\\arduino\\MyHexDir/Blink.ino.elf" 项目使用了 232580 字节,占用了 (17%) 程序存储空间。最大为 1310720 字节。 全局变量使用了10156字节,(3%)的动态内存,余留317524字节局部变量。最大为327680字节。 C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/esptool/esptool.exe --chip esp32c3 --port COM5 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x0 d:\arduino\MyHexDir/Blink.ino.bootloader.bin 0x8000 d:\arduino\MyHexDir/Blink.ino.partitions.bin 0xe000 C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/partitions/boot_app0.bin 0x10000 d:\arduino\MyHexDir/Blink.ino.bin esptool.py v3.3 Serial port COM5 Connecting.... Chip is ESP32-C3 (revision 3) Features: Wi-Fi Crystal is 40MHz MAC: 60:55:f9:79:87:98 Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Changed. Configuring flash size... Flash will be erased from 0x00000000 to 0x00002fff...烧录时选择flash模式为DIO laqyb9lv.png图片