分类 电子垃圾 下的文章

起因

前段时间手痒,看到了跟了自己很久的绿联读卡器,想折腾折腾。但是又不知道它的详细硬件情况,于是就在网上搜常见的USB3读卡器方案商,逐个尝试固件更新工具,然后成功使用了创惟科技的固件升级工具读到了版本号,确定了其使用了创惟GL3224主控。便接下来了开始的作死流程:首先直接点击了刷入,1536版本固件是随官方固件更新随工具附带的,刷入后自然而然也没有任何问题,然而我开始在互联网上寻找是否有更新的固件。而后在数码之家的一篇帖子中找到了随一款新的读卡器附带的1539版本,立即来了兴趣,就花了家元下载。下载后发现原作者提供的是FLASH的直接Dump,与官方工具内的固件结构和大小都不相同,于是选择了照猫画虎的办法,依照已有的1536版本官方固件进行裁剪,裁剪后直接就进行了刷入。刷入了之后,设备仅能认出是USB大容量存储设备,没有了分区磁盘设备,插入SD卡后也没了反应,打开官方的更新工具也直接提示无设备(但在此处可以看到是1539的固件版本,应该是校验错误导致的不启动)。
GLF_Error1539
GLF_NoDeviceUpdate

“修复”

在弄坏了这个读卡器之后,因为读卡器这类东西价格并不是很高,所以立即就重新购买了新的,这个坏的则被放在了一边。
今天突然想起来还有这么一个事情,便尝试开始了修复。
首先,在创惟科技官方网站上找到了这个读卡器芯片的Block Diagram
GL3224_QFN48_BLK_DGM
发现其由于支持低成本设计,FLASH并不是强制要求,其晶圆上还有内部ROM
现在我们的目的就是让内部ROM上的版本固件跑起来,从而先恢复正常启动的功能,而后再继续尝试刷入固件到SPI闪存。

“破坏”

这个读卡器的外壳使用的是超声波焊接工艺,没有螺丝也没有可以下翘片的地方,按照网络上的教程,拆解超声波焊接的设备只需使用毛巾裹住,然后向地上砸去即可。我也照做了,的确拆出了主板,但是忘记了这个读卡器买了很久了,塑料有些脆化,当我打开毛巾之时,外壳已经碎裂成了很多半。
GLF_BrokenCase
不过最终还是成功得到了主板,主板也很简单,一片VSOP封装的SPI闪存,一片GL3224主控,一粒晶振以及两个卡连接器就构成了整体设计
GLF_RawBoard
在SPI闪存中,依据个人经验,短接CS(片选信号)脚和DO(输出信号)脚即可暂时让主控读不到SPI
GLF_FlashPin
在当前情况下,我们这样短接,再插入电脑,即可使用ROM版本的固件来启动了
GLF_SpiShort
果然成功启动!
GLF_RomBootDevice
再通过一样的方法检查固件版本,发现其为1532版,因此可以确定其为ROM版本固件!
GLF_RomBootComplete
此时我们再使用官方的固件更新工具,可以看到其成功识别到了设备,且可以执行更新!
GLF_1532to1536
执行更新,等待提示成功,此时拔下再连接,读卡器完全恢复了正常!
GLF_1532to1536_Success

“不死心”

当然,对于没有成功更新到1539版本,我还是耿耿于怀。于是再一次尝试对FLASH Dump版本的认真裁剪,成功的将其升级到了真正的1539版本,且可以直接通过固件更新工具更新。
GLF_1536to1539

下载

创惟科技(GENESYS) GL3224的固件更新工具和两个版本的固件,有1536和1539两个版本可供选择
GL3224_Update.7z

版权

此頁面中的Block Diagram圖片及韌體和韌體更新工具均為創惟科技股份有限公司版權所有
此頁面中的SPI NAND快閃記憶體Pin Diagram圖片由華邦電子股份有限公司版權所有,來自W25Q80DV_July,2015的Datasheet

解锁完成之后对其系统更新包产生了兴趣
仔细看了下发现结构简单,所以写了个基于python的解包器
有空再看Cramfs里面是什么吧~哈哈哈哈

import struct
import sys

def extractCramfs(fwData, offset):
    sizeStruct = struct.unpack('<I', fwData[offset+4:offset+8])[0]
    return fwData[offset:offset+sizeStruct]

def extractKernel(fwData, offset):
    headerSize = 64
    imageSize = struct.unpack('>I', fwData[offset+12:offset+16])[0]
    return fwData[offset:offset+headerSize+imageSize]

def extractLinuxVersion(uImageHeader):
    verStartSize = 32
    versionInfo = uImageHeader[verStartSize:64].decode('utf-8', 'ignore')
    return versionInfo

if __name__ == "__main__":
    if len(sys.argv) != 3 or sys.argv[1] != '--firm':
        print("Usage: python uroad_extractor.py --firm <path/to/firmware>")
        sys.exit(1)

    firmwarePath = sys.argv[2]
    with open(firmwarePath, 'rb') as firmwareFile:
        fwData = firmwareFile.read()

        cramfsData = extractCramfs(fwData, 32)
        with open('rootfs.cramfs', 'wb') as cramfsFile:
            print("Cramfs Size:", len(cramfsData))
            print("Cramfs Offset:", 32)
            print("Cramfs End:", 32 + len(cramfsData))
            cramfsFile.write(cramfsData)

        kernelStartAddr = 32 + len(cramfsData)
        uImageData = extractKernel(fwData, kernelStartAddr)
        with open('uImage.bin', 'wb') as uImageFile:
            print("Kernel Size:", len(uImageData))
            print("Kernel Offset:", kernelStartAddr)
            print("Kernel End:", kernelStartAddr + len(uImageData))
            print("Kernel CRC:", hex(struct.unpack('>I', uImageData[16:20])[0]))
            uImageFile.write(uImageData)

        linuxVersion = extractLinuxVersion(uImageData[:64])
        print("Linux Version:", linuxVersion)
        
        print("Extract Complete!")

