标签 Elec 下的文章

前言

准备改过后到机房用,只需要一条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

缘由

在上一篇文章中,我使用了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上电自动引脚置高电平是怎么回事。

搞得这个MicroPython啊,亦可赛艇。
经过上一篇文章,已经配置好了WiFi连接和Webrepl,下面我们来尝试与ESP8266来通信,在GPIO2上我接入了一个DS18x20温度传感器,通过访问ESP8266的8267端口,来获得ESP8266上传感器的数值。

main.py:
(在ESP8266上的socket库叫usocket,json库叫ujson)

 from ds18020 import DS18020
 import usocket
 import ujson
 import esp
 host = '0.0.0.0'
 port = 8267

 ds = DS18020(2)
 ds_addr = ds.getaddr()

 s = usocket.socket()
 s.bind((host,port))
 s.listen(6)
 while True:
     client,addr = s.accept()
     print('Client IP:',addr[0])
     info = {}
     info['flash_size'] = str(esp.flash_size())
     info['flash_free'] = str(esp.freemem())
     info['flash_id'] = str(esp.flash_id())
     info['ds18x20_temp'] = str(ds.gettemp(ds_addr[0]))
     print(info)
     client.send(ujson.dumps(info))
     info = {}
     client.close()

ds18020.py
(很惭愧,只做了一点的微小工作)

 import onewire
 import ds18x20
 import time
 from machine import Pin
 class DS18020:
     def __init__(self,pin):
         self.pin = Pin(pin)
     def getaddr(self):
         ow = onewire.OneWire(self.pin)
         self.ds = ds18x20.DS18X20(ow)
         roms = self.ds.scan()
         return roms
     def gettemp(self,addr):
         self.ds.convert_temp()
         time.sleep_ms(450)
         return self.ds.read_temp(addr)

效果:
31_0.PNG
今天还是挺冷的。

之前一直用Arduino,现在来尝试一下Python。

烧录

1. 到官网下载固件

http://www.micropython.org/download

2. 安装esptool工具

请确保有Python环境(Linux或Windows)

pip install esptool

3. 清空Flash

这一步很重要,可以避免很多错误:

esptool.py --port /dev/ttyUSB0 erase_flash (Windows下port为COM口)

4. 下载到ESP8266上

下载前先将GPIO0下拉,进入下载模式:

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20180511-v1.9.4.bin

有些模块的Flash是512K的,可能无法下载固件,可以通过esptool来查看:

esptool.py --port /dev/ttyUSB0 flash_id

连接WiFi与远程编程

通过串口连接ESP8266,可以看到串口输出:
25_0.PNG
依次输入:

>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
>>> sta_if.active(True)
>>> sta_if.connect("", "") #SSID,PASSWD
>>> sta_if.isconnected()
>>> print("IP:",sta_if.ifconfig()[0])

连接后可以看到模块的IP。
远程编程需要用到webrepl,你可以使用MicroPython的在线客户端,或从Github获取:

  1. Github:https://github.com/micropython/webrepl
  2. 在线客户端:http://micropython.org/webrepl

在使用webrepl前,需要进行配置,在串口输入:

>>> import webrepl_setup #按提示配置

配置完成后再在串口输入下面的代码,来开启:

>>> import webrepl
>>> webrepl.start()

你可以通过webrepl来上传/下载文件。
webrepl的界面:
25_1.PNG

文件系统

输入下面命令查看当前有的文件:

 >>> os.listdir()
 ['boot.py', 'webrepl_cfg.py', 'main.py']
 boot.py main.py前被执行(开发板启动时将执行这个该脚本,它设置了开发板的多个选项参数) | main.py 主程序

查看剩余空间:

>>> import micropython
>>> micropython.mem_info()
stack: 2112 out of 8192
GC: total: 35968, used: 10000, free: 25968
No. of 1-blocks: 44, 2-blocks: 15, max blk sz: 264, max free sz: 1417

文档

http://docs.micropython.org/en/latest/library/index.html#python-standard-libraries-and-micro-libraries