分类 硬件/开发板 下的文章

前言

准备改过后到机房用,只需要一条USB线就可以用了,还是比较方便的。

硬改

详情请参见此链接

220806165001.png

经测试,硬改后还是能接U盘之类的,虽然本身速度就不快。

编译&使用

选中Kernel modules -> USB Support中的kmod-usb-chipideakmod-usb-gadget-eth即可。

编译完成后刷写固件,之后通过ssh连接到机器上。

# 开机自动加载驱动
echo -e "modprobe g_ether\nexit 0" > /etc/rc.local
# 将接口划入 LAN
uci set network.lan.ifname="eth0 usb0"
uci commit

使用公对公USB线连接到电脑,在Windows下会被识别为一个串口,请参阅下一小节来解决。

220806171625.png

Windows下的驱动问题

OpenWrt Wiki中所述,可以通过指定VIDPID等来解决驱动问题,但没有详细步骤。默认情况下它的硬件ID是USB\VID_0525&PID_A4A2&REV_0409,在Linux下可以直接使用,但在Windows下需要手动安装驱动。

kindle_rndis.inf_amd64.7z

(安全性说明:如果你有相关签名工具,请对驱动进行重新签名)

220806171510.png

参见

https://openwrt.org/docs/guide-user/hardware/usb_gadget

https://www.right.com.cn/forum/thread-317987-1-1.html

安全性警告

由于使用STM32F103C8T6进行软实现,没有使用HSM芯片,故存储在EEPROM中的密钥可能会被调试读出,故存在安全风险,只适合把玩,不适合日常使用。

也存在随机数生成不够随机,侧信道攻击(似乎普遍都有这个问题,不过也不是什么事儿)等安全风险。

前言

没有一个硬件密钥是没办法进行相关开发的,而我暂时没有这个又想把玩一下,所以找了下我吃灰的开发板,找到了一块蓝色长条的STM32F103C8T6开发板,检索一番后最终到了这个开源方案,这个方案只支持U2F验证。

https://github.com/gl-sergei/u2f-token

0719213358.jpg

编译&烧写

由于仓库提供编译好的固件(BLUE_PILL)会使用复位键作为物理验证按钮,所以我们需要修改一下,在lssues找到了一个修改版本,验证时只需要将PA10下拉就行。

本文会省略一些步骤,详情请见仓库README.md

git clone https://github.com/Qwertylex/u2f-token

部署交叉编译工具链:

