惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
G
Google Developers Blog
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
F
Full Disclosure
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
Help Net Security
Help Net Security
The Hacker News
The Hacker News
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
博客园 - 聂微东
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
N
News | PayPal Newsroom
A
About on SuperTechFans
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
罗磊的独立博客
K
Kaspersky official blog
The Cloudflare Blog
I
Intezer

依云's Blog

Wayfire支持不缩放Xwayland啦 - 依云's Blog 使用wayvnc远程访问无头Wayfire会话 - 依云's Blog pacfiles: 高速的 pacman -F 替代品 用 Android 手机当电脑的话筒 - 依云's Blog 使用 ffmpeg 对音频文件进行响度归一化 - 依云's Blog 使用 nftables 屏蔽大量 IP - 依云's Blog YubiKey 初体验 - 依云's Blog fcitx5 码表同步方案 - 依云's Blog 我正在使用的火狐扩展(2024年版) - 依云's Blog 使用 PipeWire 实现自动应用均衡器 如果你发现你的 OOM Killer 在乱杀进程 使用 atuin 管理 shell 命令历史 btrfs 元数据满了怎么办 btrfs 翻车记 在 nspawn 里运行 docker Linux 上的字体配置与故障排除 新的 PaddleOCR 部署方案 使用 EasyEffects 调整 Bose 音箱的体验 让离线软件真正离线 我所讨厌的网页行为 tmux 状态栏优化 Google Chrome 中的字体设置 从 getmail6 到 offlineimap 微信消息通知的困扰 Qt 的字体渲染问题 Wayfire 迁移进展(四):不那么 high 的 DPI Wayfire 迁移进展(二):Xwayland HiDPI 以及 waybar Wayfire 迁移进展 不同情况下的图形效果 Wayland 初体验 纯 CSS 实现倒三角箭头 倾听蓝牙耳机的按键事件 使用 bwrap 沙盒 一次失败的 KDE 尝试 i3 的 scratchpad 处理逻辑 HiDPI 配置记录 让 QEMU 使用 SPICE 协议 Python 小版本升级是怎么 break 已有项目的 让 Arch Linux 系统和最新的镜像同步,从最快的镜像下载 tar 归档的权限问题 Linux 的环境变量怎么设 终端色彩总结 桥接无线网卡! Linux 的进程优先级与 nice 值 Intel GVT-g 初体验 自制大上 Paperlike HD「驱动」 Python 3.8 升级记录 Poker II 键盘调教记 红黑树到底是个什么树 gdb 不肯加载调试信息怎么办? NVIDIA PRIME 配置笔记 寻找最快的 GitHub IP 火狐远程调试火狐 fcitx 扩展:使用键盘粘贴选区(以及X选区原理科普) T470p 使用N卡运行 Xorg 系统在解析哪些域名呢? 正确的隐藏挂载点的方法 迁移系统到 SSD 使用 cgroups net_cls 来让 docker 走代理 使用 cgroups 限制指定进程的内存使用 在 Linux 下整理磁盘碎片 docker 里几个基本概念的简单类比 解析 zxinc IPv6 数据库 Ant Design 彩蛋事件之我见 通过 Cloudflare DNS 验证来申请 Let's Encrypt 证书 正确地上传至 PyPI 并展示文档 与 Android 进行 WLAN Direct 连接 获得高精度环形镜子一枚 每次修 Python 代码的 bug 的时候总会想念 Rust 永远不要 tail -f 管道 人生苦短,我用 skim XZ2C: 没有 root 的日子(也还过得去) 使用 iptables 透明代理 TCP 与 UDP Linux 下获取文件的创建时间 递归遍历目录:Python vs Go vs Rust 这个博客要死了 Windows 10 中配置网络共享 小米 Note 3 令人失望地方 小米 Note 3 入手体验 使用 VirtualBox 启动本地磁盘上的其它系统 大上 Paperlike HD 电子墨水屏开箱体验 加固 systemd 服务 嗨 Win10,这是我的浏览器 在 Linux 下设置录音笔的时间 我正在使用的火狐扩展 使用 Python 读取火狐的 cookies WireGuard: 简单好用的 VPN To hup or not to hup 书签搜索:藏在书签里的搜索引擎 使用 Prince 转换 HTML 文档给 Kindle 阅读 放弃 you-get,转投 youtube-dl 等连上互联网之后再来找我吧 改了一下 GTK 3 的默认主题 新的火狐,新的旅程 师者不师,学生不学 谁又用掉了我的磁盘空间?——魔改 ncdu 来对比文件树大小变化 NeWifi 3.2.1.5900 root swapview 更新 nodejs 子进程的正确用法(你应该忽视函数名) 电脑被盗事件
修改 Sony LT26i 的 boot.img
依云 · 2013-01-21 · via 依云's Blog

上篇记录了我给 LT26i 刷机的过程,现在该是修改它的启动代码了。

这部分内容我折腾了好久,现在把技术细节分享出来。有次我都看到有人明确表示 Sony 的 boot.img 不一样,还亲自做了新的,却没能看到修改方法,实在遗憾。

所有操作都是在 Linux 下完成的。用到的 Windows 软件 WinHex 是可以 wine 的。

解包

