Golang解析android 备份文件

我参考了一个stackoverflow上的一个项目,java解android备份文件。然后译成了golang代码。
总结:
java语言本身虽然很老,但是人家库多啊,但是人家的流还真是好用
想念java的第x天。

整体的备份文件:xx.ab 分为两部分

  • 不加密部分
  • 加密部分

分析

加密部分

我所解析的一个文件信息

    magic            string  
    version          int
    compress         int
    encryptionAlg    string
    userSaltHex      string
    ckSaltHex        string
    round            int
    userIvHex        string
    masterKeyBlobHex string

一些debug信息,方便了解上述具体内容
···
agic: ANDROID BACKUP
Version: 3
Compressed: 1
Algorithm: AES-256
IV: 1539D61DC22C13259102B5F20B7E9C3D
MK: EC78A761EDAE9E578A1CAE125331BF0C1D9178781C1D997711867EE7717EC30B
MK checksum: 944120ED555A34C6559D1793A322B5B59CED1AB8B19275DB7A482984B06ED4A7
key bytes: EC78A761EDAE9E578A1CAE125331BF0C1D9178781C1D997711867EE7717EC30B
salt bytes: D12A67D559DE5B025E7D0C5D41E27A49C9E7E9502F755E23B3E964969E0AA83DD70235E41C5A72BFD2EA0E2112E36E4827AB54F20FDEFC62F353CD557983378B
Calculated MK checksum (use UTF-8: true): 944120ED555A34C6559D1793A322B5B59CED1AB8B19275DB7A482984B06ED4A7
···

按行来说明

  1. magic 有标题的作用
  2. 版本 只支持1-4 v2版本以上要用
  3. 是否压缩
  4. 采用的加密算法
  5. 盐1 userSalt
  6. 盐2 ckSalt
  7. rounds
  8. userIvHex
  9. masterkeyBlob 这就是用来加密的密钥了

2 的一点说明

  • 在版本号>2的情况下,用UTF-8存储信息

3 的一点说明

  • 如果是压缩过的,那么只能用压缩流进行解

9 的一点说明

  • 这一段由IV+密钥共同组成

数组的第一个元素代表了IV的长度

加密部分

之后的内容,全都是采用加密并压缩过的密钥流来处理,但是这里有一个蛋疼的问题,我读*.ab文件,读了前9行后,把之后的内容解密,遇到了解密的bug,前面的内容正常,后面就GG了。然后,我的办法是,把这部份内容写入一个单独的文件中。再进行解密。

处理成Go的难点

  • go中是否有加密流
  • go中是否有压缩流
  • go中密钥生成(填充,是否是java BC专有库)与java是否一致

最后分析的结果(也许go的流我还不熟)

  • go中无aes cbc加密流
  • go中无压缩流(java.util.zip.InflaterInputStream 对应go里的啥?)
  • 手写pkcs#5 padding
  • 密钥生成,go没有jce怎么搞?

解决方案

go无aes cbc加密流的搞法

先说一下go中cipher 的特点,cbc模式下,这货会保留上一次加密的状态,也就是说,

var 加密机
加密.文本1
加密.文本2
//与下面的操作等价
var 加密机
加密.(文本1+文件2)

之前我也有一个误区,就是流加密不等于块加密。我错了,其实流加密,就是每次读一定的字节数罢了,然后再读一定的字节数,与上一次的结果进行相应模式下的操作,如,cbc异或啦。
而块加密,则是直接把要加密的所有内容一次性读入内存中。
那么,我用go,可每次只读16B的内容加密,好省内存呀!还方便最后一次去填充!

func (tool *Filetool) temp2() {
    println("cbc方式读")
    fi, _ := os.Open(tool.temp1file)
    defer fi.Close()
    aesBlockEncrypter, _ := aes.NewCipher(tool.realkey)
    aesEncrypter := cipher.NewCBCDecrypter(aesBlockEncrypter, tool.realIV)
    fo, _ := os.Create(tool.temp2file)

    defer fo.Close()
    //tmp := make([]byte, 16)
    read := make([]byte, 16)
    write := make([]byte, 16)
    frist:=true

    var n int
    for {
        n, _ = fi.Read(read)
        if n == 0 {
            fo.Write(PKCS5UnPadding(write))
            break
        } else if !frist {
            fo.Write(write)
        } else {
            frist=false
        }
        aesEncrypter.CryptBlocks(write, read)
        //copy(tmp, write)
    }
}

go中无压缩流

这个真的很蛋疼,只能把解密之后的内容写入一个文件,然后再解密。

func (tool *Filetool) final() {
    inputFile, _ := os.Open(tool.temp2file) //变量指向os.Open打开的文件时生成的文件句柄
    zf, err := zlib.NewReader(inputFile)
    if err != nil {
        return
    }
    defer zf.Close()
    //tarFilePath = filepath.Join(t.parseBackupTask.backupPath, fmt.Sprintf("backup_%d.tar", api.GetEvidenceID()))
    //os.MkdirAll(filepath.Dir(path), os.ModePerm)
    tarFile:=tool.outfileh
    if err != nil {
        return
    }
    defer tarFile.Close()
    io.Copy(tarFile, zf)
}

完整代码等我有空再传吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容