php微信小程序解包过程实例详解


Posted in PHP onMarch 31, 2021

这个解包只能看个大概

1.找到小程序压缩包

1.1、手机root或安装模拟器(我用的是夜神)

1.2、在模拟器上安装微信(用android5系统的模拟器,低版本小程序容易打不开)

1.3、打开登陆微信后,打开小程序

1.4、打开模拟器自带的文件管理器来到目录:/data/data/com.tencent.mm/MicroMsg/{{一串32位的16进制字符串文件夹}}/appbrand/pkg/

1.5、里面有很多wxapkg文件,找到最新修改日期的文件比如 -357038350_91.wxapkg,前面打勾选中

1.6、文件管理器回到/mnt/shared/Other目录,粘贴即可,打开安卓模拟器上我的电脑 =〉打开电脑文件夹找到粘贴的文件-357038350_91.wxapkg 夜神教程链接:跳转查看

2.对压缩包解包

详细参考:https://codechina.csdn.net/mirrors/leo9960/wechat-app-unpack?utm_source=csdn_github_accelerator

我用的php类:

使用方法:cmd =>cd php文件目录 =〉php wx_unpak.php 357038350_91.wxapkg

我主要是想用其中的一些图片,很多图片都被base64了放到js(app-service.js)和样式(app-wxss.js)文件中了;需要我们匹配组装一下

<?php
$str = file_get_contents('_-357038350_97.wxapkg.unpacked/app-service.js');
$preg = '/(data:image.*?)\"/';
$len = strlen('data:image/png;base64,');
if(preg_match_all($preg, $str, $arr)){
  foreach($arr[1] as $k => $img){
    file_put_contents('./images/'.$k.'.png',base64_decode(substr($img,$len)));
    //echo substr($img,$len);exit;
  }
} else {
  echo 'no';
}

$str = file_get_contents('_-357038350_97.wxapkg.unpacked/app-wxss.js');
$preg = '/\((data:image.*?)\)/';
$len = strlen('data:image/png;base64,');
if(preg_match_all($preg, $str, $arr)){
  foreach($arr[1] as $k => $img){
    file_put_contents('./images/a2_'.$k.'.png',base64_decode(substr($img,$len)));
    //echo substr($img,$len);exit;
  }
} else {
  echo 'no';
}

wx_unpak.php

<?php
/**
源文件目录
  /data/data/com.tencent.mm/MicroMsg/{{一串32位的16进制字符串文件夹}}/appbrand/pkg/
  /data/data/com.eg.android.AlipayGphone, 在files/nebulaInstallApps/目录下存储了所有加载过的小程序
 * [php] /path/to/unpack-wxapkg.php <xxx.wxapkg>
 * php unpak.php _1123949441_351.wxapkg
 */

function unpack_wxapkg($file, $targetDir)
{
  if (!is_dir($targetDir)){
    mkdir($targetDir);
  }

  echo "Reading file.\n";
  $file = file_get_contents($file);
  $ptr = 18;

  $headerStruct = new StructDef([
    'mask1' => 'ushort',
    'info1' => 'ulong',
    'indexInfoLength' => 'ulong',
    'bodyInfoLength' => 'ushort',
    'mask2' => 'ushort',
    'fileCount' => 'ulong',
  ]);

  echo "Parsing file header...\n";

  $header = $headerStruct->unpack($file);
//  print_r(['header' => $header]);

  $unpackULong = function () use (&$file, &$ptr) {
    $ret = unpack_ulong(substr($file, $ptr, 4));
    $ptr += 4;
    return $ret;
  };

  $unpackUShort = function () use (&$file, &$ptr) {
    $ret = unpack_ushort(substr($file, $ptr, 2));
    $ptr += 2;
    return $ret;
  };


  $unpackStr = function ($len) use (&$file, &$ptr) {
    $ret = substr($file, $ptr, $len);
    $ptr += $len;
    return $ret;
  };


  $fileCount = $header['fileCount'];

  echo "Got $fileCount files.\n";

  $unpackedFiles = [];

  for ($i = 0; $i < $fileCount; $i++) {
    $nameLength = $unpackULong();
    $f = [
      'nameLength' => $nameLength,
      'name' => $unpackStr($nameLength),
      'offset' => $unpackULong(),
      'size' => $unpackULong(),
    ];

    echo "Unpacking file {$f['name']} ({$f['size']}bytes)...\n";

    $f['content'] = substr($file, $f['offset'], $f['size']);
    $unpackedFiles[] = $f;

    $destFile = $targetDir . $f['name'];
    $destDir = dirname($destFile);
    if (!is_dir($destDir)){
      mkdir($destDir, 0777, true);
    }

    file_put_contents($targetDir . $f['name'], $f['content']);
  }


//  print_r(['unpackedFiles' => $unpackedFiles]);



  echo "All done.\n";
}

