前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一起来探索下小程序包的魔数

一起来探索下小程序包的魔数

作者头像
薛定喵君
发布2020-10-15 10:35:48
1.9K0
发布2020-10-15 10:35:48
举报
文章被收录于专栏:薛定喵君

本篇文章源于一名同学对近期一篇文章聊一聊微信小程序包内容 的疑问--如何获取文件的 firstMark 之类的数据,借此来展开探究一下。

# 前言

# 了解下魔数

什么是魔数

magic number 一般是指硬写到代码或文件中的整型常量,数值是编程者自己指定的,其他人不知道数值有什么具体意义。

小程序包也有自己的魔数,这是区别其它文件的标识。

# 了解下大小端序
  • 大端序(Big-endian):高字节保存在内存的低地址--正序排列
  • 小端序(Little-endian):高字节保存在内存的高地址--逆序排列

注意

  • 主机字节顺序,X86一般多为小端(little-endian),网络字节顺序,一般为大端(big-endian)
  • 小程序包是以大端序方式存储的

# 实验环境

  • macOS Catalina:v10.15.5
  • node:v10.17.0
  • 测试小程序包:开源中国小程序

# 测试用node脚本

readfile.js

# 执行脚本结果

命令行执行 node readfile.js 得到如下结果

代码语言:javascript
复制
Header info:
  Magic number first:  190
  firstMark: 0xbe
  unknownInfo:  0
  infoListLength:  2978
  dataLength:  923206
  Magic number last:  237
  lastMark: 0xed

# 相关脚本若干关键方法解读

此段测试脚本摘录自原工具并做了小修改

# buf.readUInt8(0)

作用:从第0个字节开始读取一个无符号的8比特位整数值(即:从0读一个字节)。 这里是读取一个字节的数据作为 firstMark ,也就是魔数了。如上面执行结果所示,值是一个10进制数字为 190。

# buf.readUInt8(13)

作用:从第13个字节开始读取一个无符号的8比特位整数值。 这里是从第13个字节读取一个字节的数据作为 lastMark ,是另一个魔数。值为 237。

# firstMark.toString(16)

作用:把数字转换为字符串(以十六进制值显示) 这里数字190的十六进制转换结果为 be ,因为十六进制有前缀 0x ,所以前面需要带前缀以表示十六进制值->0xbe

# buf.readUInt32BE(5)

作用:以大端字节序从 buf 中第 5 个字节读取一个无符号的 32 位整数值。 这里代表微信文件信息列表长度值。

# 结论

微信小程序包文件的魔数为两个十六进制值 0xbe0xed,使用其它文件跑脚本会报"Magic number is not correct!"错误。

# 参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 前言
    • # 了解下魔数
      • # 了解下大小端序
      • # 实验环境
      • # 测试用node脚本
      • # 执行脚本结果
      • # 相关脚本若干关键方法解读
        • # buf.readUInt8(0)
          • # buf.readUInt8(13)
            • # firstMark.toString(16)
              • # buf.readUInt32BE(5)
              • # 结论
              • # 参考资料
              相关产品与服务
              云开发 CloudBase
              云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档