Kindle越狱笔记

Kindle 5.6.5的软件越狱方法已于月初公开,但是恰逢过年,昨天才注意到。

这是我第一次对Kindle进行Hack。 虽然由「Kindle伴侣」提供的教程简单易懂,但是黑盒操作总归是不放心的。 就像我从来不用「引导自动修复工具」一样,鬼知道它乱动了些什么!

虽然目前我还造不出来轮子,但是拆开看看也不错。 于是,我决定打开教程中提供的几个文件,看看里面都装了啥。

0x00 Public Developer Key

为了越狱,首先要下载一个jb.zip,把其中的文件jb复制到Kindle里。

让我们打开jb看看:

#!/bin/sh

# 此处省略两百字…

install_key()
{
    # Install our public key
    cat > "/etc/uks/pubdevkey01.pem" << EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJn1jWU+xxVv/eRKfCPR9e47lP
WN2rH33z9QbfnqmCxBRLP6mMjGy6APyycQXg3nPi5fcb75alZo+Oh012HpMe9Lnp
eEgloIdm1E4LOsyrz4kttQtGRlzCErmBGt6+cAVEV86y2phOJ3mLk0Ek9UQXbIUf
rvyJnS2MKLG2cczjlQIDAQAB
-----END PUBLIC KEY-----
EOF
    [ $? != 0 ] && return 1
    return 0
}

# 此处省略五百字…

原来就是一个Shell脚本啊,并且只做了一件事,导入开发者公钥。 既然用对应的私钥就能通过Kindle的固件校验,那么就能利用原生的更新机制来修改系统了,岂不妙哉!

那么,问题来了:我们怎么让Kindle执行这个脚本呢?

0x01 Launchpad

下一步我们要用Kindle浏览器打开jb.zip中的HTML文档,从而执行上面的脚本。 越狱分三步,Stage1中有一个域名长达495个字符的HTTP链接,而Stage2中有一段JavaScript脚本。 显然这与Kindle系统中某处漏洞相关,是本次越狱的核心。 但是我并没有查到这个漏洞相关的资料,只能暂且跳过这段了。 反正都是为执行上面的jb做铺垫,不会带来不可预知的后果。

第三步是在搜索框中执行;fc-cache。 搜索框能调用很多Kindle的隐藏功能,不知道怎么用的话可以看这里。 根据MobileRead Wiki,这条命令的字面意思是更新fontconfig缓存,但是同时也会重启框架。 完成后,一行「Jailbreak succeeded」映入眼帘,现在可以刷入非官方的更新包啦。

0x02 Kindlet JailBreak

回到教程,我们需要将JailBreak-1.14.N-FW-5.x-hotfix.zip中的bin文件放入Kindle,然后手动更新。 显然这是一个二进制文件,我们可以用KindleTool来对付它:

$ mkdir jb_bridge
$ kindletool extract Update_jailbreak_bridge_1.14.N_install.bin jb_bridge
$ cd jb_bridge
$ ls -A

一共解压出来16个文件,其中只有8个是真正起作用的,另外一半用于对应文件的完整性校验。 这8个文件中,又有一半都是Shell脚本,包括install-bridge.shlibotautils5bridgebridge.conf。 另外四个文件分别是:记录升级包中各文件信息的纯文本文件update-filelist.dat,ELF可执行文件gandalf(呃,「指环王」爱好者?),Java包json_simple-1.1.jar及密钥库developer.keystore

我们先打开install-bridge.sh看看。 首先,加载了libotautils5

# Pull libOTAUtils for logging & progress handling
[ -f ./libotautils5 ] && source ./libotautils5

之后,除了把更新包里的文件备份到/var/local/mkk/mnt/us/mkk以外,主要就是将bridge安装到了/var/local/system/fixup,并且通过upstart随框架启动:

# Install the bridge
cp -f bridge "/var/local/system/fixup"
chmod a+x "/var/local/system/fixup"

logmsg "I" "install" "" "Installing bridge job"
cp -f bridge.conf "/etc/upstart/bridge.conf"
chmod 0664 "/etc/upstart/bridge.conf"

关于json_simple-1.1.jar的作用,日志中作出了说明:

logmsg "I" "install" "" "Storing kindlet jailbreak"
cp -f json_simple-1.1.jar "${MKK_PERSISTENT_STORAGE}/json_simple-1.1.jar"

gandalf的功能也很明显了:

logmsg "I" "install" "" "Setting up gandalf"
chmod a+x "${MKK_PERSISTENT_STORAGE}/gandalf"
chmod +s "${MKK_PERSISTENT_STORAGE}/gandalf"
ln -sf "${MKK_PERSISTENT_STORAGE}/gandalf" "${MKK_PERSISTENT_STORAGE}/su"

至此,已经将3个二进制文件复制进系统,并且重启之后bridge会随框架启动。 所以,我们接下来看看bridge的内容。

bridge的大部分代码都是在确认上两节的结果,不再赘述。 最后,developer.keystore被复制到/var/local/java/keystore/里,json_simple-1.1.jar被安装到/opt/amazon/ebook/lib/。至此,越狱成功完成!

0x03 KUAL & MRPI

这并不是越狱过程的一步。 但是,正如一个发行版不会只有Kernel,而没有Shell和Package Manager一样,Kindle Unified Application Launcher通常会成为你安装的第一个Kindlet,而MobileRead Package Installer会成为KUAL的第一个插件。

不过,说是安装,其实KUAL就是本电子书,复制进Kindle就行了。 MRPI也是复制到KUAL的extensions文件夹里就OK。

0xFF 总结

  • 导入公钥,是为了安装非官方的更新包;
  • 安装更新,是为了修改subridge.conf,从而使bridge能随机启动;
  • 启动「桥梁」,是为了导入developer.keystorejson_simple-1.1.jar
  • 导入Java包,是为了使它被框架加载,支持KUAL等Kindlet的运行;
  • 有了KUAL,就能通过它的插件MRPI方便的安装其他应用了!

多米诺骨牌绕来绕去,环环相扣,终于达到了目的。 想必Lab126为了封锁Kindle也是煞费苦心啊。

Written on February 18, 2016