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 相关文章推荐
在IIS上安装PHP4.0正式版
Oct 09 PHP
php文件怎么打开 如何执行php文件
Dec 21 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
微信支付扫码支付php版
Jul 22 PHP
php并发加锁示例
Oct 17 PHP
详解PHP防止盗链防止迅雷下载的方法
Apr 26 PHP
php图像验证码生成代码
Jun 08 PHP
PHP实现随机发放扑克牌
Apr 21 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
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php Smarty模板生成html文档的方法
2010/04/12 PHP
php实现将Session写入数据库
2015/07/26 PHP
php封装的验证码类分享
2017/02/26 PHP
js中for in的用法示例解析
2013/12/25 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
Angular和百度地图的结合实例代码
2016/10/19 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
记录Django开发心得
2014/07/16 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
python 获取图片分辨率的方法
2019/01/08 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
django修改models重建数据库的操作
2020/03/31 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
外贸学院会计专业应届生求职信
2013/11/14 职场文书
单位领导证婚词
2014/01/14 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
小马王观后感
2015/06/11 职场文书