golang 获取exe、dll、apk 版本号

golang 获取exe、dll、apk 版本号,第1张

概述// golang 实现读取exe dll apk 版本号package mainimport (    "flag"    "fmt"    "log"    "os"    "path/filepath")import (    "github.com/lunny/axmlParser")var (    file fileInfo)const (   
//golang实现读取exedllapk版本号packagemainimport("flag""fmt""log""os""path/filepath")import("github.com/lunny/axmlParser")var(filefileInfo)const(MZ="MZ"PE="PE"RSRC=".rsrc"TYPET=16PEOFFSET=64MACHINE=332DEFAulT=`C:\windows\System32\cmd.exe`)typefileInfostruct{filePathstringVersionstringDeBUGbool}func(f*fileInfo)checkerror(errerror){iferr!=nil{log.Fatalln(err)}}//获取exedll版本func(f*fileInfo)GetExeVersion()(errerror){file,err:=os.Open(f.filePath)f.checkerror(err)//第一次读取64bytebuffer:=make([]byte,64)_,err=file.Read(buffer)f.checkerror(err)deferfile.Close()str:=string(buffer[0])+string(buffer[1])ifstr!=MZ{log.Fatalln("读取exe错误,找不到MZ.",f.filePath)}peOffset:=f.unpack([]byte{buffer[60],buffer[61],buffer[62],buffer[63]})ifpeOffset<PEOFFSET{log.Fatalln("peOffset读取错误.",f.filePath)}//读取从文件开头移位到peOffset,第二次读取24byte_,err=file.Seek(int64(peOffset),0)buffer=make([]byte,24)_,err=file.Read(buffer)f.checkerror(err)str=string(buffer[0])+string(buffer[1])ifstr!=PE{log.Fatalln("读取exe错误,找不到PE.",f.filePath)}machine:=f.unpack([]byte{buffer[4],buffer[5]})ifmachine!=MACHINE{log.Fatalln("machine读取错误.",f.filePath)}noSections:=f.unpack([]byte{buffer[6],buffer[7]})optHdrSize:=f.unpack([]byte{buffer[20],buffer[21]})//读取从当前位置移位到optHdrSize,第三次读取40bytefile.Seek(int64(optHdrSize),1)resFound:=falsefori:=0;i<int(noSections);i++{buffer=make([]byte,40)file.Read(buffer)str=string(buffer[0])+string(buffer[1])+string(buffer[2])+string(buffer[3])+string(buffer[4])ifstr==RSRC{resFound=truebreak}}if!resFound{log.Fatalln("读取exe错误,找不到.rsrc.",f.filePath)}infoVirt:=f.unpack([]byte{buffer[12],buffer[13],buffer[14],buffer[15]})infoSize:=f.unpack([]byte{buffer[16],buffer[17],buffer[18],buffer[19]})infoOff:=f.unpack([]byte{buffer[20],buffer[21],buffer[22],buffer[23]})//读取从文件开头位置移位到infoOff,第四次读取infoSizebytefile.Seek(int64(infoOff),infoSize)_,err=file.Read(buffer)f.checkerror(err)nameEntrIEs:=f.unpack([]byte{buffer[12],buffer[13]})IDEntrIEs:=f.unpack([]byte{buffer[14],buffer[15]})varinfoFoundboolvarsubOff,iint64fori=0;i<(nameEntrIEs+IDEntrIEs);i++{typeT:=f.unpack([]byte{buffer[i*8+16],buffer[i*8+17],buffer[i*8+18],buffer[i*8+19]})iftypeT==TYPET{infoFound=truesubOff=int64(f.unpack([]byte{buffer[i*8+20],buffer[i*8+21],buffer[i*8+22],buffer[i*8+23]}))break}}if!infoFound{log.Fatalln("读取exe错误,找不到typeT==16.",f.filePath)}subOff=subOff&0x7fffffffinfoOff=f.unpack([]byte{buffer[subOff+20],buffer[subOff+21],buffer[subOff+22],buffer[subOff+23]})//offsetoffirstfileINFOinfoOff=infoOff&0x7fffffffinfoOff=f.unpack([]byte{buffer[infoOff+20],buffer[infoOff+21],buffer[infoOff+22],buffer[infoOff+23]})//offsettodatadataOff:=f.unpack([]byte{buffer[infoOff],buffer[infoOff+1],buffer[infoOff+2],buffer[infoOff+3]})dataOff=dataOff-infoVirtversion1:=f.unpack([]byte{buffer[dataOff+48],buffer[dataOff+48+1]})version2:=f.unpack([]byte{buffer[dataOff+48+2],buffer[dataOff+48+3]})version3:=f.unpack([]byte{buffer[dataOff+48+4],buffer[dataOff+48+5]})version4:=f.unpack([]byte{buffer[dataOff+48+6],buffer[dataOff+48+7]})version:=fmt.Sprintf("%d.%d.%d.%d",version2,version1,version4,version3)f.Version=versionreturnnil}func(f*fileInfo)unpack(b[]byte)(numint64){fori:=0;i<len(b);i++{num=256*num+int64((b[len(b)-1-i]&0xff))}return}//获取apk版本func(f*fileInfo)GetApkVersion()(errerror){Listener:=new(axmlParser.AppnameListener)_,err=axmlParser.ParseApk(f.filePath,Listener)f.checkerror(err)f.Version=Listener.Versionnamereturnnil}funcinit(){flag.StringVar(&file.filePath,"path",DEFAulT,"Getexeordllorapkversioninformation.")flag.BoolVar(&file.DeBUG,"d",false,"iftrueprintexeordllfilename.")}funcmain(){flag.Parse()suffix:=filepath.Ext(file.filePath)switchsuffix{case".exe",".dll":file.GetExeVersion()case".apk":file.GetApkVersion()default:log.Fatalln("仅能获取exe、dll、apk版本号,请重新输入程序路径.",file.filePath)}switch{casefile.DeBUG:fmt.Printf("%s的版本号为:",file.filePath)casefile.filePath==DEFAulT:flag.PrintDefaults()fmt.Printf("%s的版本号为:",file.filePath)}fmt.Printf("%s",file.Version)}
总结

以上是内存溢出为你收集整理的golang 获取exe、dll、apk 版本号全部内容,希望文章能够帮你解决golang 获取exe、dll、apk 版本号所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1286547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存