# 原 PPA 老旧已经失效,故我们需要前往 ARM 网站下载
# 前往 https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads 下载
wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz
tar xvf gcc-arm-11.2-2022.02-x86_64-arm-none-eabi.tar.xz -C /usr/share
ln -s /usr/share/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/* /usr/bin/

编译:

# 注意:
# 我们需要将 Makefile 中的 python 替换为 python3
cd u2f-token
git submodule update --init
cd src
make TARGET=BLUE_PILL_PA10BUTTON
# 编译出的固件在 build/u2f.bin

烧写:

使用 STM32 ST-LINK Utility 通过 ST-LINK V2 进行烧写。
设置跳线:
BOOT0 SET 0
BOOT1 SET 1

19220213.png

识别:

19221309.png

初始化

cd ~/u2f-token
pip3 install -r requirements.txt --user
cd src/cert
python3 certtool init

19220937.png

测试

前往https://demo.yubico.com/webauthn-technical/registration进行测试即可。

19221106.png

开启telnet

首先登录,超级用户如下:

UserName:CMCCAdmin
PassWord:aDm8H%MdA

之后访问:

http://192.168.1.1/cgi-bin/abcdidfope94e0934jiewru8ew414.cgi

返回200ok即代表成功开启。

连接telnet

账号密码如下:

UserName:yhtcAdmin
PassWord:Cm1@YHfw

终端输入:

tcapi get WLan_Common SSIDPre
tcapi get WLan11ac_Common SSIDPre
tcapi set WLan_Common SSIDPre ''
tcapi set WLan11ac_Common SSIDPre ''
tcapi commit WLan
tcapi commit WLan11ac
tcapi save

重启即可。

18203238.png

18204002.png

参考

PT632电信“老猫”分析:
https://www.anquanke.com/post/id/259503

出于学习的需要,配置了一台测试环境用机,铭瑄N3160,配置了一张8111千兆为网卡,这主板板载百兆,不过我的出口只有50Mbps,所以板载口作为WAN口,8111作为LAN口。
我这里已经做好了,所以会和大家操作的有所不同。

创建虚拟机

PVE的安装在这里不再赘述。
由于我的机器不支持VT-D,所以没有写直通,不过也够用了。
首先创建一个虚拟机,在左边选中我们的数据节点,右键新建虚拟机:
212717.jpg

213110.jpg

这里一步一步来:

  • 一般:填写名称,勾选开机自启动,VM ID可指定也可默认
  • 操作系统:不使用任何介质
  • 系统:显卡选择VMWare兼容
  • 硬盘:默认,反正后面会删除
  • CPU:按需分配,这里有CPU权重,就是优先级
  • 内存:按需分配,1G足够
  • 网络:默认vmbr0,模型选择virtio半虚拟化

最后确认创建即可。

创建好后点击我们的虚拟机,点击硬件:

213926.jpg

点击我们新建的硬盘,点击分离它会变成未使用磁盘,再点击它删除,将这个硬盘删除掉。
将我们准备的Openwrt的镜像通过WinSCP上传到我们的PVE上,并执行:

qm importdisk <VM ID> <镜像名称> local-lvm

等完成后回到硬件界面,会发现多了一个未使用磁盘,双击它,直接点击添加,再然后来到选项,双击引导顺序,只选择我们的硬盘。

214823.jpg

这样,虚拟机的配置告一段落。

网络配置

回到服务器节点,点击网络:

215034.jpg

点击创建选择LinuxBridge,名称默认,桥接端口填写物理网卡名称,比方说enp3s0:

215313.jpg

这样,PVE上就有了两个虚拟交换机(网桥),其中默认就有的vmbr0我们作为LAN交换机,新建的vmbr1作为WAN交换机。

我们双击默认交换机vmbr0,更改里面的管理IP与网关,改为我们之后Openwrt的网段,比方说192.168.1.x。

215918.jpg

配置完成后返回Openwrt虚拟机,来到硬件,点击添加,添加网络设备:

220141.jpg

这里分别添加vmbr0与vmbr1,模型选择virtio半虚拟化(更新:不要选E1000,不然性能不行),之后选择节点,点击右上角的重启来生效。

后续配置

连接网线到vmbr0所绑定的网口上。
打开 控制面板\网络和 Internet\网络连接,右键属性,互联网协议4,属性,填写与PVE和将要配置的Openwrt同一网段。
在上面重启后,我们输入PVE的管理IP,回到我们的虚拟机,点击控制台,在里面配置我们的WAN口与LAN口,你可以输入ifconfig来查看端口的MAC地址,再根据硬件选项卡中网络设备所对应的MAC地址来判断,之后在控制台中按照常规配置WAN口与LAN口即可,之后可以通过网页来配置把玩Openwrt。

221032.jpg

后续工作

之后需要配置BIOS来电自启,我这里工作日晚上会断电,所以还要配置提前关机。

(/etc/crontab)
30 22 * * * root /sbin/shutdown -h now

配置单

  • 主板:铭瑄N3160
  • 内存:金士顿DDR3 1333 4GB (这板子挑内存条,手头上的内存条没办法组双通道)
  • 存储:旧的东芝500GB硬盘 (反正对速度没有需求)
  • 网卡:PCIE RTL8111
  • 预计功耗:25w

缘由

在上一篇文章中,我使用了Python来控制我的键盘,但我的OBS好像有时有反应,有时没反应,所以从抽屉中找到了5年前买的Digispark ,用它来做一个硬键盘。
不得不说幸好当初买了两块,有一块被我改错熔丝锁住了。

Arduino环境部署

文件>首选项>附加开发板管理器网址添加如下:

http://digistump.com/package_digistump_index.json

工具>开发板>开发板管理器中找到Digispark后安装即可。

原理图

  • 由于Digispark只有6个IO,且有2个IO用作USB通信,所以最后只剩下4个可用IO(如果你没有改过熔丝位,那就是3个,P5不可用)。
  • 为了塞下5个按钮,使用了ADC(P5/A0)来检测按键按下。
  • 该板P1接板载红色LED。

IMG114153.png

从KEY1到KEY5的ADC值为(VCC=5v):0|509|520|530|540。

代码

#include "DigiKeyboard.h"

void setup() {
  pinMode(1,OUTPUT);
}

//void button(int key_a,int key_b){}
void loop() {
  int AnalogValue = analogRead(A0);
  if(AnalogValue == 0){
    digitalWrite(1,HIGH);
    DigiKeyboard.sendKeyStroke(KEY_F1,MOD_CONTROL_RIGHT);
    delay(200);
  }
  if(508 <= AnalogValue && AnalogValue <= 512){
    digitalWrite(1,HIGH);
    DigiKeyboard.sendKeyStroke(KEY_F2,MOD_CONTROL_RIGHT);
    delay(200);
  }
  if(518 <= AnalogValue && AnalogValue <= 522){
    digitalWrite(1,HIGH);
    DigiKeyboard.sendKeyStroke(KEY_F3,MOD_CONTROL_RIGHT);
    delay(200);
  }
  if(528 <= AnalogValue && AnalogValue <= 532){
    digitalWrite(1,HIGH);
    DigiKeyboard.sendKeyStroke(KEY_F4,MOD_CONTROL_RIGHT);
    delay(200);
  }
  if(538 <= AnalogValue && AnalogValue <= 542){
    digitalWrite(1,HIGH);
    DigiKeyboard.sendKeyStroke(KEY_F5,MOD_CONTROL_RIGHT);
    delay(200);
  }
  digitalWrite(1,LOW);
  DigiKeyboard.delay(200);
}

成品

IMG103157.jpg

硬件设备信息

设备型号: HG8321R
硬件版本: 377.A
软件版本: V3R015C10S103

快速诊断

  • 使用Putty尝试Telnet连接光猫,若无法连接,请看完全流程。
  • 若连接成功,在终端(root/admin)输入如下命令:
WAP> su
SU_WAP> shell
WAP(Dopra Linux) # ?

若返回三个脚本或常用命令无法使用,则说明Shell是被阉割的,请跳到补全Shell部分。

开始

请全程将电脑连接到光猫上!

开启Telnet

确保拔掉光纤,电脑通过网线连接到光猫上!
打开压缩包中的ONT组播工具,按如下步骤操作:

  1. 点击刷新,选中连接光猫的网卡
  2. 选中维修使能,其他不变,点击启动
  3. 等到光信号灯不亮,LAN1、LAN2、网络E/G三个灯长亮,按下停止,关闭工具

之后请硬重启光猫,并连接光纤。

补全Shell

打开压缩包中的TFTPServer.exe,并打开一个Telnet连接,按如下步骤操作:

WAP> load pack by tftp svrip <your_dhcp_ip> remotefile allshell.bin

成功后输入reboot重启。

获取配置文件

打开一个Telnet连接,按如下步骤操作:

WAP> su
SU_WAP> shell
WAP(Dopra Linux) # cd /mnt/jffs2
WAP(Dopra Linux) # cp hw_ctree.xml hw_ctree2.xml
WAP(Dopra Linux) # vi aescrypt.sh && chmod +x aescrypt.sh
--------复制如下内容--------
#!/bin/sh
help()
{
cat << HELP
usage:
crypt option inputfile
options:
-d decode
-e encode
-h show this help message
This script is used to decode/encode Huawei HG8245A config file.
If the outputfile argument is not present, a "deocde"/"encode" sub name will be append                              
on the name of inputfile as outputfile.
Dai Yun 2014 02 11 Chongqing
HELP
exit 0
}
if [ -z "$1" ] ; then
help
fi
checkfile()
{
if [ -z "$1" ] ; then
echo "inputfile must be present"
exit 2
fi
if [ ! -f "$1" ] ; then
echo "inputfile:" $1 "is not exist"
exit 3
fi
}
decode()
{
checkfile $1
local inputfile=$1
if [ -n "$2" ] ; then
local outputfile=$2
else
local outputfile=${inputfile}.decode
fi
gzname=${outputfile}.gz
cp $inputfile $outputfile
aescrypt2 1 $outputfile tmp
mv $outputfile $gzname
gzip -d $gzname
exit 0
}
encode()
{
checkfile $1
local inputfile=$1
if [ -n "$2" ] ; then
outputfile=$2
else
outputfile=${inputfile}.encode
fi
gzname=${outputfile}.gz
cp $inputfile $outputfile
gzip $outputfile
aescrypt2 0 $gzname tmp
mv $gzname $outputfile
exit 0
}
case $1 in
  -h) help;;
  -d) decode $2 $3;exit 1;;
  -e) encode $2 $3;exit 1;;
  *) echo "option argument wrong";help;exit 1;;
esac
---------------------------
WAP(Dopra Linux) # ./aescrypt.sh –d hw_ctree2.xml hw_ctree_decode.xml
WAP(Dopra Linux) # tftp -p -l hw_ctree_decode.xml <your_dhcp_ip>

这样配置文件就被解密和上传到我们的电脑上了,在TFTP软件目录下可以找到,打开它,搜索如下内容:

<X_HW_WebUserInfoInstance InstanceID="1" UserName="

即可找到管理员账号与密码,我们可以登录看看。

解决 不在维护模式 的登录问题

打开上面的配置文件,找到普通用户一行,修改用户等级:

UserLevel="0"

在终端输入:

WAP(Dopra Linux) # tftp -g -r hw_ctree_decode.xml <your_dhcp_ip>
WAP(Dopra Linux) # ./aescrypt.sh –e hw_ctree_decode.xml hw_ctree.xml

重启即可。

改回原版华为界面

修改hw_boardinfo文件,替换如下:

0x0000001b 修改为 COMMON
0x00000031 修改为 CHOOSE_huawei

引用&工具下载

破解过程来自宽带猫
解密脚本来自:http://blog.sina.com.cn/s/blog_6d27791f0101cxcv.html
工具下载:HG8321R-tools.7z

就这个模块,挺便宜的,好像销量很大。

86_0.jpg
[手机拍摄]
我买了两个,用于控制水泵,然而并不能用,排除常见问题后,开始怀疑模块的可用性,于是去谷歌搜了一圈,得到一个结论,设计有缺陷。
它有两个缺陷:

  • 本应接3.3v的CH_DP悬空
  • 使用GPIO0驱动,然而被串了标号103的10K电阻下拉,上电进入下载模式

所以有了两个解决方案:

  1. 同样,将CH_DP脚接一个1K(可不接)到3.3v
  2. 方法一:将下拉的标号103的10K电阻去除
  3. 方法二:割断GPIO0与三极管的连接,将基极连接到GPIO2驱动

我选用了方法一,修好了这个模块,唯一的不足是上电继电器会吸合一会后断开(很短暂),不过也没多大的问题。
我很好奇ESP8266上电自动引脚置高电平是怎么回事。

终于可以不再拼接字符串,而可以直接使用文件系统。

安装FS上传插件

在如下地址下载:

https://github.com/esp8266/arduino-esp8266fs-plugin/releases

将获得的压缩包解压,将ESP8266FS文件夹复制到你的Arduino安装目录的tools文件夹里,重启IDE。
注意:它好像挑版本,我使用1.6.7会报错,使用1.8.5正常上传。

一些说明

1.如何选择我的SPIFFS大小

  • 在你的IDE菜单中(工具 > Falsh Size > 4M(1M SPIFFS)),视情况选择大小。(Falsh)一般ESP01为1M大小,ESP12为4M大小。

2.是否有文件限制

  • 传,都可以传(只要有空间),点击工具菜单中ESP8266 SKetch Data Upload来上传data中的文件。

3.FS库的文档

使用

在你的项目路径会自动生成(如果没有请手动新建)data文件夹,里面存放你要上传的文件,比方说html,css之类的。
我们放入一个index.html,来试一试:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "FS.h"
const char* ssid = "SSID";
const char* password = "PASSWORD";
ESP8266WebServer server(80);
void Route_Index() {
  if(SPIFFS.exists("/index.html")){ //文件存在检测
    File f = SPIFFS.open("/index.html", "r");
    if(!f){ //异常处理
      server.send(500,"text/html","Error on opening!");
    }else{
      String data = f.readString();
      f.close();
      server.send(200,"text/html",data);
    }
  }else{
   server.send(404,"text/html","Not found!");
  }
}
void setup(void){
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("IP: ");
  Serial.print(WiFi.localIP());
  server.on("/",Route_Index);
  server.begin();
  if(!SPIFFS.begin()){ //初始化
    Serial.println("File system init failed!");
  }
}