Sony Xperia S 使用了自己定制的格式,因此网上流传的split_bootimg.pl并不能用。Sony 提供了制作这种文件的脚本,但是没有解包的脚本。不过其格式很简单,自己写一个根本不费事:

#!/usr/bin/env python3
# vim:fileencoding=utf-8

import sys
import os
import struct

def getSegNum(f):
  f.seek(44)
  d = f.read(2)
  return struct.unpack('<H', d)[0]

def readSegInfo(f):
  d = f.read(32)
  info = struct.unpack('<LLLLLLLL', d)
  return info[4], info[1] # size, offset

def main(fname, output):
  if os.path.isdir(output):
    os.rmdir(output)
  os.mkdir(output)
  f = open(fname, 'rb')
  os.chdir(output)
  n = getSegNum(f)
  f.seek(52)
  segs = [readSegInfo(f) for i in range(n)]
  for i, seg in enumerate(segs):
    f.seek(seg[1])
    data = f.read(seg[0])
    with open(str(i), 'wb') as wf:
      wf.write(data)

if __name__ == '__main__':
  if len(sys.argv) != 3:
    print('Which file and where to extract?')
  else:
    main(*sys.argv[1:])

使用方法很简单(至少比 Sony 那个mkelf.py简单 :-)

unpackelf.py .../android/cm-9.1.0-nozomi/boot.img boot_cm

对于 CyanogenMod,解开的目标目录boot_cm下会有012三个文件。使用file命令便知,initramfs(或称 ramdisk)是1。解开它很容易:

mkdir ramdisk && cd ramdisk && gunzip < ../1 | cpio -i

对于官方 ROM 也只是多了一个叫3的文件(它的数据在boot.img的开始处)。

启动图片

很明显,logo.rle最有可能是启动图片了。可是,它是什么格式呢?Google 便有了答案。使用那里的 C 程序可将这图片有损地转成 RGB 原始数据。

5652rgb -rle < logo.rle > logo.raw

然后用 ImageMagick 的convert命令转换成常见图像格式:

convert -depth 8 -size 720x1280 rgb:logo.raw logo.png

-size那里填上自己的屏幕分辨率。不知道的话就根据屏幕比例和像素数解二元二次方程吧 ^_^ 反正要是转换出来不止一张图片肯定就不对了。

以上是显示启动图片的方法。至于生成的方法嘛,我没有需要就不弄了,直接用 Sony 原生 ROM 里的logo.rle文件替换之。

换回官方 ROM,安装 recovery

修改完启动图片,我还是不太满意 CyanogenMod 的主题啊之类的,和 Sony 的比起来太丑了。于是又刷了从网上某处找来的「索爱 LT26i 基于6.1.A.1.58最新官方ROM纯净版」。它已经 root 了,但是没有开机时按音量键的恢复模式了。于是我手动修改 initramfs,自己给它加上了。

通过比较和搜索可知,在init.semc.rc文件中,CyanogenMod 在 early-boot 的时候调用了sbin/bootrec命令。在官方 ROM 的 330 行那里加上即可。另外一个可以修改的地方是default.prop文件的ro.debuggable项,其值改成1,可以让 adb 使用 root 权限,push/pull 系统文件的时候特别方便。

然后把官方 ROM 的sbin下没有的文件从 CyanogenMod 那边复制过来即可。注意有大量软链接,可使用cp -ia来复制。我顺手把sbin/bootrec-device里的sleep 3改成只暂停一秒了。这是启动时检测按键以进入恢复模式的等待时间。同时可以看到,这个脚本会将各种指示灯点亮,有兴趣的也可以改改,比如换个指示灯颜色什么的。

打包

首先把文件们弄回 initramfs 里去:

find . | cpio -o -H newc | gzip > ../new_ram

注意这里一定要指定 cpio 的格式为newc,不然启动不了的。

本来,Sony 官方提供的mkelf.py可以用来打包,对付 CyanogenMod 的 boot.img 足够。但是官方 ROM 多出了一段,因此打包参数不一样。我直接用 WinHex 修改 boot.img 文件了。除了 initramfs 本体之外,还有三处需要修改:initramfs 的长度(两个)、下一个叫「RPM」部分的偏移位置。还好没有 checksum 之类的东西。

弄好后刷回去就可以了。不用担心刷出问题。如果导致不能开机,同时按住开机键和音量上键,直到机身震动一下,然后松开开机键,就进入 bootloader 可以刷回原来的了。

附:Reverse USB Tethering 方法

没有网上说的那么复杂,还网桥什么的,都要把电脑的网络重连 :-(

  1. 连接 USB 线,启用 USB 绑定
  2. 电脑上给新出现的usb0网络接口配置 IP,IP 段可在手机上使用ip addr命令查看rndis0网络接口的地址。比如我这里手机的 IP 是 192.168.42.129,就在电脑上执行
    ifconfig usb0 192.168.42.1
    
  3. 电脑开启 NAT 功能和 IPv4 转发
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -j MASQUERADE
    
  4. 手机上配置路由表
    ip route add default via 192.168.42.1 dev rndis0
    

    手机上的route命令很不一样,总是说参数无效,我没弄明白该怎么用,就用ip命令了。

注意这样的网络部分功能不认可导致无法使用,比如 TrackID™、VPN。