function unpack_ulong($str)
{
  $x = unpack('N', $str);
  return $x[1];
}

function unpack_ushort($str)
{
  $x = unpack('n', $str);
  return $x[1];
}

class StructDef
{
  protected $def;
  protected $unpackFormat;

  public function __construct($def)
  {
    $this->def = $def;
    $this->unpackFormat = self::convertStructDefToUnpackFormat($def);
  }

  public function unpack($data)
  {
    return unpack($this->unpackFormat, $data);
  }

  protected static function convertStructDefToUnpackFormat($def)
  {
    $defTypeToUnpackType = [
      'byte' => 'C',
      'uchar' => 'C',
      'u8' => 'C',
      'ushort' => 'n',
      'u16' => 'n',
      'ulong' => 'N',
      'u32' => 'N',
    ];

    $ret = [];
    foreach ($def as $key => $type) {
      $ret[] = $defTypeToUnpackType[$type] . $key;
    }

    return implode('/', $ret);
  }
}

$packageFile = $argv[1];

//支持目录下文件批量解压
 if (is_dir($packageFile)){
  $handle = opendir($packageFile);
  if($handle){
    while(($fl = readdir($handle)) !== false){
      $temp = $packageFile.DIRECTORY_SEPARATOR.$fl;
      //如果不加 $fl!='.' && $fl != '..' 则会造成把$dir的父级目录也读取出来
      if(is_file($temp)){
        if($fl!='.' && $fl != '..'){
          $targetDir = $temp . '.unpacked';
          unpack_wxapkg($temp, $targetDir);
        }
      }
    }
  } 
}else if (is_file($packageFile)){
  $targetDir = $packageFile . '.unpacked';
  unpack_wxapkg($packageFile, $targetDir);
}else{
  echo <<<HELP
Usage:
  [php] {$argv[0]} <xxx.wxapkg>
  - Unpack the `xxx.wxapkg` to `xxx.wxapkg.unpacked` directory.
HELP;

  exit(1);
}

exit(0);

到此这篇关于php微信小程序解包的文章就介绍到这了,更多相关php微信小程序解包内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
分享php多功能图片处理类
May 15 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
Laravel 实现添加多语言提示信息
Oct 25 PHP
php数组指针函数功能及用法示例
Feb 11 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 PHP
php与阿里云短信接口接入操作案例分析
May 27 PHP
详解阿里云视频直播PHP-SDK接入教程
Jul 09 PHP
PHP获取类私有属性的3种方法
Sep 10 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 #PHP
PHP基本语法
PHP中->和=>的意思
Mar 31 #PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Laravel中Kafka的使用详解
Mar 24 #PHP
thinkphp5 redis缓存新增方法实例讲解
php优化查询foreach代码实例讲解
Mar 24 #PHP
You might like
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
jquery选择器使用详解
2014/04/08 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
深入理解NumPy简明教程---数组2
2016/12/17 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
opencv+python实现均值滤波
2020/02/19 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
人力资源部门的主要职能
2014/02/22 职场文书
会计专业求职信
2014/08/10 职场文书
六年级学生评语大全
2014/12/26 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
关于 Python json中load和loads区别
2021/11/07 Python
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python