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 相关文章推荐
使用PHP制作新闻系统的思路
Oct 09 PHP
利用PHP实现与ASP Banner组件相似的类
Oct 09 PHP
第一节--面向对象编程
Nov 16 PHP
php实现jQuery扩展函数
Oct 30 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
简单介绍PHP的责任链编程模式
Aug 11 PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
laravel withCount 统计关联数量的方法
Oct 10 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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:风雨欲来 路在何方?
2006/10/09 PHP
php获取根域名方法汇总
2014/10/28 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
Python程序设计入门(3)数组的使用
2014/06/16 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
python接口自动化框架实战
2020/12/23 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
初入社会应届生求职信
2013/11/18 职场文书
食品安全标语
2014/06/07 职场文书
小学教师读书活动总结
2014/07/08 职场文书
旗帜观后感
2015/06/08 职场文书
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
使用Redis实现分布式锁的方法
2022/06/16 Redis