猿问

如何提取 .jar 文件

我喜欢在 Go 中提取一个 .jar 文件。我尝试了不同的方法来构建库,但没有成功。在 buff 中是我尝试分析的 JAR 的一小部分。错误也发生在完整的字节数组上。


舰队:


buff := []byte{80, 75, 3, 4, 10, 0, 8, 8, 8, 0, 239, 77, 77, 78,  

147,

98, 6, 159, 116, 0, 0, 0, 132, 0, 0, 0, 20, 0, 0, 0, 77, 69, 84, 65, 

45, 73, 78, 70, 47, 77, 65, 78, 73, 70, 69, 83, 84, 46, 77, 70, 37, 

140, 49, 14, 194, 48, 12, 0, 247, 72, 249, 131, 63, 16, 43, 128, 88, 

178, 181, 221, 144, 178, 178, 91, 196, 64, 32, 184, 81, 28, 42, 248, 

61,5, 214, 187, 211, 69, 146, 124, 102, 237}  


b := bytes.NewReader(buff)

zr := flate.NewReader(b)

if _, err := io.Copy(os.Stdout, zr); err != nil {

    log.Fatal(err)

}

if err := zr.Close(); err != nil {

    log.Fatal(err)

}


fmt.Println()

错误:平坦:偏移量 5 之前的损坏输入


zlib:


b := bytes.NewReader(buff)


r, err := zlib.NewReader(b)

if err != nil {

    panic(err)

}

io.Copy(os.Stdout, r)


r.Close()

错误:zlib:无效标头


维基百科说 JAR 是 zip 的扩展,普通的压缩程序可以解压它们。任何想法如何让这个工作?喜欢添加工作标题还是我的代码错误?


潇湘沐
浏览 116回答 1
1回答

MMTTMM

JAR 文件是zip 档案,而不仅仅是 zlib 或 flate 压缩数据。所以使用archive/zip包来正确处理它们。例如,要列出 JAR 文件中的文件:r, err := zip.NewReader(bytes.NewReader(buff), int64(len(buff)))if err != nil {    panic(err)}for _, f := range r.File {    fmt.Println("Found in jar:", f.Name)}当然你必须提供完整的文件内容,否则你很可能在获取zip.Reader.如果您还想打印存档中文件的内容,可以这样做:for _, f := range r.File {    fmt.Printf("Found in jar: %s, contents:\n", f.Name)    rc, err := f.Open()    if err != nil {        log.Fatal(err)    }    _, err = io.CopyN(os.Stdout, rc, int64(f.UncompressedSize64))    if err != nil {        log.Fatal(err)    }    rc.Close()    fmt.Println()}这是一个 JAR 文件,其中包含一个名为 的文件a.txt,其内容为"Hello Gopher":buff := []byte{80, 75, 3, 4, 10, 0, 0, 0, 0, 0, 91, 109, 103, 78, 132, 225, 60, 127, 13, 0, 0, 0, 13, 0, 0, 0, 5, 0, 28, 0, 97, 46, 116, 120, 116, 85, 84, 9, 0, 3, 206, 17, 129, 92, 219, 17, 129, 92, 117, 120, 11, 0, 1, 4, 232, 3, 0, 0, 4, 232, 3, 0, 0, 72, 101, 108, 108, 111, 32, 71, 111, 112, 104, 101, 114, 10, 80, 75, 1, 2, 30, 3, 10, 0, 0, 0, 0, 0, 91, 109, 103, 78, 132, 225, 60, 127, 13, 0, 0, 0, 13, 0, 0, 0, 5, 0, 24, 0, 0, 0, 0, 0, 1, 0, 0, 0, 164, 129, 0, 0, 0, 0, 97, 46, 116, 120, 116, 85, 84, 5, 0, 3, 206, 17, 129, 92, 117, 120, 11, 0, 1, 4, 232, 3, 0, 0, 4, 232, 3, 0, 0, 80, 75, 5, 6, 0, 0, 0, 0, 1, 0, 1, 0, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0}在此缓冲区上运行上述代码,输出为(在Go Playground上尝试):Found in jar: a.txt, contents:Hello Gopher
随时随地看视频慕课网APP

相关分类

Go
我要回答