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 相关文章推荐
pw的一个放后门的方法分析
Oct 08 PHP
mysql limit查询优化分析
Nov 12 PHP
php将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
Mar 25 PHP
PHP+jquery实时显示网站在线人数的方法
Jan 04 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
Zend Framework教程之模型Model用法简单实例
Mar 04 PHP
php实现微信公众平台发红包功能
Jun 14 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 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 session机制
2011/07/17 PHP
php安装swoole扩展的方法
2015/03/19 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP二维数组去重算法
2016/12/17 PHP
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python实现网站微信登录的示例代码
2019/09/18 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
经济管理专业自荐信
2013/12/30 职场文书
财务简历的自我评价
2014/03/05 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书