php微信小程序解包过程实例详解
这个解包只能看个大概
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)文件中了;需要我们匹配组装一下
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?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
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | <?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微信小程序解包内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/ryuma/p/14601140.html
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。