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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
PHP4实际应用经验篇(8)
Oct 09 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
php stream_get_meta_data返回值
Sep 29 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
用PHP代码给图片加水印
Jul 01 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
PHP实现二维数组按某列进行排序的方法
Nov 18 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 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
C#静态方法与非静态方法实例分析
2014/09/22 PHP
php实现上传图片文件代码
2015/07/19 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
js单例模式详解实例
2013/11/21 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
Jquery ajax基础教程
2015/11/20 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
python使用epoll实现服务端的方法
2018/10/16 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
pytorch中index_select()的用法详解
2021/01/06 Python
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
道德模范先进事迹
2014/02/14 职场文书
少年闰土教学反思
2014/02/22 职场文书
公益广告宣传方案
2014/02/28 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
2015新生加入学生会自荐书
2015/03/24 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书