前言

最近在逛某宝的“老王电子数码DIY"库存品店,发现了一个6块6毛钱的随身WIFI,觉得挺便宜的就购入了,到手之后做了一些很简单的分析,发现其可以解锁并且正常使用,以下为分析和解锁的流程。

初步

以下为刚刚到手的样子,很明显是某出境随身WIFI租赁公司租赁韩国SKT运营商的产品。
收到时候没有电池,不过这个设备支持完全USB供电,仅需5V2A即可。
URoadUnl_Preview
翻到背面,可以看到型号为LFM300R和SN,IMEI等信息
URoadUnl_Infos
通过型号,成功通过网页时光机找到了这个机器的官方指南
URoadUnl_OfficialDoc
在这里请留意你的设备IMEI的最后四位数和IMEI上方的SN,之后解锁流程中需要使用

初探

直接插入我们自己的SIM卡,由于店家在商品介绍里面就有写是网络锁,所以肯定是不能直接使用的。
URoadUnl_SimErrLight
设备上的指示灯也显示是告警状态
然后我们通过http://192.168.1.1来登录到用户面板

用户面板用户名为user,密码为左侧贴纸上的Wi-Fi PSK密码

进入用户面板之后可以在右上方点击ENG切换到英文界面
URoadUnl_SimErrWeb
在这里我们可以看到已经读卡,但是仅限于读到了ICCID,网络状态为Inactive无法使用

管理员面板

在官方指南里面其实有提到如何进入管理员面板,但是并未提到里面的详细设定,仅仅表明了可以手动安装系统更新,漏洞就出现在这里
我们只需要一点点后壳上的信息即可进入管理员面板

http://192.168.1.1:4XXXX (XXXX为你设备的IMEI最后四位数)
管理员面板用户名为admin,密码为IMEI上方的SN序列号

URoadUnl_Login
在上方栏中找到Basic -> Account & System Setting -> Manual Update
URoadUnl_AdminPanelUpdate
选择更新包后即可开始更新
URoadUnl_Updating
更新完成后会提示以下界面,等待设备重新启动即可更新到2017年8月编译的最新版本
URoadUnl_UpdateOk

解锁

在管理员面板中稍微做了下发掘,就找到了网络锁解锁选项,我觉得可能韩国人根本没有想好好锁这个机器吧
URoadUnl_SimSettings
修改以下两个选项
LTE -> LTE Management -> Ignore USIM 改为Enable
LTE -> LTE Management -> Connection Setting 改为Automatic
选项需要一个一个进行修改,改完一个之后需要按一次Apply然后等待系统重启后再修改下一个选项
URoadUnl_Restart
执行完成这两个修改之后这个设备的网络锁即告解除

设定APN

继续进入管理员面板
URoadUnl_AuthSettings
找到LTE -> Authentication Setting -> APN Profile
即可新增自己的APN并且应用了,应用之后重启再次进入管理员面板,即可看到已经连上了数据网络
URoadUnl_LTEInfo

LTE调试

这个设备也可以看到很详细的LTE基站/频点等信息
在LTE -> LTE Debug Screen点选ON即可看到
URoadUnl_LTEDebug.png

5Ghz Wi-Fi

这个设备也支持5Ghz频段,但是只可双频单发,可以让Wi-Fi协商速度到300Mbps
可在Wireless -> Basic Setting -> Frequency中改为5Ghz,也可以修改是否开启省电模式等设置
URoadUnl_5GWifi

配置

SoC: GCT GDM7243M 单核1Ghz ARMv7
RAM: 256MB
WLAN: Marvell SD8897 SDIO总线
LTE频段: FDD-LTE B3/B5(LTE Cat.4)
隐藏频段: FDD-LTE B4/B13
AP系统: Linux 3.10.38 uClibc构建
BP系统: T-KERNEL (ITRON)
支持作为USB RNDIS网卡

下载

官方文档(韩文):OV6NZ5_URoad-LFM300_Upgrade_Manual.pdf
LFM300 V13011版本固件:OV6NZ5_URoad-LFM300_SKT_WEB_v13011.enc
LFM300R V12811版本固件:OV6NZ5_URoad-LFM300R_SKT_WEB_v12811.enc
手机APP(无法兼容新的Android版本):URoad_LFM300_1.3.0.apk

大概在2019年年末,从当时的上级处拿到了一批很早期的电纸书。其中就包括好几台巴诺(Barnes & Noble)书店所推出的Nook一代,仔细整理了一番发现还不止有WiFi版本,甚至还有一台WiFi/3G版。所以开始对其折腾,通过篡改基本底层固件的方式打开了ADB,才发现其本体是基于Android 1.5魔改的系统,当初是想将其修复成为正常电子书使用,所以尝试对一些系统APP进行了汉化,但是后来因为许许多多的乱七八糟事情混合在一起,这个事情在完成了不到40%的情况下就被搁置至今了,设备也分别赠送给了好几个朋友。所以这篇文章的目的仅仅是为了公布当初已经做完的部分,还有一些当时的素材。

部分完成的效果

NOOKCHN_WifiConnect
NOOKCHN_Browser
NOOKCHN_Settings
NOOKCHN_USBStorage
下载素材和软件包