ChromeOS自动登录
使用Python3调用系统的uinput来模拟键盘输入密码/PIN
首先需要先开启开发者模式,这个每个型号可能不太一样,自己找教程
解除 rootfs 只读限制(如果还没做)
sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification
sudo reboot这个据说可以跳过跳过开发者模式30秒等待界面(我的机器到我手上已经是只有3秒了)
sudo crossystem dev_default_boot=disk将这两个文件放到指定路径:
文件 /usr/local/bin/autologin_type.py
#!/usr/bin/env python3
"""通过 /dev/uinput 模拟键盘输入,用于 ChromeOS 自动登录"""
import struct, time, sys, fcntl, os
UI_SET_EVBIT = 0x40045564
UI_SET_KEYBIT = 0x40045565
UI_DEV_CREATE = 0x5501
UI_DEV_DESTROY = 0x5502
EV_SYN = 0x00
EV_KEY = 0x01
SYN_REPORT = 0x00
KEY_ENTER = 28
KEY_LEFTSHIFT = 42
KEYMAP = {
'a': (30, False), 'b': (48, False), 'c': (46, False), 'd': (32, False),
'e': (18, False), 'f': (33, False), 'g': (34, False), 'h': (35, False),
'i': (23, False), 'j': (36, False), 'k': (37, False), 'l': (38, False),
'm': (50, False), 'n': (49, False), 'o': (24, False), 'p': (25, False),
'q': (16, False), 'r': (19, False), 's': (31, False), 't': (20, False),
'u': (22, False), 'v': (47, False), 'w': (17, False), 'x': (45, False),
'y': (21, False), 'z': (44, False),
'1': (2, False), '2': (3, False), '3': (4, False), '4': (5, False),
'5': (6, False), '6': (7, False), '7': (8, False), '8': (9, False),
'9': (10, False), '0': (11, False),
}
def write_event(fd, ev_type, code, value):
t = time.time()
sec = int(t)
usec = int((t - sec) * 1000000)
fd.write(struct.pack('llHHi', sec, usec, ev_type, code, value))
fd.flush()
def setup_uinput():
fd = open('/dev/uinput', 'wb')
fcntl.ioctl(fd, UI_SET_EVBIT, EV_KEY)
all_keys = set(kc for kc, _ in KEYMAP.values())
all_keys.add(KEY_ENTER)
all_keys.add(KEY_LEFTSHIFT)
for key in all_keys:
fcntl.ioctl(fd, UI_SET_KEYBIT, key)
name = b'autologin-kbd' + b'\0' * 67
fd.write(name)
fd.write(struct.pack('HHHHi', 0x03, 0x01, 0x01, 1, 0))
fd.write(b'\0' * (4 * 64 * 4))
fd.flush()
fcntl.ioctl(fd, UI_DEV_CREATE)
time.sleep(0.5)
return fd
def press_key(fd, keycode):
write_event(fd, EV_KEY, keycode, 1)
write_event(fd, EV_SYN, SYN_REPORT, 0)
time.sleep(0.05)
write_event(fd, EV_KEY, keycode, 0)
write_event(fd, EV_SYN, SYN_REPORT, 0)
time.sleep(0.05)
def type_char(fd, ch):
if ch in KEYMAP:
keycode, shift = KEYMAP[ch]
if shift:
write_event(fd, EV_KEY, KEY_LEFTSHIFT, 1)
write_event(fd, EV_SYN, SYN_REPORT, 0)
press_key(fd, keycode)
if shift:
write_event(fd, EV_KEY, KEY_LEFTSHIFT, 0)
write_event(fd, EV_SYN, SYN_REPORT, 0)
def main():
text = sys.argv[1] if len(sys.argv) > 1 else ''
fd = setup_uinput()
time.sleep(0.3)
for ch in text:
type_char(fd, ch)
time.sleep(0.03)
time.sleep(0.1)
press_key(fd, KEY_ENTER)
time.sleep(0.5)
fcntl.ioctl(fd, UI_DEV_DESTROY)
fd.close()
if __name__ == '__main__':
main()文件 /etc/init/autologin.conf
description "Auto login"
start on started ui
env LD_LIBRARY_PATH=/usr/local/lib
script
sleep 15
exec python3 /usr/local/bin/autologin_type.py 密码或pin看你要输入什么能解锁就输什么 > /tmp/autologin.log 2>&1
end script你可以用各种方式保存在某个路径,然后再去终端里 sudo cp 当前文件路径 目标路径 把他复制过去
如果没有成功,可以手动运行 initctl start autologin 然后等15秒看log /tmp/autologin.log
如果咩咩的文章对你有帮助,您可以 请我喝牛奶
郑羊羊咩的窝