├── CrackMinApp.exe ├── CrackMinApp ├── 20190311052628952_easyicon_net_48.ico ├── App.config ├── CrackMinApp.csproj ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── bin │ └── Debug │ │ ├── CrackMinApp.exe.config │ │ └── CrackMinApp.pdb ├── mainFrm.Designer.cs ├── mainFrm.cs ├── mainFrm.resx └── obj │ └── Debug │ ├── CrackMinApp.Properties.Resources.resources │ ├── CrackMinApp.csproj.CoreCompileInputs.cache │ ├── CrackMinApp.csproj.FileListAbsolute.txt │ ├── CrackMinApp.csproj.GenerateResource.cache │ ├── CrackMinApp.csprojAssemblyReference.cache │ ├── CrackMinApp.exe │ ├── CrackMinApp.mainFrm.resources │ ├── CrackMinApp.pdb │ ├── DesignTimeResolveAssemblyReferences.cache │ ├── DesignTimeResolveAssemblyReferencesInput.cache │ ├── TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs │ ├── TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs │ └── TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs ├── README.md ├── crackminapp.png ├── nodejs └── nodejs │ ├── .gitignore │ ├── CHANGELOG.md │ ├── DETAILS.md │ ├── ISSUE_TEMPLATE.md │ ├── LICENSE │ ├── README (2).md │ ├── node.exe │ ├── node_etw_provider.man │ ├── node_modules.zip │ ├── node_perfctr_provider.man │ ├── nodevars.bat │ ├── npm │ ├── npm-debug.log │ ├── npm.cmd │ ├── npx │ ├── npx.cmd │ ├── package.json │ ├── wuConfig.js │ ├── wuJs.js │ ├── wuLib.js │ ├── wuRestoreZ.js │ ├── wuWxapkg.js │ ├── wuWxml.js │ └── wuWxss.js ├── wxapkg ├── _-1713870039_45.wxapkg ├── _-872837891_13.wxapkg └── _506735826_47.wxapkg └── 使用方法.txt /CrackMinApp.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp.exe -------------------------------------------------------------------------------- /CrackMinApp/20190311052628952_easyicon_net_48.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/20190311052628952_easyicon_net_48.ico -------------------------------------------------------------------------------- /CrackMinApp/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CrackMinApp/CrackMinApp.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {EA533C99-B9CC-40B3-865C-E8333355B69F} 8 | WinExe 9 | CrackMinApp 10 | CrackMinApp 11 | v4.6.1 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 20190311052628952_easyicon_net_48.ico 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | Form 53 | 54 | 55 | mainFrm.cs 56 | 57 | 58 | 59 | 60 | mainFrm.cs 61 | 62 | 63 | ResXFileCodeGenerator 64 | Resources.Designer.cs 65 | Designer 66 | 67 | 68 | True 69 | Resources.resx 70 | 71 | 72 | SettingsSingleFileGenerator 73 | Settings.Designer.cs 74 | 75 | 76 | True 77 | Settings.settings 78 | True 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /CrackMinApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace CrackMinApp 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// 应用程序的主入口点。 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new mainFrm()); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /CrackMinApp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的一般信息由以下 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("CrackMinApp")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("CrackMinApp")] 13 | [assembly: AssemblyCopyright("Copyright © 2019")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 会使此程序集中的类型 18 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 19 | //请将此类型的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("ea533c99-b9cc-40b3-865c-e8333355b69f")] 24 | 25 | // 程序集的版本信息由下列四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 33 | // 方法是按如下所示使用“*”: : 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CrackMinApp/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 此代码由工具生成。 4 | // 运行时版本: 4.0.30319.42000 5 | // 6 | // 对此文件的更改可能导致不正确的行为,如果 7 | // 重新生成代码,则所做更改将丢失。 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CrackMinApp.Properties 12 | { 13 | 14 | 15 | /// 16 | /// 强类型资源类,用于查找本地化字符串等。 17 | /// 18 | // 此类是由 StronglyTypedResourceBuilder 19 | // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 20 | // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen 21 | // (以 /str 作为命令选项),或重新生成 VS 项目。 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources 26 | { 27 | 28 | private static global::System.Resources.ResourceManager resourceMan; 29 | 30 | private static global::System.Globalization.CultureInfo resourceCulture; 31 | 32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 33 | internal Resources() 34 | { 35 | } 36 | 37 | /// 38 | /// 返回此类使用的缓存 ResourceManager 实例。 39 | /// 40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 41 | internal static global::System.Resources.ResourceManager ResourceManager 42 | { 43 | get 44 | { 45 | if ((resourceMan == null)) 46 | { 47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CrackMinApp.Properties.Resources", typeof(Resources).Assembly); 48 | resourceMan = temp; 49 | } 50 | return resourceMan; 51 | } 52 | } 53 | 54 | /// 55 | /// 覆盖当前线程的 CurrentUICulture 属性 56 | /// 使用此强类型的资源类的资源查找。 57 | /// 58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 59 | internal static global::System.Globalization.CultureInfo Culture 60 | { 61 | get 62 | { 63 | return resourceCulture; 64 | } 65 | set 66 | { 67 | resourceCulture = value; 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /CrackMinApp/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 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 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /CrackMinApp/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace CrackMinApp.Properties 12 | { 13 | 14 | 15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 18 | { 19 | 20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 21 | 22 | public static Settings Default 23 | { 24 | get 25 | { 26 | return defaultInstance; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /CrackMinApp/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CrackMinApp/bin/Debug/CrackMinApp.exe.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CrackMinApp/bin/Debug/CrackMinApp.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/bin/Debug/CrackMinApp.pdb -------------------------------------------------------------------------------- /CrackMinApp/mainFrm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace CrackMinApp 2 | { 3 | partial class mainFrm 4 | { 5 | /// 6 | /// 必需的设计器变量。 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// 清理所有正在使用的资源。 12 | /// 13 | /// 如果应释放托管资源,为 true;否则为 false。 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows 窗体设计器生成的代码 24 | 25 | /// 26 | /// 设计器支持所需的方法 - 不要修改 27 | /// 使用代码编辑器修改此方法的内容。 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(mainFrm)); 32 | this.btuExc = new System.Windows.Forms.Button(); 33 | this.label1 = new System.Windows.Forms.Label(); 34 | this.rtxInfo = new System.Windows.Forms.RichTextBox(); 35 | this.lblInfo = new System.Windows.Forms.Label(); 36 | this.lblTip = new System.Windows.Forms.Label(); 37 | this.label2 = new System.Windows.Forms.Label(); 38 | this.proBar = new System.Windows.Forms.ProgressBar(); 39 | this.lblSta = new System.Windows.Forms.Label(); 40 | this.tables = new System.Windows.Forms.ComboBox(); 41 | this.SuspendLayout(); 42 | // 43 | // btuExc 44 | // 45 | this.btuExc.Location = new System.Drawing.Point(688, 253); 46 | this.btuExc.Margin = new System.Windows.Forms.Padding(4); 47 | this.btuExc.Name = "btuExc"; 48 | this.btuExc.Size = new System.Drawing.Size(122, 48); 49 | this.btuExc.TabIndex = 0; 50 | this.btuExc.Text = "开始执行"; 51 | this.btuExc.UseVisualStyleBackColor = true; 52 | this.btuExc.Click += new System.EventHandler(this.btuExc_Click); 53 | // 54 | // label1 55 | // 56 | this.label1.AutoSize = true; 57 | this.label1.Location = new System.Drawing.Point(12, 40); 58 | this.label1.Name = "label1"; 59 | this.label1.Size = new System.Drawing.Size(146, 20); 60 | this.label1.TabIndex = 2; 61 | this.label1.Text = "选择执行文件:"; 62 | // 63 | // rtxInfo 64 | // 65 | this.rtxInfo.Location = new System.Drawing.Point(126, 156); 66 | this.rtxInfo.Name = "rtxInfo"; 67 | this.rtxInfo.ReadOnly = true; 68 | this.rtxInfo.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; 69 | this.rtxInfo.Size = new System.Drawing.Size(519, 278); 70 | this.rtxInfo.TabIndex = 3; 71 | this.rtxInfo.Text = ""; 72 | // 73 | // lblInfo 74 | // 75 | this.lblInfo.AutoSize = true; 76 | this.lblInfo.Location = new System.Drawing.Point(16, 156); 77 | this.lblInfo.Name = "lblInfo"; 78 | this.lblInfo.Size = new System.Drawing.Size(104, 20); 79 | this.lblInfo.TabIndex = 4; 80 | this.lblInfo.Text = "执行信息:"; 81 | // 82 | // lblTip 83 | // 84 | this.lblTip.AutoSize = true; 85 | this.lblTip.Font = new System.Drawing.Font("幼圆", 10.8F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(134))); 86 | this.lblTip.Location = new System.Drawing.Point(192, 86); 87 | this.lblTip.Name = "lblTip"; 88 | this.lblTip.Size = new System.Drawing.Size(649, 19); 89 | this.lblTip.TabIndex = 5; 90 | this.lblTip.Text = "请将文件放到 D:\\CrackMinApp\\wxapkg目录下 然后选择要反编译的文件"; 91 | // 92 | // label2 93 | // 94 | this.label2.AutoSize = true; 95 | this.label2.Font = new System.Drawing.Font("幼圆", 10.8F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(134))); 96 | this.label2.Location = new System.Drawing.Point(429, 123); 97 | this.label2.Name = "label2"; 98 | this.label2.Size = new System.Drawing.Size(369, 19); 99 | this.label2.TabIndex = 6; 100 | this.label2.Text = "生成的文件在与文件目录相同的文件夹下"; 101 | // 102 | // proBar 103 | // 104 | this.proBar.Location = new System.Drawing.Point(651, 426); 105 | this.proBar.Name = "proBar"; 106 | this.proBar.Size = new System.Drawing.Size(189, 23); 107 | this.proBar.Step = 20; 108 | this.proBar.TabIndex = 7; 109 | // 110 | // lblSta 111 | // 112 | this.lblSta.AutoSize = true; 113 | this.lblSta.Font = new System.Drawing.Font("幼圆", 10.8F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(134))); 114 | this.lblSta.Location = new System.Drawing.Point(684, 370); 115 | this.lblSta.Name = "lblSta"; 116 | this.lblSta.Size = new System.Drawing.Size(114, 19); 117 | this.lblSta.TabIndex = 8; 118 | this.lblSta.Text = "请开始执行"; 119 | // 120 | // tables 121 | // 122 | this.tables.FormattingEnabled = true; 123 | this.tables.Location = new System.Drawing.Point(196, 37); 124 | this.tables.Name = "tables"; 125 | this.tables.Size = new System.Drawing.Size(470, 28); 126 | this.tables.TabIndex = 9; 127 | // 128 | // mainFrm 129 | // 130 | this.AutoScaleDimensions = new System.Drawing.SizeF(11F, 20F); 131 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 132 | this.BackColor = System.Drawing.SystemColors.InactiveCaption; 133 | this.ClientSize = new System.Drawing.Size(853, 461); 134 | this.Controls.Add(this.tables); 135 | this.Controls.Add(this.lblSta); 136 | this.Controls.Add(this.proBar); 137 | this.Controls.Add(this.label2); 138 | this.Controls.Add(this.lblTip); 139 | this.Controls.Add(this.lblInfo); 140 | this.Controls.Add(this.rtxInfo); 141 | this.Controls.Add(this.label1); 142 | this.Controls.Add(this.btuExc); 143 | this.Font = new System.Drawing.Font("幼圆", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); 144 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 145 | this.Margin = new System.Windows.Forms.Padding(4); 146 | this.MaximizeBox = false; 147 | this.Name = "mainFrm"; 148 | this.Text = "一键获取小程序源代码"; 149 | this.Load += new System.EventHandler(this.mainFrm_Load); 150 | this.ResumeLayout(false); 151 | this.PerformLayout(); 152 | 153 | } 154 | 155 | #endregion 156 | 157 | private System.Windows.Forms.Button btuExc; 158 | private System.Windows.Forms.Label label1; 159 | private System.Windows.Forms.RichTextBox rtxInfo; 160 | private System.Windows.Forms.Label lblInfo; 161 | private System.Windows.Forms.Label lblTip; 162 | private System.Windows.Forms.Label label2; 163 | private System.Windows.Forms.ProgressBar proBar; 164 | private System.Windows.Forms.Label lblSta; 165 | private System.Windows.Forms.ComboBox tables; 166 | } 167 | } 168 | 169 | -------------------------------------------------------------------------------- /CrackMinApp/mainFrm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | using System.Diagnostics; 11 | using System.IO; 12 | 13 | namespace CrackMinApp 14 | { 15 | public partial class mainFrm : Form 16 | { 17 | public mainFrm() 18 | { 19 | InitializeComponent(); 20 | } 21 | public static string str=""; 22 | private void blDir() 23 | { 24 | string dir = str+@"\wxapkg"; 25 | MessageBox.Show(dir); 26 | string fileName = ""; 27 | DirectoryInfo dire = new DirectoryInfo(dir); 28 | tables.Items.Clear(); 29 | if (dire.Exists) 30 | { 31 | foreach (FileInfo file in dire.GetFiles("*.wxapkg")) 32 | { 33 | fileName = file.FullName; 34 | int i = fileName.LastIndexOf("\\"); 35 | fileName = fileName.Substring(++i, fileName.Length - i); 36 | tables.Items.Add(fileName); 37 | } 38 | } 39 | else 40 | { MessageBox.Show("目录不存在\n", "提示"); return; } 41 | } 42 | private void btuExc_Click(object sender, EventArgs e) 43 | { 44 | proBar.Value = 0; 45 | if (tables.SelectedItem==null) MessageBox.Show("请先选择文件,或目录选择错误,或该文件目录下没有文件,请加入", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); 46 | else 47 | { 48 | try 49 | { 50 | //创建一个进程 51 | Process p = new Process(); 52 | p.StartInfo.FileName = "cmd.exe"; 53 | p.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动 54 | p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息 55 | p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息 56 | p.StartInfo.RedirectStandardError = true;//重定向标准错误输出 57 | p.StartInfo.CreateNoWindow = true;//不显示程序窗口 58 | 59 | p.Start();//启动程序 60 | 61 | string strCMD0 = "D:"; 62 | string strCMD1 = "cd "+str+@"\nodejs\nodejs"; 63 | string strCMD2 = @"node .\wuWxapkg.js "+str+@"\wxapkg\" + tables.SelectedItem.ToString(); 64 | //向cmd窗口发送输入信息 65 | p.StandardInput.WriteLine(strCMD0); 66 | for (int i = 0; i < 100; i++) 67 | { 68 | System.Threading.Thread.Sleep(360); 69 | proBar.Value += proBar.Step; 70 | if (proBar.Value > 95) break; 71 | } 72 | p.StandardInput.WriteLine(strCMD1); 73 | p.StandardInput.WriteLine(strCMD2 + "&exit"); 74 | 75 | p.StandardInput.AutoFlush = true; 76 | 77 | //获取cmd窗口的输出信息 78 | string output = p.StandardOutput.ReadToEnd(); 79 | //等待程序执行完退出进程 80 | p.WaitForExit(); 81 | p.Close(); 82 | proBar.Value = 100; 83 | lblSta.Text = "执行完成"; 84 | rtxInfo.Text = output.ToString(); 85 | Console.WriteLine(output); 86 | } 87 | catch (Exception ex) 88 | { 89 | MessageBox.Show(ex.Message + "\r\n跟踪;" + ex.StackTrace); 90 | } 91 | } 92 | } 93 | 94 | private void mainFrm_Load(object sender, EventArgs e) 95 | { 96 | str = Directory.GetCurrentDirectory(); 97 | this.blDir(); 98 | } 99 | 100 | private void btnFlesh_Click(object sender, EventArgs e) 101 | { 102 | this.blDir(); 103 | } 104 | 105 | private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 106 | { 107 | Process.Start("https://github.com/Cherrison"); 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /CrackMinApp/mainFrm.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 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 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAA 124 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 125 | AAAAAAAA+tLDAvrRwx760sJW+9LCi/rRwrP70cLZ+tHC6/rRw/n60cP5+tHC6/vRwtn60sKz+9LCi/rS 126 | wlb60cIe+tLDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 127 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 128 | AAAAAAAA/9+/APvRwhr60sNw+tLCy/rRw/370cP/+9HC//vRw//60cP/+9HC//vRw//70cP/+9HC//vR 129 | w//60cP/+9HC//vRw//60sL9+tLCy/rSw3D60cIa/t+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 130 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 131 | AAAAAAAAAAAAAAAAAAD70cMg+9HCkfrRwvH70sP/+9LD//vSw//70sP/+9LD//vSw//70sP/+9LD//vS 132 | w//70sP/+9LD//vSw//70sP/+9LD//vSw//70sP/+9LD//vSw//60sPx+9HCkfvRwh4AAAAAAAAAAAAA 133 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 134 | AAAAAAAAAAAAAAAAAAAAAAAA+tLECvvRw3r60cLz+9LD//vRw//70sP/+tLC//vSw//70sP/+tLC//vS 135 | w//70sP/+tLC//vSw//70sP/+tLC//vSw//70sP/+tLC//vSw//70sP/+9HD//rSwv/70sP/+9HD//rR 136 | wvH70cN4+tLDCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 137 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD70sIo+tHCzfrSw//70sP/+9HC//vSw//70cP/+9HC//vR 138 | w//70cP/+9LD//vSw//70cP/+9HC//vRw//70cP/+9LD//vSw//70cP/+9HC//vRw//70sP/+9HD//vS 139 | w//70sP/+9HC//vSw//60sP/+tHCzfvRwigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 140 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPvRwlD70sLv+tHC//rSw//60sL/+tHC//rS 141 | w//60cL/+tLC//rRwv/60cL/+tLC//vSw//60cL/+tLC//rRwv/60cL/+tLC//vSw//60cL/+tLC//rR 142 | wv/60sL/+tHC//vSw//60sL/+tHC//rSwv/60sL/+tHC//vSwu/70cJQAAAAAAAAAAAAAAAAAAAAAAAA 143 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD81MIA+tHCavvSwvv70sP/+9LD//vS 144 | w//70sP/+9LD//vSw//70sP/+9LC//vSw//70sP/+9LD//vSw//70sP/+9LC//vSw//70sP/+9LD//vS 145 | w//70sP/+9LC//vSw//70sP/+9HC//vSw//70sP/+9HC//vSw//70sP/+9HC//vSw//70cP7+tHDaPzS 146 | wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD60sJo+tHC/frR 147 | wv/70cP/+tHC//vRw//70sP/+9HD//rRwv/60cP/+9HC//vRw//70cP/+9HC//vRw//60cL/+s69//rM 148 | u//6zLv/+s69//rRwv/60cP/+9HC//vRw//70sP/+9HC//vRw//70sP/+tHC//vSw//70sP/+9HC//vR 149 | w//70sP/+tHC/frRwmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPvR 150 | wkz70sL7+tHC//vSwv/60sP/+9LD//rSwv/60sP/+tHC//vSwv/70sP/+9LD//vSw//6zLr/+K+U//WS 151 | bf/0flH/83ND//NwP//zcD//83ND//R+Uf/2km3/+K+U//rMuv/70sP/+9LD//vSw//60sL/+9LD//rS 152 | wv/70sP/+9LD//vSw//60sL/+9LD//rSw/n70cJMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 153 | AAAAAAAA+tHCJvvSwu360sL/+tLD//vRw//70sP/+9LD//vSw//70sP/+9LD//vRw//70sP/+cGs//aV 154 | cP/zckL/8mo3//JrOP/zazj/82o3//NrOP/zazj/8mo3//JrOP/zazj/82o3//NyQv/2lXD/+cGs//rS 155 | wv/70sP/+9HD//vSwv/70sP/+9HD//rSwv/70sP/+9HD//vSwv/70cLt+tHCJAAAAAAAAAAAAAAAAAAA 156 | AAAAAAAAAAAAAAAAAAD70cII+tLCyfvSw//70sP/+9LD//vSw//70sP/+9HD//vSw//70sP/+9HC//rM 157 | u//2mXb/8248//NrOP/zazj/82s4//NrOP/zazj/82o3//NrOP/zazj/82s4//NrOP/zazj/82o3//Nr 158 | OP/zazj/8248//aZdv/6zLz/+9HC//vSw//70sP/+9HD//vSw//70sP/+9HC//vSw//70sP/+tHCyfvR 159 | wggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD70cJy+tHD//rSwv/60cL/+tHC//rSw//60sL/+tHC//rS 160 | w//60sL/+cGs//R8T//yazj/8mo3//JqN//yajf/8mo3//JrOP/yajj/8mo3//JqN//yajf/8mo3//Jr 161 | OP/yajj/8mo3//JqN//yajf/8mo3//NrOP/0fE//+cGt//rSwv/60sL/+tHC//vSw//60sL/+tHC//rS 162 | wv/60sL/+tHC//vRwnAAAAAAAAAAAAAAAAAAAAAAAAAAAPvSwhz70cLv+tHD//vSw//70sP/+9LC//vS 163 | w//70sP/+9LD//vSw//5vKX/83ND//NrN//yazj/82o3//NrOP/zazj/82s4//JrOP/yazj/82o3//Nr 164 | OP/zazj/82s4//JrOP/yazj/82o3//NrOP/zazj/82s3//NrOP/zazj/83ND//m8pf/70sP/+9HC//vS 165 | w//70sP/+9HC//vSw//70sP/+9HC//vSwu/70sIcAAAAAAAAAAAAAAAAAAAAAPrRw4370cL/+9HD//vR 166 | w//70sP/+tHD//rRwv/70cP/+tHC//nDr//zdET/8mo4//JqN//yazf/82s3//NrN//zazj/82s3//Jr 167 | N//yazf/82s3//NrN//zazj/82s3//JrN//yazf/82s3//NrN//zazj/8ms3//JqN//zazj/8mo3//N0 168 | RP/5xLD/+9HC//vRw//70sP/+tHC//vSw//70sP/+9HC//vRw//60cKNAAAAAAAAAAAAAAAA+tHCFvrR 169 | wu/60sL/+tLD//vSw//70sP/+tHC//vSwv/60sP/+s29//R/U//zajj/8mo4//NqN//zazj/82o3//Nq 170 | OP/zazj/82o4//NqOP/zazj/82o3//NqOP/zazj/82o4//NqOP/zazj/82o3//NqOP/zajj/82o4//Nr 171 | OP/yajj/82o4//NqOP/0f1P/+s29//vSw//60sL/+9LD//rSwv/70sP/+9LD//vSw//60cLv+tHDFgAA 172 | AAAAAAAA+9HCavvRw//60cP/+9LD//vSw//60sL/+tLD//vRw//70sP/9pt5//NrOP/zazj/8mo4//Nr 173 | N//zazj/82o3//NrOP/zazj/8mo3//JrOP/zazj/82o3//BqOP/wajj/8mo3//JrOP/zazj/82o3//Nr 174 | OP/zazj/8ms4//JqN//zazj/82s3//JqN//zazj/9pt5//rSwv/70sP/+9HD//vSwv/70sP/+9HD//rS 175 | wv/70sP/+9HCaAAAAAD80sIC+tHCxfvSw//70cP/+9HD//vSw//70sP/+9LD//vSw//5wq7/8289//Nr 176 | N//zazj/82o3//NrOP/zazj/82o3//NrOP/zazj/8ms4/9pjOP+jUzr/e0g8/29EPP9vRDz/e0g8/6NU 177 | Ov/aYzj/8mo3//NrOP/zazj/82s4//NrOP/zazj/8ms3//NrOP/zazj/8289//nCrv/70sP/+9HC//vS 178 | w//70sP/+9HD//vSw//70sP/+9HCw/vRwgL70sMY+tHC/frSw//60sL/+tHD//rSwv/60cL/+tHC//rS 179 | w//2lG//8mo4//JqOP/yajf/8mo4//JqN//yajj/8mo3//JqN//vajj/oVM6/2hCPP9kQTz/ZEE9/2RB 180 | PP9kQTz/ZEE8/2RCPf9oQjz/oVM6/+9qOP/yajf/8mo3//NrOP/yajj/8mo3//JqOP/yajf/8mo3//aU 181 | b//60sL/+tHC//rSwv/60sL/+tHC//vSw//60sL/+tHC+/vSwhj70sNW+9LC//vSw//70sP/+9LD//vS 182 | w//70sP/+tHC//rKuf/zcUD/8mo4//NrOP/zazj/8mo4//NrOP/yazj/82s4/+5pOP+LTDv/ZEI9/2VC 183 | Pf9lQTz/ZEI9/2VCPf9lQTz/ZEI9/2VCPf9lQTz/ZEI9/4tNO//uaTj/82s3//NrOP/zazj/82s3//Nr 184 | OP/yazj/82s3//NxQP/6y7n/+9HC//vSw//70sP/+9HC//vSw//70sP/+9HC//vSwlT60sOP+tLC//vR 185 | w//70sL/+tLD//vSwv/70sL/+9LD//iuk//zazj/8mo3//NrN//zajf/82o4//NrN//zazj/82o3/55S 186 | Ov9lQj3/ZEI9/2RBPP9lQj3/ZEE9/2RCPf9lQj3/ZEI9/2RBPP9lQj3/ZEE9/2RCPf+eUjr/82s3//Jq 187 | N//zajf/82s3//NrOP/zazj/82s3//JqN//4r5T/+9LC//vSw//70sP/+9LC//vSw//70sP/+9LC//rR 188 | w4/60cK3+tHC//rSw//60cL/+tHC//vSw//60cL/+tHD//aUb//yazj/8mo4//JrOP/zazj/8mo4//Nr 189 | OP/yazj/2WM4/2dCPP9lQTz/ZEE8/2VBPP9lQTz/ZUI9/2VBPP9lQTz/ZEE8/2VBPP9lQTz/ZUI9/2VB 190 | PP9nQjz/2WM4//NrOP/yajj/8ms3//JrOP/yazj/8ms4//NrOP/2lHD/+tHD//rSw//70sP/+9HD//rS 191 | w//70sP/+tHD//rRwrf70cLb+9LD//vSw//70sP/+9HD//vSw//70sP/+tHC//SAVP/zazj/8mo4//Nr 192 | OP/zazj/8mo4//NrOP/zazj/oVM6/2VBPf9lQj3/ZEE8/2VBPf9lQj3/ZEE8/2VBPf9lQj3/ZEE8/2VB 193 | Pf9lQj3/ZEE8/2VBPf9lQj3/oVM6//NrOP/zazj/8ms3//JrOP/zazj/8ms3//NrOP/0gVX/+tHC//vS 194 | w//70sP/+tHC//vSw//70sP/+tHC//vSwtv60cLt+9LD//vSw//70sP/+9HD//vSw//70sP/+s+///N1 195 | Rv/zazj/82o4//NrN//zazj/82s4//NrOP/zazj/e0g8/2VCPf9lQj3/ZEI9/2VCPf9lQj3/ZUI9/2VC 196 | Pf9lQj3/ZEI9/2VCPf9lQj3/ZUI9/2VCPf9lQj3/e0g8//NrOP/zazj/82s3//NrOP/zazj/82s3//Nr 197 | OP/zdkf/+s+///vSw//70sP/+9LD//vSw//70sP/+9HC//rRw+360cL5+tHC//vSw//60cL/+tHD//rR 198 | wv/60cL/+s28//NyQf/zazj/8mo3//JqOP/yajf/8mo4//NrOP/vaTf/bkQ8/2VBPf9lQTz/ZEE9/2VB 199 | Pf9lQTz/ZEE8/2VBPf9lQTz/ZEE9/2VBPf9lQTz/ZEE8/2VBPf9kQTz/bkQ8/+9qOP/yajj/8mo3//Jq 200 | OP/yajf/8mo3//NrOP/zckH/+s28//rRwv/60cL/+tHC//vSw//60cL/+tHC//rRwvn60cP5+9LC//vS 201 | w//70sP/+9LD//vSw//70sP/+s28//NyQf/zazj/8mo4//NrOP/zazj/8mo4//NrOP/uaTj/bkQ8/2VC 202 | Pf9lQTz/ZEI9/2VCPf9lQTz/ZEI9/2VCPf9lQTz/ZEI9/2VCPf9lQTz/ZEI9/2VCPf9lQj3/bkQ8/+9p 203 | OP/zazj/82s3//NrOP/yazj/82s3//NrOP/zckL/+s28//vSw//70sP/+9HC//vSw//70sP/+9HC//rR 204 | wvf60cLt+tLC//vRw//70sL/+tLD//vSwv/70sL/+s+///N2R//zazj/8mo3//NrN//zajf/82o4//Nr 205 | N//zazj/ekg8/2RCPf9lQj3/ZEI9/2RBPP9lQj3/ZEE9/2RCPf9lQj3/ZEI9/2RBPP9lQj3/ZEE9/2RC 206 | Pf9kQj3/e0g7//JqN//zajf/82s3//NrOP/zazj/82s3//JqN//zdkf/+s+///vSw//70sP/+9LC//vS 207 | w//70sP/+9LC//rRwuv70sLb+tHC//rSw//60cL/+tHC//vSw//60cL/+tHC//SBVf/yazj/8mo4//Jr 208 | OP/zazj/8mo4//NrOP/yazj/o1M6/2VBPP9lQTz/ZEE8/2VBPP9lQTz/ZUI9/2VBPP9lQTz/ZEE8/2VB 209 | PP9lQTz/ZUI9/2VBPP9lQjz/o1M6//NrOP/yajj/8ms3//JrOP/yazj/8ms4//NrOP/0gVb/+tHC//rS 210 | w//70sP/+9HD//rSw//70sP/+tHD//rRwtn60cK3+9LD//vSw//70sP/+9HD//vSw//70sP/+tHD//aU 211 | b//zazj/8mo4//NrOP/zazj/8mo4//NrOP/zazj/2GM4/2dCPP9lQj3/ZEE8/2VBPf9lQj3/ZEE8/2VB 212 | Pf9lQj3/ZEE8/2VBPf9lQj3/ZEE8/2VBPf9nQjz/2WM4//NrOP/zazj/8ms3//JrOP/zazj/8ms3//Nr 213 | OP/2lHD/+tHC//vSw//70sP/+tHC//vSw//70sP/+tHC//rRwrf60sKP+9LD//vSw//70sP/+9HD//vS 214 | w//70sP/+9LD//iukv/zazj/82o4//NrN//zazj/82s4//NrOP/zazj/8mo4/6BSOv9lQj3/ZEI9/2VC 215 | Pf9lQj3/ZUI9/2VCPf9lQj3/ZEI9/2VCPf9lQj3/ZUI9/2VCPf+gUzr/8mo3//NrOP/zazj/82s3//Nr 216 | OP/zazj/82s3//NrOP/4rpP/+9HC//vSw//70sP/+9LD//vSw//70sP/+9HC//rRw4/70sJW+tHC//vS 217 | w//60cL/+tHD//rRwv/60cL/+tHC//rKuf/zcUD/8mo3//JqOP/yajf/8mo4//NrOP/yajf/82o3/+9q 218 | OP+MTTv/ZEE9/2VBPf9lQTz/ZEE8/2VBPf9lQTz/ZEE9/2VBPf9lQTz/ZEE8/4xNO//vajj/8mo3//Nr 219 | OP/yajj/8mo3//JqOP/yajf/8mo3//NxQP/6yrn/+tHC//rRwv/60cL/+tHC//vSw//60cL/+tHC//rR 220 | wlT70sMY+tLD/fvSw//70sP/+9LD//vSw//70sP/+tHC//vSw//2k27/8mo4//NrOP/zazj/8mo4//Nr 221 | OP/yazj/82s4//NrOP/wajj/pFQ6/2hCPP9lQTz/ZEI9/2VCPf9lQTz/ZEI9/2VCPf9oQjz/pFQ6//Bq 222 | OP/yazj/82s3//NrOP/zazj/82s3//NrOP/yazj/82s3//aUb//70sP/+9HC//vSw//70sP/+9HC//vS 223 | w//70sP/+tHC+/vRwhj80sIC+tLCxfvRw//70sL/+tLD//vSwv/70sL/+9LD//rSw//5waz/8249//Nr 224 | N//zajf/82o4//NrN//zazj/82o3//NrN//zazj/82s3/9pjOP+mVDr/gko7/3FFPP9xRTz/gko7/6dV 225 | Ov/bZDj/82o3//NrN//zazj/82s3//JqN//zajf/82s3//NrOP/zazj/8249//nCrf/70sP/+9LC//vS 226 | w//70sP/+9LC//vSw//70sP/+9HDw/vSwgIAAAAA+9LCavrSw//60cL/+tHC//vSw//60cL/+tHD//vS 227 | w//60cL/9pt4//JrOP/zazj/8mo4//NrOP/yazj/82s4//JqOP/yazj/8mo4//JqOP/yazj/82s4//Fq 228 | OP/xajj/8mo4//JqOP/yazj/82s4//JqOP/yazj/8ms4//NrOP/yajj/8ms3//JrOP/yazj/9pt5//rS 229 | w//70sP/+tHD//rSw//70sP/+9HD//rSw//70sP/+9HCagAAAAAAAAAA+tHCFvrRwu/60sP/+9LD//vS 230 | w//60sP/+9LC//vSw//70sP/+s28//R8UP/zazf/8mo4//NrOP/zazj/82o3//NrOP/zazj/82o3//Nr 231 | OP/zazj/82o3//NrOP/zazj/82o3//NrOP/zazj/82o3//NrOP/zazj/8ms4//NqN//zazj/8ms4//Nq 232 | N//0fVD/+s28//vSw//70sP/+9HD//vSw//70sP/+9HD//vSw//60cLv+tHCFgAAAAAAAAAAAAAAAPrR 233 | wo370sL/+9LD//vSw//70sP/+9LD//vSw//70sP/+9HC//nBrP/zc0P/82o4//NrOP/zazj/82o4//Nr 234 | OP/zazj/82s4//NrOP/zazj/82o4//NrOP/zazj/82s4//NrOP/zazj/82o4//NrOP/zazj/82o3//Nr 235 | OP/zazj/82s4//NzQ//5wa3/+9HC//vSw//70sP/+9LD//vSw//70sP/+9HC//vSw//60cKNAAAAAAAA 236 | AAAAAAAAAAAAAPvRwhz70cLv+tHC//rRwv/60cL/+tHC//vSw//60cL/+tHC//rRwv/5vKX/83ND//Nr 237 | N//yazf/8mo3//JrN//yajf/8mo3//NrOP/yazf/8mo3//JrN//yajf/8mo3//NrOP/yazf/8mo3//Jr 238 | N//yajf/8ms3//NrN//yajf/83ND//m8pf/60sL/+9HC//rSw//60sL/+9HC//rRw//60sL/+9HC//vR 239 | wu/70sIcAAAAAAAAAAAAAAAAAAAAAAAAAAD70cJy+9HC//vSw//70sP/+tHC//vSw//70sP/+tHC//vS 240 | w//70sP/+cKu//R9UP/yazj/82o3//NrOP/zazj/82o3//NrOP/yazj/82o3//NrOP/zazj/82o3//Nr 241 | OP/yazj/82o3//NrOP/zajf/82s4//NrOP/0fVD/+cOu//vSw//60sP/+9HD//vSw//60sP/+9HD//vS 242 | w//60sP/+9HD//vRwnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD70sII+tLCyfrRwv/70sP/+9LD//rR 243 | wv/60cL/+9HC//vSw//60sP/+9HC//rMvP/2mnj/828+//NrOP/zazj/82o4//JqOP/zazj/8mo3//Nr 244 | OP/zazj/82o4//JqOP/zazj/8mo3//NrOP/zazj/828+//aaeP/6zbz/+tHC//vSw//70sP/+9LD//rR 245 | wv/70sP/+tHC//vSw//70sP/+tLCyfvQwwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+9HDKPrR 246 | w/H60sL/+tHC//vSw//70sP/+tHC//vSw//70sP/+9LD//vSw//60cL/+cSw//aWcv/zcUD/82s3//Nr 247 | OP/yazj/82s3//NrN//zazj/82s3//NrOP/yazj/82s3//NxQP/2lnL/+cSw//vSw//60sP/+9LD//vS 248 | w//60sP/+9HC//vSw//60sP/+9LD//vSw//60cLx+9HCKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 249 | AAAAAAAAAAAAAPvSwlL70cL7+9LC//vSw//70sP/+tLC//vSw//70sP/+tHC//vSw//70sP/+9LD//vS 250 | w//6yrj/96qN//WQa//0flH/83ND//NwP//zcD//83ND//R+Uf/2kWv/+KqN//rKuP/70sP/+9HD//vS 251 | w//70sP/+9HD//vSw//70sP/+9HD//vSw//70sP/+9HD//vSwvv70cJSAAAAAAAAAAAAAAAAAAAAAAAA 252 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD60sNq+tHD/fvSw//70sP/+9HD//vSw//70sP/+9LD//vS 253 | w//70sP/+9LD//vSw//70sP/+9LD//vSw//60cL/+s69//rMu//6zLv/+s69//rRwv/70sP/+9LD//vS 254 | w//70sP/+9HD//vSw//70sP/+9LD//vSw//70sP/+9HD//vSw//70sP/+tLD/frRwmoAAAAAAAAAAAAA 255 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD81cQA+tHCbPrRwvv60cL/+tHC//rS 256 | wv/60cL/+tHC//rSwv/60cL/+tHC//rSwv/60cL/+tHC//rRwv/60cL/+tHC//rSwv/60cL/+tHC//rR 257 | wv/60cL/+tHC//rSwv/60sL/+9LC//rSwv/60sL/+9LC//rSwv/60sL/+9LC//rSwv/60sL7+tLDbPzU 258 | xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrR 259 | wlj60cLx+tHC//vSw//70sP/+tHC//vSw//60cL/+9LD//vSw//60cL/+9LD//vSw//60cL/+9LD//vS 260 | w//60cL/+9LD//vSw//60cL/+9LD//vSw//70sP/+tHC//vSw//70sP/+tHC//vSw//70sP/+tHC//rR 261 | w/H70cNYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 262 | AAAAAAAAAAAAAAAAAAD70sIq+tLCz/rRw//70sP/+9LD//vSw//70sP/+9LD//vSw//70sP/+9LD//vS 263 | w//70sP/+9LD//vSw//70sP/+9LD//vSw//70sP/+9LD//vSw//70sP/+9LD//vSw//70sP/+tLD//vS 264 | w//60sP/+tHCz/vRwyoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 265 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+tLDCvvSwnz70sLz+tHC//rRwv/70cP/+tLC//rR 266 | wv/70sP/+tHC//rRwv/70cP/+tLC//rRwv/70sP/+tHC//rRwv/70cP/+tLC//rRwv/60cL/+tHC//rR 267 | wv/60sL/+9HC//vRwvP70cJ8+tLDCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 268 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD70sMi+9HClfvR 269 | w/H70sP/+tLD//vSw//70sP/+tLD//vSw//70sP/+tLD//vSw//70sP/+tLD//vSw//70sP/+tLD//vS 270 | w//70sP/+9HD//vRw//60cLx+9LCk/vRwiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 271 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 272 | AAAAAAAA/9HRAPvRwhr70cJs+9LCv/vSwvn60cL/+tHC//rRwv/60cL/+tHC//vRwv/60cL/+tHC//rR 273 | wv/60cL/+tHC//vRwv/70cL5+9HCvfvSwmz70cIa/tHRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 274 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 275 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/NTCAPvRwxT70sJQ+9LCi/rRwrP70cLZ+tHC6/rR 276 | wvn60cL5+tHC6/vRwtn60sKz+9HCi/vSwlD70cIU/NLCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 277 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AH//8AAP//AAD//wAA//gAAB// 278 | AAD/8AAAD/8AAP/AAAAD/wAA/4AAAAH/AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPAA 279 | AAAADwAA8AAAAAAPAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAIAAAAAAAQAAgAAAAAAB 280 | AACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 281 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAwAAAAAAD 282 | AADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPAAAAAADwAA+AAAAAAfAAD8AAAAAD8AAP4A 283 | AAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA//AAAA//AAD/+AAAH/8AAP//AAD//wAA///gB/// 284 | AAA= 285 | 286 | 287 | -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.Properties.Resources.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/CrackMinApp.Properties.Resources.resources -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.csproj.CoreCompileInputs.cache: -------------------------------------------------------------------------------- 1 | 441a029e885cdb1d96f7b26f1e936b4faab1d00b 2 | -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.csproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | D:\cnet\C井\CrackMinApp\bin\Debug\CrackMinApp.exe.config 2 | D:\cnet\C井\CrackMinApp\bin\Debug\CrackMinApp.exe 3 | D:\cnet\C井\CrackMinApp\bin\Debug\CrackMinApp.pdb 4 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.csprojAssemblyReference.cache 5 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.mainFrm.resources 6 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.Properties.Resources.resources 7 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.csproj.GenerateResource.cache 8 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.csproj.CoreCompileInputs.cache 9 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.exe 10 | D:\cnet\C井\CrackMinApp\obj\Debug\CrackMinApp.pdb 11 | -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.csproj.GenerateResource.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/CrackMinApp.csproj.GenerateResource.cache -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.csprojAssemblyReference.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/CrackMinApp.csprojAssemblyReference.cache -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/CrackMinApp.exe -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.mainFrm.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/CrackMinApp.mainFrm.resources -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/CrackMinApp.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/CrackMinApp.pdb -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/DesignTimeResolveAssemblyReferences.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/DesignTimeResolveAssemblyReferences.cache -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs -------------------------------------------------------------------------------- /CrackMinApp/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/CrackMinApp/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | logo 3 |

4 | 5 | # CrackMinApp —— 反编译微信小程序 6 | 7 | ## develop 8 | 9 | [![Netlify Status](https://api.netlify.com/api/v1/badges/6095e928-6e66-4f72-8c7a-ba75f4db70f3/deploy-status)](https://app.netlify.com/teams/cherrison/sites)![GitHub last commit](https://img.shields.io/github/last-commit/Cherrison/CrackMinApp.svg)[![GitHub issues](https://img.shields.io/github/issues/Cherrison/CrackMinApp.svg)](https://github.com/Cherrison/CrackMinApp/issues)[![GitHub stars](https://camo.githubusercontent.com/5b0af3502141b12f3dc8d8b6035c7b552c518d0b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f436865727269736f6e2f437261636b4d696e4170702e7376673f7374796c653d736f6369616c)](https://github.com/Cherrison/CrackMinApp/stargazers) 10 | 11 | - - - 12 | 13 | **2.0版本今日更新,可以直接解压在任何地方使用,无需指定** 14 | 15 | **----------------------------------------------------------------------------------------------使用前能给个star嘛!** 16 | 17 | ## [Bug最新修复时间 2019.10.24 bug修复请看最下方](#jump) 18 | 19 | - #### _说明反编译脚本并非本人原创, 这个项目只是适配了一个图形化的操作界面加安装配置好了所需要的依赖, 并且在原反编译脚本做了一些修改,修复了一些问题_ 20 | - #### _也可以说是给原工具做了一个插件吧_ 21 | 22 | > 一键获取微信小程序源码, 使用了C#加nodejs制作 23 | 直接解压在D盘根目录下后就可以使用 24 | 将小程序文件放到 wxapkg目录下 25 | 这个目录下有一些demo 可以先进行实验 26 | 然后打开 CrackMinApp.exe 按说明即可使用 27 | 28 | # CrackMinApp是C#方面的源代码, nodejs已经配置好安装好依赖文件无需改动 29 | ### 本工具界面效果 30 | ![Image text](https://img-blog.csdnimg.cn/20190312102443109.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTg0NjM0,size_16,color_FFFFFF,t_70) 31 | 32 | 那么如何才能在手机里找到小程序的源文件包呢? 33 | 具体目录位置直接给出: 34 | /data/data/com.tencent.mm/MicroMsg//appbrand/pkg/ 35 | 在这个目录下,会发现一些 xxxxxxx.wxapkg 类型的文件,这些就是微信小程序的包 36 | 37 | 微信小程序的格式就是:.wxapkg 38 | .wxapkg是一个二进制文件,有其自己的一套结构。 39 | 关于.wxapkg的详细内容可以参考lrdcq大神的博文:http://lrdcq.com/me/read.php/66.htm 40 | 41 | 这里我提供两种方法 42 | 43 | ## 一.安卓手机有root 44 | 45 | 安卓re管理器 进入 46 | /data/data/com.tencent.mm/MicroMsg//appbrand/pkg/ 47 | 然后就会发现一些wxapkg后缀的文件 48 | 这些文件 当你打开一个新的微信小程序就会生成 如果不知道是那一个 可以现在这个目录下删除所有文件 49 | 然后打开你想要反编译的小程序, 新出现的wxapkg文件 就是你想要的 50 | 51 | 至于如何root请自行查找 52 | 53 | ## 二.使用安卓模拟器获取到.wxapkg文件 54 | 55 | 不用越狱,不用root,使用电脑端的安卓模拟器来获取是一个非常简单快捷且万能的获取方式,具体步骤如下: 56 | 57 | 打开安装好的安卓模拟器,并在模拟器中安装QQ、微信、RE管理器 58 | QQ、微信在模拟器自带的应用商店里搜索下载安装即可 59 | QQ、微信在模拟器自带的应用商店里搜索下载安装即可 60 | RE管理器的下载地址自行百度 61 | 下载好后直接拖拽进打开的模拟器窗口就会自动安装 62 | 设置一下模拟器 63 | 以我个人认为比较好用的夜神模拟器举例 64 | 首先到模拟器内部设置超级用户权限 65 | ![Image text](http://meetes.top/images/categories/wechat/2018/06/1.jpeg) 66 | ![Image text](http://meetes.top/images/categories/wechat/2018/06/2.jpeg) 67 | 68 | 这些操作的目的都是为了能让RE管理器顺利的获取到ROOT权限 69 | 接下来在模拟器里打开微信,然后在微信中运行你想要获取的下程序(这其实是让微信把小程序的源文件包从服务器下载到了本地了) 70 | 举个例子: 71 | 在模拟器微信中运行一下后,直接切回模拟器桌面运行RE浏览器 来到目录 72 | /data/data/com.tencent.mm/MicroMsg//appbrand/pkg/ 73 | 就抵达了目的文件夹 74 | 75 | 你会看到发现里面的一些.wxapkg后缀的文件,就是它们没错啦,可以根据使用的时间来判断那个是你刚才从服务器下载过来的 76 | 一般小程序的文件不会太大,可以结合时间来判断,长按压缩所选文件,然后再将压缩好的包通过QQ发送到我的电脑 77 | 如果不进行压缩的话,是无法将这个文件通过QQ来发送的 78 | 所以QQ的这个功能可以让我们很方便的拿到源文件,而不必到电脑目录去找模拟器的文件目录。 79 | 解压。这样几步简单操作,就成功拿到了小程序的源文件了。 80 | 81 | 最终我们就得到了我们想要的小程序的源代码 82 | 83 | 原参考链接: https://blog.csdn.net/qq_33858250/article/details/80543815 84 | http://lrdcq.com/me/read.php/66.htm 85 | 86 | # Bug修复 87 | # 2019.3.22 88 | ## 修复无法执行问题 89 | #### nodejs/nodejs下面这个压缩包node_modules.zip解压一下。 本来这下面是有个node_modules文件夹的可是由于github默认不上传超过100个文件导致没有上传这个关键文件 90 | 91 | ![Image text](https://s2.ax1x.com/2019/03/24/AYZDtU.png) 92 | 93 | #### 注意未避免文件名称过长导致的错误,请把目录下文件复制到一个根目录下新建的文件夹下面 94 | 95 | ![Image text](https://s2.ax1x.com/2019/03/24/AYeyUf.png) 96 | 97 | #### 路径名称过长 98 | # 2019.4.15 99 | 100 | ### 修复wxappUnpacker __mainPageFrameReady__ is not defined 101 | ### 修复ReferenceError: $gwx is not defined 102 | 103 | # 2019.10.24 104 | 105 | ### 修复__vd_version_info__ is not defined 106 | ### 增强wxss分包支持 107 | 108 | -------------------------------------------------------------------------------- /crackminapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/crackminapp.png -------------------------------------------------------------------------------- /nodejs/nodejs/.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | example/ 3 | node_modules/ 4 | package-lock.json -------------------------------------------------------------------------------- /nodejs/nodejs/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Node.js Changelog 2 | 3 | To make the changelog easier to both use and manage, it has been split into 4 | multiple files organized according to significant major and minor Node.js 5 | release lines. 6 | 7 | Select a Node.js version below to view the changelog history: 8 | 9 | * [Node.js 8](doc/changelogs/CHANGELOG_V8.md) 10 | * [Node.js 7](doc/changelogs/CHANGELOG_V7.md) 11 | * [Node.js 6](doc/changelogs/CHANGELOG_V6.md) 12 | * [Node.js 4](doc/changelogs/CHANGELOG_V4.md) 13 | * [Node.js 5](doc/changelogs/CHANGELOG_V5.md), 14 | [0.12](doc/changelogs/CHANGELOG_V012.md), 15 | [0.10](doc/changelogs/CHANGELOG_V010.md), 16 | [io.js](doc/changelogs/CHANGELOG_IOJS.md) and [Archive](doc/changelogs/CHANGELOG_ARCHIVE.md) 17 | 18 | Please use the following table to find the changelog for a specific Node.js 19 | release. 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 57 | 75 | 100 | 136 | 137 |
8LTS7-6LTS4LTS
30 | 8.11.4
31 | 8.11.3
32 | 8.11.2
33 | 8.11.1
34 | 8.11.0
35 | 8.10.0
36 | 8.9.4
37 | 8.9.3
38 | 8.9.2
39 | 8.9.1
40 | 8.9.0
41 | 8.8.1
42 | 8.8.0
43 | 8.7.0
44 | 8.6.0
45 | 8.5.0
46 | 8.4.0
47 | 8.3.0
48 | 8.2.1
49 | 8.2.0
50 | 8.1.4
51 | 8.1.3
52 | 8.1.2
53 | 8.1.1
54 | 8.1.0
55 | 8.0.0
56 |
58 | 7.10.0
59 | 7.9.0
60 | 7.8.0
61 | 7.7.4
62 | 7.7.3
63 | 7.7.2
64 | 7.7.1
65 | 7.7.0
66 | 7.6.0
67 | 7.5.0
68 | 7.4.0
69 | 7.3.0
70 | 7.2.1
71 | 7.2.0
72 | 7.1.0
73 | 7.0.0
74 |
76 | 6.10.3
77 | 6.10.2
78 | 6.10.1
79 | 6.10.0
80 | 6.9.5
81 | 6.9.4
82 | 6.9.3
83 | 6.9.2
84 | 6.9.1
85 | 6.9.0
86 | 6.8.1
87 | 6.8.0
88 | 6.7.0
89 | 6.6.0
90 | 6.5.0
91 | 6.4.0
92 | 6.3.1
93 | 6.3.0
94 | 6.2.2
95 | 6.2.1
96 | 6.2.0
97 | 6.1.0
98 | 6.0.0
99 |
101 | 4.8.3
102 | 4.8.2
103 | 4.8.1
104 | 4.8.0
105 | 4.7.3
106 | 4.7.2
107 | 4.7.1
108 | 4.7.0
109 | 4.6.2
110 | 4.6.1
111 | 4.6.0
112 | 4.5.0
113 | 4.4.7
114 | 4.4.6
115 | 4.4.5
116 | 4.4.4
117 | 4.4.3
118 | 4.4.2
119 | 4.4.1
120 | 4.4.0
121 | 4.3.2
122 | 4.3.1
123 | 4.3.0
124 | 4.2.6
125 | 4.2.5
126 | 4.2.4
127 | 4.2.3
128 | 4.2.2
129 | 4.2.1
130 | 4.2.0
131 | 4.1.2
132 | 4.1.1
133 | 4.1.0
134 | 4.0.0
135 |
138 | 139 | ### Notes 140 | 141 | * Release streams marked with `LTS` are currently covered by the 142 | [Node.js Long Term Support plan](https://github.com/nodejs/LTS). 143 | * Release versions displayed in **bold** text represent the most 144 | recent actively supported release. 145 | 146 | ---- 147 | ---- 148 | 149 | ## 2016-05-06, Version 0.12.14 (Maintenance), @rvagg 150 | 151 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.14. 152 | 153 | ## 2016-05-06, Version 0.10.45 (Maintenance), @rvagg 154 | 155 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.45. 156 | 157 | ## 2016-05-05, Version 6.1.0 (Current), @Fishrock123 158 | 159 | Moved to doc/changelogs/CHANGELOG_V6.md#6.1.0. 160 | 161 | ## 2016-05-05, Version 5.11.1 (Stable), @evanlucas 162 | 163 | Moved to doc/changelogs/CHANGELOG_V5.md#5.11.1. 164 | 165 | ## 2016-05-05, Version 4.4.4 'Argon' (LTS), @thealphanerd 166 | 167 | Moved to doc/changelogs/CHANGELOG_V4.md#4.4.4. 168 | 169 | ## 2016-04-26, Version 6.0.0 (Current), @jasnell 170 | 171 | Moved to doc/changelogs/CHANGELOG_V6.md#6.0.0. 172 | 173 | ## 2016-04-20, Version 5.11.0 (Stable), @thealphanerd 174 | 175 | Moved to doc/changelogs/CHANGELOG_V5.md#5.11.0. 176 | 177 | ## 2016-04-05, Version 5.10.1 (Stable), @thealphanerd 178 | 179 | Moved to doc/changelogs/CHANGELOG_V5.md#5.10.1. 180 | 181 | ## 2016-03-31, Version 0.10.44 (Maintenance), @rvagg 182 | 183 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.44. 184 | 185 | ## 2016-03-31, Version 5.10.0 (Stable), @evanlucas 186 | 187 | Moved to doc/changelogs/CHANGELOG_V5.md#5.10.0. 188 | 189 | ## 2016-03-31, Version 4.4.2 'Argon' (LTS), @thealphanerd 190 | 191 | Moved to doc/changelogs/CHANGELOG_V4.md#4.4.2. 192 | 193 | ## 2016-03-31, Version 0.12.13 (LTS), @rvagg 194 | 195 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.13. 196 | 197 | ## 2016-03-23, Version 5.9.1 (Stable), @Fishrock123 198 | 199 | Moved to doc/changelogs/CHANGELOG_V5.md#5.9.1. 200 | 201 | ## 2016-03-22, Version 4.4.1 'Argon' (LTS), @thealphanerd 202 | 203 | Moved to doc/changelogs/CHANGELOG_V4.md#4.4.1. 204 | 205 | ## 2016-03-16, Version 5.9.0 (Stable), @evanlucas 206 | 207 | Moved to doc/changelogs/CHANGELOG_V5.md#5.9.0. 208 | 209 | ## 2016-03-08, Version 5.8.0 (Stable), @Fishrock123 210 | 211 | Moved to doc/changelogs/CHANGELOG_V5.md#5.8.0. 212 | 213 | ## 2016-03-08, Version 4.4.0 'Argon' (LTS), @thealphanerd 214 | 215 | Moved to doc/changelogs/CHANGELOG_V4.md#4.4.0. 216 | 217 | ## 2016-03-08, Version 0.12.12 (LTS), @rvagg 218 | 219 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.12. 220 | 221 | ## 2016-03-03, Version 0.12.11 (LTS), @rvagg 222 | 223 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.11. 224 | 225 | ## 2016-03-02, Version 5.7.1 (Stable), @Fishrock123 226 | 227 | Moved to doc/changelogs/CHANGELOG_V5.md#5.7.1. 228 | 229 | ## 2016-03-02, Version 4.3.2 'Argon' (LTS), @thealphanerd 230 | 231 | Moved to doc/changelogs/CHANGELOG_V4.md#4.3.2. 232 | 233 | ## 2016-02-23, Version 5.7.0 (Stable), @rvagg 234 | 235 | Moved to doc/changelogs/CHANGELOG_V5.md#5.7.0. 236 | 237 | ## 2016-02-16, Version 4.3.1 'Argon' (LTS), @thealphanerd 238 | 239 | Moved to doc/changelogs/CHANGELOG_V4.md#4.3.1. 240 | 241 | ## 2016-02-09, Version 5.6.0 (Stable), @jasnell 242 | 243 | Moved to doc/changelogs/CHANGELOG_V5.md#5.6.0. 244 | 245 | ## 2016-02-09, Version 4.3.0 'Argon' (LTS), @jasnell 246 | 247 | Moved to doc/changelogs/CHANGELOG_V4.md#4.3.0. 248 | 249 | ## 2016-02-09, Version 0.12.10 (LTS), @jasnell 250 | 251 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.10. 252 | 253 | ## 2016-02-09, Version 0.10.42 (Maintenance), @jasnell 254 | 255 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.42. 256 | 257 | ## 2016-01-21, Version 4.2.6 'Argon' (LTS), @TheAlphaNerd 258 | 259 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.6. 260 | 261 | ## 2016-01-20, Version 5.5.0 (Stable), @evanlucas 262 | 263 | Moved to doc/changelogs/CHANGELOG_V5.md#5.5.0. 264 | 265 | ## 2016-01-20, Version 4.2.5 'Argon' (LTS), @TheAlphaNerd 266 | 267 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.5. 268 | 269 | ## 2016-01-12, Version 5.4.1 (Stable), @TheAlphaNerd 270 | 271 | Moved to doc/changelogs/CHANGELOG_V5.md#5.4.1. 272 | 273 | ## 2016-01-06, Version 5.4.0 (Stable), @Fishrock123 274 | 275 | Moved to doc/changelogs/CHANGELOG_V5.md#5.4.0. 276 | 277 | ## 2015-12-23, Version 4.2.4 'Argon' (LTS), @jasnell 278 | 279 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.4. 280 | 281 | ## 2015-12-16, Version 5.3.0 (Stable), @cjihrig 282 | 283 | Moved to doc/changelogs/CHANGELOG_V5.md#5.3.0. 284 | 285 | ## 2015-12-09, Version 5.2.0 (Stable), @rvagg 286 | 287 | Moved to doc/changelogs/CHANGELOG_V5.md#5.2.0. 288 | 289 | ## 2015-12-04, Version 5.1.1 (Stable), @rvagg 290 | 291 | Moved to doc/changelogs/CHANGELOG_V5.md#5.1.1. 292 | 293 | ## 2015-12-04, Version 4.2.3 'Argon' (LTS), @rvagg 294 | 295 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.3. 296 | 297 | ## 2015-12-04, Version 0.12.9 (LTS), @rvagg 298 | 299 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.9. 300 | 301 | ## 2015-12-04, Version 0.10.41 (Maintenance), @rvagg 302 | 303 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.41. 304 | 305 | ## 2015.11.25, Version 0.12.8 (LTS), @rvagg 306 | 307 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.8. 308 | 309 | ## 2015-11-17, Version 5.1.0 (Stable), @Fishrock123 310 | 311 | Moved to doc/changelogs/CHANGELOG_V5.md#5.1.0. 312 | 313 | ## 2015-11-03, Version 4.2.2 'Argon' (LTS), @jasnell 314 | 315 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.2. 316 | 317 | ## 2015-10-29, Version 5.0.0 (Stable), @rvagg 318 | 319 | Moved to doc/changelogs/CHANGELOG_V5.md#5.0.0. 320 | 321 | ## 2015-10-13, Version 4.2.1 'Argon' (LTS), @jasnell 322 | 323 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.1. 324 | 325 | ## 2015-10-07, Version 4.2.0 'Argon' (LTS), @jasnell 326 | 327 | Moved to doc/changelogs/CHANGELOG_V4.md#4.2.0. 328 | 329 | ## 2015-10-05, Version 4.1.2 (Stable), @rvagg 330 | 331 | Moved to doc/changelogs/CHANGELOG_V4.md#4.1.2. 332 | 333 | ## 2015-09-22, Version 4.1.1 (Stable), @rvagg 334 | 335 | Moved to doc/changelogs/CHANGELOG_V4.md#4.1.1. 336 | 337 | ## 2015-09-17, Version 4.1.0 (Stable), @Fishrock123 338 | 339 | Moved to doc/changelogs/CHANGELOG_V4.md#4.1.0. 340 | 341 | ## 2015-09-15, io.js Version 3.3.1 @rvagg 342 | 343 | Moved to doc/changelogs/CHANGELOG_IOJS.md#3.3.1. 344 | 345 | ## 2015-09-08, Version 4.0.0 (Stable), @rvagg 346 | 347 | Moved to doc/changelogs/CHANGELOG_IOJS.md#3.3.0. 352 | 353 | ## 2015-08-25, Version 3.2.0, @rvagg 354 | 355 | Moved to doc/changelogs/CHANGELOG_IOJS.md#3.2.0. 356 | 357 | ## 2015-08-18, Version 3.1.0, @Fishrock123 358 | 359 | Moved to doc/changelogs/CHANGELOG_IOJS.md#3.1.0. 360 | 361 | ## 2015-08-04, Version 3.0.0, @rvagg 362 | 363 | Moved to doc/changelogs/CHANGELOG_IOJS.md#3.0.0. 364 | 365 | ## 2015-07-28, Version 2.5.0, @cjihrig 366 | 367 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.5.0. 368 | 369 | ## 2015-07-17, Version 2.4.0, @Fishrock123 370 | 371 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.4.0. 372 | 373 | ## 2015-07-09, Version 2.3.4, @Fishrock123 374 | 375 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.3.4. 376 | 377 | ## 2015-07-09, Version 1.8.4, @Fishrock123 378 | 379 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.8.4. 380 | 381 | ## 2015-07-09, Version 0.12.7 (Stable) 382 | 383 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.7. 384 | 385 | ## 2015-07-04, Version 2.3.3, @Fishrock123 386 | 387 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.3.3. 388 | 389 | ## 2015-07-04, Version 1.8.3, @rvagg 390 | 391 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.8.3. 392 | 393 | ## 2015-07-03, Version 0.12.6 (Stable) 394 | 395 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.6. 396 | 397 | ## 2015-07-01, Version 2.3.2, @rvagg 398 | 399 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.3.2. 400 | 401 | ## 2015-06-23, Version 2.3.1, @rvagg 402 | 403 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.3.1. 404 | 405 | ## 2015-06-22, Version 0.12.5 (Stable) 406 | 407 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.5. 408 | 409 | ## 2015-06-18, Version 0.10.39 (Maintenance) 410 | 411 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.39. 412 | 413 | ## 2015-06-13, Version 2.3.0, @rvagg 414 | 415 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.3.0. 416 | 417 | ## 2015-06-01, Version 2.2.1, @rvagg 418 | 419 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.2.1. 420 | 421 | ## 2015-05-31, Version 2.2.0, @rvagg 422 | 423 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.2.0. 424 | 425 | ## 2015-05-24, Version 2.1.0, @rvagg 426 | 427 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.1.0. 428 | 429 | ## 2015-05-22, Version 0.12.4 (Stable) 430 | 431 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.4. 432 | 433 | ## 2015-05-17, Version 1.8.2, @rvagg 434 | 435 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.8.2. 436 | 437 | ## 2015-05-15, Version 2.0.2, @Fishrock123 438 | 439 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.0.2. 440 | 441 | ## 2015-05-13, Version 0.12.3 (Stable) 442 | 443 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.3. 444 | 445 | ## 2015-05-07, Version 2.0.1, @rvagg 446 | 447 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.0.1. 448 | 449 | ## 2015-05-04, Version 2.0.0, @rvagg 450 | 451 | Moved to doc/changelogs/CHANGELOG_IOJS.md#2.0.0. 452 | 453 | ## 2015-04-20, Version 1.8.1, @chrisdickinson 454 | 455 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.8.1. 456 | 457 | ## 2015-04-14, Version 1.7.1, @rvagg 458 | 459 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.7.1. 460 | 461 | ## 2015-04-14, Version 1.7.0, @rvagg 462 | 463 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.7.0. 464 | 465 | ## 2015-04-06, Version 1.6.4, @Fishrock123 466 | 467 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.6.4. 468 | 469 | ## 2015-03-31, Version 1.6.3, @rvagg 470 | 471 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.6.3. 472 | 473 | ## 2015-03-31, Version 0.12.2 (Stable) 474 | 475 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.2. 476 | 477 | ## 2015-03-23, Version 1.6.2, @rvagg 478 | 479 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.6.2. 480 | 481 | ## 2015-03-23, Version 0.12.1 (Stable) 482 | 483 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.1. 484 | 485 | ## 2015-03-23, Version 0.10.38 (Maintenance) 486 | 487 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.38. 488 | 489 | ## 2015-03-20, Version 1.6.1, @rvagg 490 | 491 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.6.1. 492 | 493 | ## 2015-03-19, Version 1.6.0, @chrisdickinson 494 | 495 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.6.0. 496 | 497 | ## 2015-03-11, Version 0.10.37 (Maintenance) 498 | 499 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.37. 500 | 501 | ## 2015-03-09, Version 1.5.1, @rvagg 502 | 503 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.5.1. 504 | 505 | ## 2015-03-06, Version 1.5.0, @rvagg 506 | 507 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.5.0. 508 | 509 | ## 2015-03-02, Version 1.4.3, @rvagg 510 | 511 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.4.3. 512 | 513 | ## 2015-02-28, Version 1.4.2, @rvagg 514 | 515 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.4.2. 516 | 517 | ## 2015-02-26, Version 1.4.1, @rvagg 518 | 519 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.4.1. 520 | 521 | ## 2015-02-20, Version 1.3.0, @rvagg 522 | 523 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.3.0. 524 | 525 | ## 2015-02-10, Version 1.2.0, @rvagg 526 | 527 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.2.0. 528 | 529 | ## 2015-02-06, Version 0.12.0 (Stable) 530 | 531 | Moved to doc/changelogs/CHANGELOG_V012.md#0.12.0. 532 | 533 | ## 2015-02-03, Version 1.1.0, @chrisdickinson 534 | 535 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.1.0. 536 | 537 | ## 2015-01-26, Version 0.10.36 (Stable) 538 | 539 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.36. 540 | 541 | ## 2015-01-24, Version 1.0.4, @rvagg 542 | 543 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.0.4. 544 | 545 | ## 2015-01-20, Version 1.0.3, @rvagg 546 | 547 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.0.3. 548 | 549 | ## 2015-01-16, Version 1.0.2, @rvagg 550 | 551 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.0.2. 552 | 553 | ## 2015-01-14, Version 1.0.1, @rvagg 554 | 555 | Moved to doc/changelogs/CHANGELOG_IOJS.md#1.0.1. 556 | 557 | ## 2014.09.24, Version 0.11.14 (Unstable) 558 | 559 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.14. 560 | 561 | ## 2014.05.01, Version 0.11.13 (Unstable) 562 | 563 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.13. 564 | 565 | ## 2014.03.11, Version 0.11.12 (Unstable) 566 | 567 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.12. 568 | 569 | ## 2014.01.29, Version 0.11.11 (Unstable) 570 | 571 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.11. 572 | 573 | ## 2013.12.31, Version 0.11.10 (Unstable) 574 | 575 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.10. 576 | 577 | ## 2013.11.20, Version 0.11.9 (Unstable) 578 | 579 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.9. 580 | 581 | ## 2013.10.30, Version 0.11.8 (Unstable) 582 | 583 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.8. 584 | 585 | ## 2013.08.21, Version 0.11.7 (Unstable) 586 | 587 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.7. 588 | 589 | ## 2013.08.21, Version 0.11.6 (Unstable) 590 | 591 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.6. 592 | 593 | ## 2013.08.06, Version 0.11.5 (Unstable) 594 | 595 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.5. 596 | 597 | ## 2013.07.12, Version 0.11.4 (Unstable) 598 | 599 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.4. 600 | 601 | ## 2013.06.26, Version 0.11.3 (Unstable) 602 | 603 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.3. 604 | 605 | ## 2013.05.13, Version 0.11.2 (Unstable) 606 | 607 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.2. 608 | 609 | ## 2013.04.19, Version 0.11.1 (Unstable) 610 | 611 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.1. 612 | 613 | ## 2013.03.28, Version 0.11.0 (Unstable) 614 | 615 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.11.0. 616 | 617 | ## 2014.12.22, Version 0.10.35 (Stable) 618 | 619 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.35. 620 | 621 | ## 2014.12.17, Version 0.10.34 (Stable) 622 | 623 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.34. 624 | 625 | ## 2014.10.20, Version 0.10.33 (Stable) 626 | 627 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.33. 628 | 629 | ## 2014.09.16, Version 0.10.32 (Stable) 630 | 631 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.32. 632 | 633 | ## 2014.08.19, Version 0.10.31 (Stable) 634 | 635 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.31. 636 | 637 | ## 2014.07.31, Version 0.10.30 (Stable) 638 | 639 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.30. 640 | 641 | ## 2014.06.05, Version 0.10.29 (Stable) 642 | 643 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.29. 644 | 645 | ## 2014.05.01, Version 0.10.28 (Stable) 646 | 647 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.28. 648 | 649 | ## 2014.05.01, Version 0.10.27 (Stable) 650 | 651 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.27. 652 | 653 | ## 2014.02.18, Version 0.10.26 (Stable) 654 | 655 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.26. 656 | 657 | ## 2014.01.23, Version 0.10.25 (Stable) 658 | 659 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.25. 660 | 661 | ## 2013.12.18, Version 0.10.24 (Stable) 662 | 663 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.24. 664 | 665 | ## 2013.12.12, Version 0.10.23 (Stable) 666 | 667 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.23. 668 | 669 | ## 2013.11.12, Version 0.10.22 (Stable) 670 | 671 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.22. 672 | 673 | ## 2013.10.18, Version 0.10.21 (Stable) 674 | 675 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.21. 676 | 677 | ## 2013.09.30, Version 0.10.20 (Stable) 678 | 679 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.20. 680 | 681 | ## 2013.09.24, Version 0.10.19 (Stable) 682 | 683 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.19. 684 | 685 | ## 2013.09.04, Version 0.10.18 (Stable) 686 | 687 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.18. 688 | 689 | ## 2013.08.21, Version 0.10.17 (Stable) 690 | 691 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.17. 692 | 693 | ## 2013.08.16, Version 0.10.16 (Stable) 694 | 695 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.16. 696 | 697 | ## 2013.07.25, Version 0.10.15 (Stable) 698 | 699 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.15. 700 | 701 | ## 2013.07.25, Version 0.10.14 (Stable) 702 | 703 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.14. 704 | 705 | ## 2013.07.09, Version 0.10.13 (Stable) 706 | 707 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.13. 708 | 709 | ## 2013.06.18, Version 0.10.12 (Stable) 710 | 711 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.12. 712 | 713 | ## 2013.06.13, Version 0.10.11 (Stable) 714 | 715 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.11. 716 | 717 | ## 2013.06.04, Version 0.10.10 (Stable) 718 | 719 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.10. 720 | 721 | ## 2013.05.30, Version 0.10.9 (Stable) 722 | 723 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.9. 724 | 725 | ## 2013.05.24, Version 0.10.8 (Stable) 726 | 727 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.8. 728 | 729 | ## 2013.05.17, Version 0.10.7 (Stable) 730 | 731 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.7. 732 | 733 | ## 2013.05.14, Version 0.10.6 (Stable) 734 | 735 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.6. 736 | 737 | ## 2013.04.23, Version 0.10.5 (Stable) 738 | 739 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.5. 740 | 741 | ## 2013.04.11, Version 0.10.4 (Stable) 742 | 743 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.4. 744 | 745 | ## 2013.04.03, Version 0.10.3 (Stable) 746 | 747 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.3. 748 | 749 | ## 2013.03.28, Version 0.10.2 (Stable) 750 | 751 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.2. 752 | 753 | ## 2013.03.21, Version 0.10.1 (Stable) 754 | 755 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.1. 756 | 757 | ## 2013.03.11, Version 0.10.0 (Stable) 758 | 759 | Moved to doc/changelogs/CHANGELOG_V010.md#0.10.0. 760 | 761 | ## 2013.03.06, Version 0.9.12 (Unstable) 762 | 763 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.12. 764 | 765 | ## 2013.03.01, Version 0.9.11 (Unstable) 766 | 767 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.11. 768 | 769 | ## 2013.02.19, Version 0.9.10 (Unstable) 770 | 771 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.10. 772 | 773 | ## 2013.02.07, Version 0.9.9 (Unstable) 774 | 775 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.9. 776 | 777 | ## 2013.01.24, Version 0.9.8 (Unstable) 778 | 779 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.8. 780 | 781 | ## 2013.01.18, Version 0.9.7 (Unstable) 782 | 783 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.7. 784 | 785 | ## 2013.01.11, Version 0.9.6 (Unstable) 786 | 787 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.6. 788 | 789 | ## 2012.12.30, Version 0.9.5 (Unstable) 790 | 791 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.5. 792 | 793 | ## 2012.12.21, Version 0.9.4 (Unstable) 794 | 795 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.4. 796 | 797 | ## 2012.10.24, Version 0.9.3 (Unstable) 798 | 799 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.3. 800 | 801 | ## 2012.09.17, Version 0.9.2 (Unstable) 802 | 803 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.2. 804 | 805 | ## 2012.08.28, Version 0.9.1 (Unstable) 806 | 807 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.1. 808 | 809 | ## 2012.07.20, Version 0.9.0 (Unstable) 810 | 811 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.9.0. 812 | 813 | ## 2013.06.13, Version 0.8.25 (maintenance) 814 | 815 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.25. 816 | 817 | ## 2013.06.04, Version 0.8.24 (maintenance) 818 | 819 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.24. 820 | 821 | ## 2013.04.09, Version 0.8.23 (maintenance) 822 | 823 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.23. 824 | 825 | ## 2013.03.07, Version 0.8.22 (Stable) 826 | 827 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.22. 828 | 829 | ## 2013.02.25, Version 0.8.21 (Stable) 830 | 831 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.21. 832 | 833 | ## 2013.02.15, Version 0.8.20 (Stable) 834 | 835 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.20. 836 | 837 | ## 2013.02.06, Version 0.8.19 (Stable) 838 | 839 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.19. 840 | 841 | ## 2013.01.18, Version 0.8.18 (Stable) 842 | 843 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.18. 844 | 845 | ## 2013.01.09, Version 0.8.17 (Stable) 846 | 847 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.17. 848 | 849 | ## 2012.12.13, Version 0.8.16 (Stable) 850 | 851 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.16. 852 | 853 | ## 2012.11.26, Version 0.8.15 (Stable) 854 | 855 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.15. 856 | 857 | ## 2012.10.25, Version 0.8.14 (Stable) 858 | 859 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.14. 860 | 861 | ## 2012.10.25, Version 0.8.13 (Stable) 862 | 863 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.13. 864 | 865 | ## 2012.10.12, Version 0.8.12 (Stable) 866 | 867 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.12. 868 | 869 | ## 2012.09.27, Version 0.8.11 (Stable) 870 | 871 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.11. 872 | 873 | ## 2012.09.25, Version 0.8.10 (Stable) 874 | 875 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.10. 876 | 877 | ## 2012.09.11, Version 0.8.9 (Stable) 878 | 879 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.9. 880 | 881 | ## 2012.08.22, Version 0.8.8 (Stable) 882 | 883 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.8. 884 | 885 | ## 2012.08.15, Version 0.8.7 (Stable) 886 | 887 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.7. 888 | 889 | ## 2012.08.07, Version 0.8.6 (Stable) 890 | 891 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.6. 892 | 893 | ## 2012.08.02, Version 0.8.5 (Stable) 894 | 895 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.5. 896 | 897 | ## 2012.07.25, Version 0.8.4 (Stable) 898 | 899 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.4. 900 | 901 | ## 2012.07.19, Version 0.8.3 (Stable) 902 | 903 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.3. 904 | 905 | ## 2012.07.09, Version 0.8.2 (Stable) 906 | 907 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.2. 908 | 909 | ## 2012.06.29, Version 0.8.1 (stable) 910 | 911 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.1. 912 | 913 | ## 2012.06.25, Version 0.8.0 (stable) 914 | 915 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.8.0. 916 | 917 | ## 2012.06.19, Version 0.7.12 (unstable) 918 | 919 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.12. 920 | 921 | ## 2012.06.15, Version 0.7.11 (unstable) 922 | 923 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.11. 924 | 925 | ## 2012.06.11, Version 0.7.10 (unstable) 926 | 927 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.10. 928 | 929 | ## 2012.05.28, Version 0.7.9 (unstable) 930 | 931 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.9. 932 | 933 | ## 2012.04.18, Version 0.7.8 (unstable) 934 | 935 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.8. 936 | 937 | ## 2012.03.30, Version 0.7.7 (unstable) 938 | 939 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.7. 940 | 941 | ## 2012.03.13, Version 0.7.6 (unstable) 942 | 943 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.6. 944 | 945 | ## 2012.02.23, Version 0.7.5 (unstable) 946 | 947 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.5. 948 | 949 | ## 2012.02.14, Version 0.7.4 (unstable) 950 | 951 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.4. 952 | 953 | ## 2012.02.07, Version 0.7.3 (unstable) 954 | 955 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.3. 956 | 957 | ## 2012.02.01, Version 0.7.2 (unstable) 958 | 959 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.2. 960 | 961 | ## 2012.01.23, Version 0.7.1 (unstable) 962 | 963 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.1. 964 | 965 | ## 2012.01.16, Version 0.7.0 (unstable) 966 | 967 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.7.0. 968 | 969 | ## 2012.07.10 Version 0.6.20 (maintenance) 970 | 971 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.20. 972 | 973 | ## 2012.06.06 Version 0.6.19 (stable) 974 | 975 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.19. 976 | 977 | ## 2012.05.15 Version 0.6.18 (stable) 978 | 979 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.18. 980 | 981 | ## 2012.05.04 Version 0.6.17 (stable) 982 | 983 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.17. 984 | 985 | ## 2012.04.30 Version 0.6.16 (stable) 986 | 987 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.16. 988 | 989 | ## 2012.04.09 Version 0.6.15 (stable) 990 | 991 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.15. 992 | 993 | ## 2012.03.22 Version 0.6.14 (stable) 994 | 995 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.14. 996 | 997 | ## 2012.03.15 Version 0.6.13 (stable) 998 | 999 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.13. 1000 | 1001 | ## 2012.03.02 Version 0.6.12 (stable) 1002 | 1003 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.12. 1004 | 1005 | ## 2012.02.17 Version 0.6.11 (stable) 1006 | 1007 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.11. 1008 | 1009 | ## 2012.02.02, Version 0.6.10 (stable) 1010 | 1011 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.10. 1012 | 1013 | ## 2012.01.27, Version 0.6.9 (stable) 1014 | 1015 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.9. 1016 | 1017 | ## 2012.01.19, Version 0.6.8 (stable) 1018 | 1019 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.8. 1020 | 1021 | ## 2012.01.06, Version 0.6.7 (stable) 1022 | 1023 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.7. 1024 | 1025 | ## 2011.12.14, Version 0.6.6 (stable) 1026 | 1027 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.6. 1028 | 1029 | ## 2011.12.04, Version 0.6.5 (stable) 1030 | 1031 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.5. 1032 | 1033 | ## 2011.12.02, Version 0.6.4 (stable) 1034 | 1035 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.4. 1036 | 1037 | ## 2011.11.25, Version 0.6.3 (stable) 1038 | 1039 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.3. 1040 | 1041 | ## 2011.11.18, Version 0.6.2 (stable) 1042 | 1043 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.2. 1044 | 1045 | ## 2011.11.11, Version 0.6.1 (stable) 1046 | 1047 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.1. 1048 | 1049 | ## 2011.11.04, Version 0.6.0 (stable) 1050 | 1051 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.6.0. 1052 | 1053 | ## 2011.10.21, Version 0.5.10 (unstable) 1054 | 1055 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.10. 1056 | 1057 | ## 2011.10.10, Version 0.5.9 (unstable) 1058 | 1059 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.9. 1060 | 1061 | ## 2011.09.30, Version 0.5.8 (unstable) 1062 | 1063 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.8. 1064 | 1065 | ## 2011.09.16, Version 0.5.7 (unstable) 1066 | 1067 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.7. 1068 | 1069 | ## 2011.09.08, Version 0.5.6 (unstable) 1070 | 1071 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.6. 1072 | 1073 | ## 2011.08.26, Version 0.5.5 (unstable) 1074 | 1075 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.5. 1076 | 1077 | ## 2011.08.12, Version 0.5.4 (unstable) 1078 | 1079 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.4. 1080 | 1081 | ## 2011.08.01, Version 0.5.3 (unstable) 1082 | 1083 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.3. 1084 | 1085 | ## 2011.07.22, Version 0.5.2 (unstable) 1086 | 1087 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.2. 1088 | 1089 | ## 2011.07.14, Version 0.5.1 (unstable) 1090 | 1091 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.1. 1092 | 1093 | ## 2011.07.05, Version 0.5.0 (unstable) 1094 | 1095 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.5.0. 1096 | 1097 | ## 2011.09.15, Version 0.4.12 (stable) 1098 | 1099 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.12. 1100 | 1101 | ## 2011.08.17, Version 0.4.11 (stable) 1102 | 1103 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.11. 1104 | 1105 | ## 2011.07.19, Version 0.4.10 (stable) 1106 | 1107 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.10. 1108 | 1109 | ## 2011.06.29, Version 0.4.9 (stable) 1110 | 1111 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.9. 1112 | 1113 | ## 2011.05.20, Version 0.4.8 (stable) 1114 | 1115 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.8. 1116 | 1117 | ## 2011.04.22, Version 0.4.7 (stable) 1118 | 1119 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.7. 1120 | 1121 | ## 2011.04.13, Version 0.4.6 (stable) 1122 | 1123 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.6. 1124 | 1125 | ## 2011.04.01, Version 0.4.5 (stable) 1126 | 1127 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.5. 1128 | 1129 | ## 2011.03.26, Version 0.4.4 (stable) 1130 | 1131 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.4. 1132 | 1133 | ## 2011.03.18, Version 0.4.3 (stable) 1134 | 1135 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.3. 1136 | 1137 | ## 2011.03.02, Version 0.4.2 (stable) 1138 | 1139 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.2. 1140 | 1141 | ## 2011.02.19, Version 0.4.1 (stable) 1142 | 1143 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.1. 1144 | 1145 | ## 2011.02.10, Version 0.4.0 (stable) 1146 | 1147 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.4.0. 1148 | 1149 | ## 2011.02.04, Version 0.3.8 (unstable) 1150 | 1151 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.8. 1152 | 1153 | ## 2011.01.27, Version 0.3.7 (unstable) 1154 | 1155 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.7. 1156 | 1157 | ## 2011.01.21, Version 0.3.6 (unstable) 1158 | 1159 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.6. 1160 | 1161 | ## 2011.01.16, Version 0.3.5 (unstable) 1162 | 1163 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.5. 1164 | 1165 | ## 2011.01.08, Version 0.3.4 (unstable) 1166 | 1167 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.4. 1168 | 1169 | ## 2011.01.02, Version 0.3.3 (unstable) 1170 | 1171 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.3. 1172 | 1173 | ## 2010.12.16, Version 0.3.2 (unstable) 1174 | 1175 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.2. 1176 | 1177 | ## 2010.11.16, Version 0.3.1 (unstable) 1178 | 1179 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.1. 1180 | 1181 | ## 2010.10.23, Version 0.3.0 (unstable) 1182 | 1183 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.3.0. 1184 | 1185 | ## 2010.08.20, Version 0.2.0 1186 | 1187 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.2.0. 1188 | 1189 | ## 2010.08.13, Version 0.1.104 1190 | 1191 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.104. 1192 | 1193 | ## 2010.08.04, Version 0.1.103 1194 | 1195 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.103. 1196 | 1197 | ## 2010.07.25, Version 0.1.102 1198 | 1199 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.102. 1200 | 1201 | ## 2010.07.16, Version 0.1.101 1202 | 1203 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.101. 1204 | 1205 | ## 2010.07.03, Version 0.1.100 1206 | 1207 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.100. 1208 | 1209 | ## 2010.06.21, Version 0.1.99 1210 | 1211 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.99. 1212 | 1213 | ## 2010.06.11, Version 0.1.98 1214 | 1215 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.98. 1216 | 1217 | ## 2010.05.29, Version 0.1.97 1218 | 1219 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.97. 1220 | 1221 | ## 2010.05.21, Version 0.1.96 1222 | 1223 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.96. 1224 | 1225 | ## 2010.05.13, Version 0.1.95 1226 | 1227 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.95. 1228 | 1229 | ## 2010.05.06, Version 0.1.94 1230 | 1231 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.94. 1232 | 1233 | ## 2010.04.29, Version 0.1.93 1234 | 1235 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.93. 1236 | 1237 | ## 2010.04.23, Version 0.1.92 1238 | 1239 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.92. 1240 | 1241 | ## 2010.04.15, Version 0.1.91 1242 | 1243 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.91. 1244 | 1245 | ## 2010.04.09, Version 0.1.90 1246 | 1247 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.90. 1248 | 1249 | ## 2010.03.19, Version 0.1.33 1250 | 1251 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.33. 1252 | 1253 | ## 2010.03.12, Version 0.1.32 1254 | 1255 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.32. 1256 | 1257 | ## 2010.03.05, Version 0.1.31 1258 | 1259 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.31. 1260 | 1261 | ## 2010.02.22, Version 0.1.30 1262 | 1263 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.30. 1264 | 1265 | ## 2010.02.17, Version 0.1.29 1266 | 1267 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.29. 1268 | 1269 | ## 2010.02.09, Version 0.1.28 1270 | 1271 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.28. 1272 | 1273 | ## 2010.02.03, Version 0.1.27 1274 | 1275 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.27. 1276 | 1277 | ## 2010.01.20, Version 0.1.26 1278 | 1279 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.26. 1280 | 1281 | ## 2010.01.09, Version 0.1.25 1282 | 1283 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.25. 1284 | 1285 | ## 2009.12.31, Version 0.1.24 1286 | 1287 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.24. 1288 | 1289 | ## 2009.12.22, Version 0.1.23 1290 | 1291 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.23. 1292 | 1293 | ## 2009.12.19, Version 0.1.22 1294 | 1295 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.22. 1296 | 1297 | ## 2009.12.06, Version 0.1.21 1298 | 1299 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.21. 1300 | 1301 | ## 2009.11.28, Version 0.1.20 1302 | 1303 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.20. 1304 | 1305 | ## 2009.11.28, Version 0.1.19 1306 | 1307 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.19. 1308 | 1309 | ## 2009.11.17, Version 0.1.18 1310 | 1311 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.18. 1312 | 1313 | ## 2009.11.07, Version 0.1.17 1314 | 1315 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.17. 1316 | 1317 | ## 2009.11.03, Version 0.1.16 1318 | 1319 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.16. 1320 | 1321 | ## 2009.10.28, Version 0.1.15 1322 | 1323 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.15. 1324 | 1325 | ## 2009.10.09, Version 0.1.14 1326 | 1327 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.14. 1328 | 1329 | ## 2009.09.30, Version 0.1.13 1330 | 1331 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.13. 1332 | 1333 | ## 2009.09.24, Version 0.1.12 1334 | 1335 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.12. 1336 | 1337 | ## 2009.09.18, Version 0.1.11 1338 | 1339 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.11. 1340 | 1341 | ## 2009.09.11, Version 0.1.10 1342 | 1343 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.10. 1344 | 1345 | ## 2009.09.05, Version 0.1.9 1346 | 1347 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.9. 1348 | 1349 | ## 2009.09.04, Version 0.1.8 1350 | 1351 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.8. 1352 | 1353 | ## 2009.08.27, Version 0.1.7 1354 | 1355 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.7. 1356 | 1357 | ## 2009.08.22, Version 0.1.6 1358 | 1359 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.6. 1360 | 1361 | ## 2009.08.21, Version 0.1.5 1362 | 1363 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.4. 1368 | 1369 | ## 2009.08.06, Version 0.1.3 1370 | 1371 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.3. 1372 | 1373 | ## 2009.08.01, Version 0.1.2 1374 | 1375 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.2. 1376 | 1377 | ## 2009.07.27, Version 0.1.1 1378 | 1379 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.1. 1380 | 1381 | ## 2009.06.30, Version 0.1.0 1382 | 1383 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.1.0. 1384 | 1385 | ## 2009.06.24, Version 0.0.6 1386 | 1387 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.0.6. 1388 | 1389 | ## 2009.06.18, Version 0.0.5 1390 | 1391 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.0.5. 1392 | 1393 | ## 2009.06.13, Version 0.0.4 1394 | 1395 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.0.4. 1396 | 1397 | ## 2009.06.11, Version 0.0.3 1398 | 1399 | Moved to doc/changelogs/CHANGELOG_ARCHIVE.md#0.0.3. 1400 | -------------------------------------------------------------------------------- /nodejs/nodejs/DETAILS.md: -------------------------------------------------------------------------------- 1 | # 关于还原的详细信息 2 | 3 | ### wxapkg 包 4 | 5 | 对于 wxapkg 包文件格式的分析已在网上广泛流传,可整理为如下内容(请注意该文件中的`uint32`都是以`大端序`方式存放): 6 | 7 | ```c++ 8 | typedef unsigned char uint8; 9 | typedef unsigned int uint32;//Notice: uint32 use BIG-ENDIAN, not Little. 10 | 11 | struct wxHeader { 12 | uint8 firstMark;// one of magic number, which is equal to 0xbe 13 | uint32 unknownInfo;// this info was always set to zero. maybe it's the verison of file? 14 | uint32 infoListLength;// the length of wxFileInfoList 15 | uint32 dataLength;// the length of dataBuf 16 | uint8 lastMark;// another magic number, which is equal to 0xed 17 | }; 18 | 19 | struct wxFileInfo {// illustrate one file in wxapkg pack 20 | uint32 nameLen;// the length of filename 21 | char name[nameLen];// filename, use UTF-8 encoding (translating it to GBK is required in Win) 22 | uint32 fileOff;// the offset of this file (0 is pointing to the begining of this file[struct wxapkgFile]) 23 | uint32 fileLen;// the length of this file 24 | }; 25 | 26 | struct wxFileInfoList { 27 | uint32 fileCount;// The count of file 28 | wxFileInfo fileInfos[fileCount]; 29 | }; 30 | 31 | struct wxapkgFile { 32 | wxHeader header; 33 | wxFileInfoList fileInfoList; 34 | uint8 dataBuf[dataLength]; 35 | }; 36 | ``` 37 | 38 | 由上可知,在wxapkg 包中文件头后的位置上有`文件名+文件内容起始地址及长度`信息,且各个文件内容也全是以明文方式存放在包内,从而我们可以获取包内文件。 39 | 40 | 通过解包可知,这个包中的文件内容主要如下: 41 | 42 | - app-config.json 43 | - app-service.js 44 | - page-frame.html ( 也可能是由 app-wxss.js 和 page-frame.js 组成相关信息 ) 45 | - 其他一堆放在各文件夹中的.html文件 46 | - 和源码包内位置和内容相同的图片等资源文件 47 | 48 | 微信开发者工具并不能识别这些文件,它要求我们提供由`wxml/wxss/js/wxs/json`组成的源码才能进行模拟/调试。 49 | 50 | ### js 51 | 52 | 注意到`app-service.js`中的内容由 53 | 54 | ```javascript 55 | define('xxx.js',function(...){ 56 | //The content of xxx.js 57 | });require('xxx.js'); 58 | define('yyy.js',function(...){ 59 | //The content of xxx.js 60 | });require('yyy.js'); 61 | .... 62 | ``` 63 | 64 | 组成,很显然,我们只要定义自己的`define`函数就可以将这些 js 文件恢复到源码中所对应的位置。当然,这些 js 文件中的内容经过压缩,即使使用 UglifyJS 这样的工具进行美化,也无法还原一些原始变量名。 65 | 66 | ### wxss 67 | 68 | 所有在 wxapkg 包中的 html 文件都调用了`setCssToHead`函数,其代码如下 69 | 70 | ```javascript 71 | var setCssToHead = function(file, _xcInvalid) { 72 | var Ca = {}; 73 | var _C = [...arrays...]; 74 | function makeup(file, suffix) { 75 | var _n = typeof file === "number"; 76 | if (_n && Ca.hasOwnProperty(file)) return ""; 77 | if (_n) Ca[file] = 1; 78 | var ex = _n ? _C[file] : file; 79 | var res = ""; 80 | for (var i = ex.length - 1; i >= 0; i--) { 81 | var content = ex[i]; 82 | if (typeof content === "object") { 83 | var op = content[0]; 84 | if (op == 0) res = transformRPX(content[1]) + "px" + res; else if (op == 1) res = suffix + res; else if (op == 2) res = makeup(content[1], suffix) + res; 85 | } else res = content + res; 86 | } 87 | return res; 88 | } 89 | return function(suffix, opt) { 90 | if (typeof suffix === "undefined") suffix = ""; 91 | if (opt && opt.allowIllegalSelector != undefined && _xcInvalid != undefined) { 92 | if (opt.allowIllegalSelector) console.warn("For developer:" + _xcInvalid); else { 93 | console.error(_xcInvalid + "This wxss file is ignored."); 94 | return; 95 | } 96 | } 97 | Ca = {}; 98 | css = makeup(file, suffix); 99 | var style = document.createElement("style"); 100 | var head = document.head || document.getElementsByTagName("head")[0]; 101 | style.type = "text/css"; 102 | if (style.styleSheet) { 103 | style.styleSheet.cssText = css; 104 | } else { 105 | style.appendChild(document.createTextNode(css)); 106 | } 107 | head.appendChild(style); 108 | }; 109 | }; 110 | ``` 111 | 112 | 阅读这段代码可知,它把 wxss 代码拆分成几段数组,数组中的内容可以是一段将要作为 css 文件的字符串,也可以是一个表示 这里要添加一个公共后缀 或 这里要包含另一段代码 或 要将以 wxss 专供的 rpx 单位表达的数字换算成能由浏览器渲染的 px 单位所对应的数字 的数组。 113 | 114 | 同时,它还将所有被`@import`引用的 wxss 文件所对应的数组内嵌在该函数中的 _C 变量中。 115 | 116 | 我们可以修改`setCssToHead`,然后执行所有的`setCssToHead`,第一遍先判断出 _C 变量中所有的内容是哪个要被引用的 wxss 提供的,第二遍还原所有的 wxss。值得注意的是,可能出于兼容性原因,微信为很多属性自动补上含有`-webkit-`开头的版本,另外几乎所有的 tag 都加上了`wx-`前缀,并将`page`变成了`body`。通过一些 CSS 的 AST ,例如 [CSSTree](https://github.com/csstree/csstree),我们可以去掉这些东西。 117 | 118 | ### json 119 | 120 | app-config.json 中的`page`对象内就是其他各页面所对应的 json , 直接还原即可,余下的内容便是 app.json 中的内容了,除了格式上要作相应转换外,微信还将`iconPath`的内容由原先指向图片文件的地址转换成`iconData`中图片内容的 base64 编码,所幸原来的图片文件仍然保留在包内,通过比较`iconData`中的内容和其他包内文件,我们找到原始的`iconPath`。 121 | 122 | ### wxs 123 | 124 | 在 page-frame.html ( 或 app-wxss.js ) 中,我们找到了这样的内容 125 | 126 | ```javascript 127 | f_['a/comm.wxs'] = nv_require("p_a/comm.wxs"); 128 | function np_0(){var nv_module={nv_exports:{}};nv_module.nv_exports = ({nv_bar:nv_some_msg,});return nv_module.nv_exports;} 129 | 130 | f_['b/comm.wxs'] = nv_require("p_b/comm.wxs"); 131 | function np_1(){var nv_module={nv_exports:{}};nv_module.nv_exports = ({nv_bar:nv_some_msg,});return nv_module.nv_exports;} 132 | 133 | f_['b/index.wxml']={}; 134 | f_['b/index.wxml']['foo'] =nv_require("m_b/index.wxml:foo"); 135 | function np_2(){var nv_module={nv_exports:{}};var nv_some_msg = "hello world";nv_module.nv_exports = ({nv_msg:nv_some_msg,});return nv_module.nv_exports;} 136 | f_['b/index.wxml']['some_comms'] =f_['b/comm.wxs'] || nv_require("p_b/comm.wxs"); 137 | f_['b/index.wxml']['some_comms'](); 138 | f_['b/index.wxml']['some_commsb'] =f_['a/comm.wxs'] || nv_require("p_a/comm.wxs"); 139 | f_['b/index.wxml']['some_commsb'](); 140 | ``` 141 | 142 | 可以看出微信将内嵌和外置的 wxs 都转译成`np_%d`函数,并由`f_`数组来描述他们。转译的主要变换是调用的函数名称都加上了`nv_`前缀。在不严谨的场合,我们可以直接通过文本替换去除这些前缀。 143 | 144 | ### wxml 145 | 146 | 相比其他内容,这一段比较复杂,因为微信将原本 类 xml 格式的 wxml 文件直接编译成了 js 代码放入 page-frame.html ( 或 app-wxss.js ) 中,之后通过调用这些代码来构造 virtual-dom,进而渲染网页。 147 | 首先,微信将所有要动态计算的变量放在了一个由函数构造的`z`数组中,构造部分代码如下: 148 | 149 | ```javascript 150 | (function(z){var a=11;function Z(ops){z.push(ops)} 151 | Z([3,'index']); 152 | Z([[8],'text',[[4],[[5],[[5],[[5],[1,1]],[1,2]],[1,3]]]]); 153 | })(z); 154 | ``` 155 | 156 | 其实可以将`[[id],xxx,yyy]`看作由指令与操作数的组合。注意每个这样的数组作为指令所产生的结果会作为外层数组中的操作数,这样可以构成一个树形结构。通过将递归计算的过程改成拼接源代码字符串的过程,我们可以还原出每个数组所对应的实际内容(值得注意的是,由于微信的`Token`解析程序采用了贪心算法,我们必须将连续的`}`翻译为`} }`而非`}}`,否则会被误认为是`Mustache`的结束符)。下文中,将这个数组中记为`z`。 157 | 158 | 然后,对于 wxml 文件的结构,可以将每种可能的 js 语句拆分成 指令 来分析,这里可以用到 [Esprima](https://github.com/jquery/esprima) 这样的 js 的 AST 来简化识别操作,可以很容易分析出以下内容,例如: 159 | 160 | - `var {name}=_n('{tag}')` 创建名称为`{name}`, tag 为`{tag}`的节点。 161 | - `_r({name},'{attrName}',{id},e,s,gg)` 将`{name}`的`{attrName}`属性修改为`z[{id}]`的值。 162 | - `_({parName},{name})` 将`{name}`作为`{parName}`的子节点。 163 | - `var {name}=_o({id},..,..,..)` 创建名称为`{name}`,内容为`z[{id}]`的文本节点。 164 | - `var {name}=_v()` 创建名称为`{name}`的虚节点( wxml 里恰好提供了功能相当的虚结点`block`, 这句话相当于`var {name}=_n('block')`)。 165 | - `var {name}=_m('{tag}',['{attrName1}',{id1},'{attrName2}',{id2},...],[],..,..,..)` 创建名称为`{name}`, tag 为`{tag}`的节点,同时将`{attrNameX}`属性修改为`z[f({idX})]`的值(`f`定义为`{idX}`与`{base}`的和;`{base}`初始为`0`,`f`返回的第一个正值后`{base}`即改为该返回值;若返回负值,表示该属性无值)。 166 | - `return {name}` 名称为`{name}`的节点设为主节点。 167 | - `cs.***` 调试用语句,无视之。 168 | 169 | 此外`wx:if`结构和`wx:for`可做递归处理。例如,对于如下`wx:if`结构: 170 | 171 | ```javascript 172 | var {name}=_v() 173 | _({parName},{name}) 174 | if(_o({id1},e,s,gg)){oD.wxVkey=1 175 | //content1 176 | } 177 | else if(_o({id2},e,s,gg)){oD.wxVkey=2 178 | //content2 179 | } 180 | else{oD.wxVkey=3 181 | //content3 182 | } 183 | ``` 184 | 185 | 相当于将以下节点放入`{parName}`节点下(`z[{id1}]`应替换为对应的`z`数组中的值): 186 | 187 | ```xml 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | ``` 198 | 199 | 具体实现中可以将递归时创建好多个`block`,调用子函数时指明将放入`{name}`下(`_({name},{son})`)识别为放入对应`{block}`下。`wx:for`也可类似处理,例如: 200 | 201 | ```javascript 202 | var {name}=_v() 203 | _({parName},{name}) 204 | var {funcName}=function(..,..,{fakeRoot},..){ 205 | //content 206 | return {fakeRoot} 207 | } 208 | aDB.wxXCkey=2 209 | _2({id},{funcName},..,..,..,..,'{item}','{index}','{key}') 210 | ``` 211 | 212 | 对应(`z[{id1}]`应替换为对应的`z`数组中的值): 213 | 214 | ```xml 215 | 216 | 217 | 218 | ``` 219 | 220 | 调用子函数时指明将放入`{fakeRoot}`下(`_({fakeRoot},{son})`)识别为放入`{name}`下。 221 | 222 | 除此之外,有时我们还要将一组代码标记为一个指令,例如下面: 223 | 224 | ```javascript 225 | var lK=_v() 226 | _({parName},lK) 227 | var aL=_o({isId},e,s,gg) 228 | var tM=_gd(x[0],aL,e_,d_) 229 | if(tM){ 230 | var eN=_1({dataId},e,s,gg) || {} 231 | var cur_globalf=gg.f 232 | lK.wxXCkey=3 233 | tM(eN,eN,lK,gg) 234 | gg.f=cur_globalf 235 | } 236 | else _w(aL,x[0],11,26) 237 | ``` 238 | 239 | 对应于`{parName}`下添加如下节点: 240 | 241 | ```xml 242 | 243 | ``` 244 | 245 | 还有`import`和`include`的代码比较分散,但其实只要抓住重点的一句话就可以了,例如: 246 | 247 | ```javascript 248 | var {name}=e_[x[{to}]].i 249 | //Other code 250 | _ai({name},x[{from}],e_,x[{to}],..,..) 251 | //Other code 252 | {name}.pop() 253 | ``` 254 | 255 | 对应与(其中的`x`是直接定义在 page-frame.html ( 或 app-wxss.js ) 中的字符串数组): 256 | 257 | ```xml 258 | 259 | ``` 260 | 261 | 而`include`类似: 262 | 263 | ```javascript 264 | var {name}=e_[x[0]].j 265 | //Other code 266 | _ic(x[{from}],e_,x[{to}],..,..,..,..); 267 | //Other code 268 | {name}.pop() 269 | ``` 270 | 271 | 对应与: 272 | 273 | ```xml 274 | 275 | ``` 276 | 277 | 可以看到我们可以在处理时忽略前后两句话,把中间的`_ic`和`_ai`处理好就行了。 278 | 279 | 通过解析 js 把 wxml 大概结构还原后,可能相比编译前的 wxml 显得臃肿,可以考虑自动简化,例如: 280 | 281 | ```xml 282 | 283 | 284 | 285 | 286 | 287 | ``` 288 | 289 | 可简化为: 290 | 291 | ```xml 292 | 293 | 294 | 295 | ``` 296 | 297 | 这样,我们完成了几乎所有 wxapkg包 内容的还原。 298 | 299 | ### 对`z`数组优化后的支持方法 300 | 301 | `wcc-v0.5vv_20180626_syb_zp`后通过只加载`z`数组中需要的部分来提高小程序运行速度,这也会导致仅考虑到上述内容的解包程序解包失败,这一更新的主要内容如下: 302 | 303 | - 增加z数组的函数:`_rz` `_2z` `_mz` `_1z` `_oz` 304 | - 在每个函数头部增加了`var z=gz$gwx_{$id}()`,来标识使用的z数组id 305 | - 原有的z数组不再存在 306 | - z数组已以下固定格式出现: 307 | 308 | ```javascript 309 | function gz$gwx_{$id}(){ 310 | if( __WXML_GLOBAL__.ops_cached.$gwx_{$id})return __WXML_GLOBAL__.ops_cached.$gwx_{$id} 311 | __WXML_GLOBAL__.ops_cached.$gwx_{$id}=[]; 312 | (function(z){var a=11;function Z(ops){z.push(ops)} 313 | 314 | //... (Z({$content})) 315 | 316 | })(__WXML_GLOBAL__.ops_cached.$gwx_{$id});return __WXML_GLOBAL__.ops_cached.$gwx_{$id} 317 | } 318 | ``` 319 | 320 | 对于上述变更,将获取`z`数组处修改并添加对`_rz` `_2z` `_mz` `_1z` `_oz`的支持即可。 321 | 322 | 需要注意的是开发版的`z`数组转为如下结构: 323 | 324 | ```javascript 325 | (function(z){var a=11;function Z(ops,debugLine){z.push(['11182016',ops,debugLine])} 326 | //... 327 | })//... 328 | ``` 329 | 330 | 探测到为开发版后应将获取到的`z`数组仅保留数组中的第二项。 331 | 332 | 以及含分包的子包采用 `gz$gwx{$subPackageId}_{$id}` 命名,其中`{$subPackageId}`是一个数字。 333 | 334 | 另外还需要注意,`template`的 `var z=gz$gwx_{$id}` 在`try`块外。 -------------------------------------------------------------------------------- /nodejs/nodejs/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | (如果你是要反馈 bug, 请按以下格式书写 Issue; 如果你遇到的是 Node.js 使用问题, 请尽可能依赖搜索引擎解决问题; 任何对某类小程序包的适配问题都应提供 wxapkg 程序包,否则直接 Close 处理; 提交前请确认 wxapkg 程序包版本不小于 v0.6vv_20180111_fbi (直接用文本编辑器打开 wxapkg包搜索 v0.6vv 或 v0.5vv 即可查到,注意版本大小主要比较的是日期), 旧版本不提供支持, 相关 Issue 直接 Close 处理。) 2 | 3 | 程序执行命令(可选): 4 | 5 | 程序执行错误信息(如果反馈是抛出异常的错误,必填): 6 | 7 | ``` 8 | 复制到这里 9 | ``` 10 | 11 | 程序结果错误信息(如果反馈不是抛出异常的错误, 必填, 请尽可能详细描述): 12 | 13 | 程序包(你所要解压的程序包地址, 可为网盘链接, 也可直接上传[上传前请先打包]. 必填): 14 | 15 | 其他附加内容: 16 | -------------------------------------------------------------------------------- /nodejs/nodejs/README (2).md: -------------------------------------------------------------------------------- 1 | # wxappUnpacker 2 | 3 | ![版本 0.2.3](https://img.shields.io/badge/版本-0.2.3-red.svg) ![支持的微信版本 >20180111](https://img.shields.io/badge/%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC-%3E=20180111-brightgreen.svg) ![高级特性支持度 0](https://img.shields.io/badge/%E6%94%AF%E6%8C%81-0%25-yellow.svg) 4 | 5 | > Wechat App(微信小程序, .wxapkg)解包及相关文件(.wxss, .json, .wxs, .wxml)还原工具 6 | 7 | ## 当前功能如下(分包功能尚未完成!) 8 | 9 | - `node wuConfig.js ` 将 app-config.json 中的内容拆分到各个文件对应的 .json 和 app.json , 并通过搜索 app-config.json 所在文件夹下的所有文件尝试将 iconData 还原为 iconPath 。 10 | - `node wuJs.js ` 将 app-service.js (或小游戏中的 game.js ) 拆分成一系列原先独立的 javascript 文件,并使用 Uglify-ES 美化,从而尽可能还原编译前的情况。 11 | - `node wuWxml.js [-m] ` 将编译/混合到 page-frame.html ( 或 app-wxss.js ) 中的 wxml 和 wxs 文件还原为独立的、未编译的文件。如果加上`-m`指令,就会阻止`block`块自动省略,可能帮助解决一些相关过程的 bug 。 12 | - `node wuWxss.js ` 通过获取文件夹下的 page-frame.html ( 或 app-wxss.js ) 和其他 html 文件的内容,还原出编译前 wxss 文件的内容。 13 | - `node wuWxapkg.js [-o] [-d] [-s=
] ` 将 wxapkg 文件解包,并将包中上述命令中所提的被编译/混合的文件自动地恢复原状。如果加上`-o`指令,表示仅解包,不做后续操作。如果加上`-d`指令,就会保留编译/混合后所生成的新文件,否则会自动删去这些文件。同时,前面命令中的指令也可直接加在这一命令上。而如果需要解压分包,请先解压主包,然后执行`node wuWxapkg.js [-d] -s=
`,其中`Main Dir`为主包解压地址。除`-d`与`-s`外,这些指令两两共存的后果是未定义的(当然,是不会有危险的)。 14 | 15 | ### wxapkg 包的获取 16 | 17 | Android 手机最近使用过的微信小程序所对应的 wxapkg 包文件都存储在特定文件夹下,可通过以下命令查看: 18 | 19 | adb pull /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg 20 | 21 | 其中`{User}` 为当前用户的用户名,类似于 `2bc**************b65`。 22 | 23 | ### 另注 24 | 25 | 所有命令上都可以使用`-f`指令来提高一定的并行度,但输出信息会混乱。 26 | 27 | 如果发现包内文件“缺失”,请先检查解包时是否出现提示`NOTICE: SubPackages exist in this package.`。如存在,请在寻找好分包后,按上文提示操作。(小程序需要访问特定页面;小游戏需要触发特定函数,然后分包才会被下载。) 28 | 29 | ### 局限(包括但可能不限于以下内容) 30 | 31 | - 实现中很多功能基于特定的版本(`wcc-v0.6vv_20180111_fbi`, 且不考虑面向低版本适配)和字符串搜索,所以不能很好的适应各种特殊情况。 32 | - wxml 文件拥有不同于 xml 和 html 文件的字符转义规则,且尚未公开(并非"没有"),因此未能很好的还原相关内容。 33 | - js 文件被压缩后会丢失原始变量名等信息内容无法还原;wxss 文件压缩后的注释也会丢失。 34 | - wxs 文件会将所有的变量如 Math 改为 nv_Math ,这里仅通过字符串替换去除。 35 | - 一些被引用 wxss 文件本身的源文件丢失,因此无法恢复原始目录。 36 | - 有些项目开启了难以复原的`es6转es5`选项,检验本项目结果是否正确时需要关闭项目中的`es6转es5`选项。 37 | - wxml 中一些无法找到相对应 的正向语句的内容无法还原。 38 | - json 中`components`项丢失,仅会标注被其他包引用的自定义组件。 39 | 40 | ## 依赖 41 | 42 | 这些 node.js 程序除了自带的 API 外还依赖于以下包: 43 | [cssbeautify](https://github.com/senchalabs/cssbeautify)、[CSSTree](https://github.com/csstree/csstree)、[VM2](https://github.com/patriksimek/vm2)、[Esprima](https://github.com/jquery/esprima)、[UglifyES](https://github.com/mishoo/UglifyJS2/tree/harmony)、[js-beautify](https://github.com/beautify-web/js-beautify) 44 | 45 | 您需要安装这些包才能正确执行这些程序,为了做到这一点,您可以执行`npm install`;另外如需全局安装这些包可执行以下命令: 46 | 47 | npm install esprima -g 48 | npm install css-tree -g 49 | npm install cssbeautify -g 50 | npm install vm2 -g 51 | npm install uglify-es -g 52 | npm install js-beautify -g 53 | npm install escodegen -g 54 | 55 | 此外,这些 node.js 程序之间也有一定的依赖关系,比如他们都依赖于 wuLib.js 。 56 | 57 | 58 | ## 参考 59 | 60 | 这些实现除了参考微信小程序开发文档、 wxapkg 文件解包后的内容以及通过开发者工具编译的一些 wxml 外,还参考了一些 github 上的相关内容的分析( [unwxapkg.py](https://gist.github.com/feix/32ab8f0dfe99aa8efa84f81ed68a0f3e)、[wechat-app-unpack](https://github.com/leo9960/wechat-app-unpack/) ),在此感谢他们。 61 | 62 | 另外,如果您对本程序的一些具体实现细节感兴趣,可以参考 [DETAILS.md](https://github.com/qwerty472123/wxappUnpacker/blob/master/DETAILS.md) 。 63 | -------------------------------------------------------------------------------- /nodejs/nodejs/node.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/nodejs/nodejs/node.exe -------------------------------------------------------------------------------- /nodejs/nodejs/node_etw_provider.man: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 13 | 14 | 15 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 54 | 55 | 64 | 65 | 69 | 70 | 74 | 75 | 87 | 88 | 89 | 90 | 96 | 102 | 108 | 114 | 120 | 126 | 132 | 138 | 145 | 151 | 157 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | -------------------------------------------------------------------------------- /nodejs/nodejs/node_modules.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/nodejs/nodejs/node_modules.zip -------------------------------------------------------------------------------- /nodejs/nodejs/node_perfctr_provider.man: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 12 | 18 | 19 | 26 | 27 | 34 | 35 | 42 | 43 | 50 | 51 | 58 | 59 | 67 | 68 | 76 | 77 | 84 | 85 | 93 | 94 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /nodejs/nodejs/nodevars.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem Ensure this Node.js and npm are first in the PATH 4 | set "PATH=%APPDATA%\npm;%~dp0;%PATH%" 5 | 6 | setlocal enabledelayedexpansion 7 | pushd "%~dp0" 8 | 9 | rem Figure out the Node.js version. 10 | set print_version=.\node.exe -p -e "process.versions.node + ' (' + process.arch + ')'" 11 | for /F "usebackq delims=" %%v in (`%print_version%`) do set version=%%v 12 | 13 | rem Print message. 14 | if exist npm.cmd ( 15 | echo Your environment has been set up for using Node.js !version! and npm. 16 | ) else ( 17 | echo Your environment has been set up for using Node.js !version!. 18 | ) 19 | 20 | popd 21 | endlocal 22 | 23 | rem If we're in the Node.js directory, change to the user's home dir. 24 | if "%CD%\"=="%~dp0" cd /d "%HOMEDRIVE%%HOMEPATH%" 25 | -------------------------------------------------------------------------------- /nodejs/nodejs/npm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | (set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix 3 | 4 | basedir=`dirname "$0"` 5 | 6 | case `uname` in 7 | *CYGWIN*) basedir=`cygpath -w "$basedir"`;; 8 | esac 9 | 10 | NODE_EXE="$basedir/node.exe" 11 | if ! [ -x "$NODE_EXE" ]; then 12 | NODE_EXE=node 13 | fi 14 | 15 | NPM_CLI_JS="$basedir/node_modules/npm/bin/npm-cli.js" 16 | 17 | case `uname` in 18 | *MINGW*) 19 | NPM_PREFIX=`"$NODE_EXE" "$NPM_CLI_JS" prefix -g` 20 | NPM_PREFIX_NPM_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npm-cli.js" 21 | if [ -f "$NPM_PREFIX_NPM_CLI_JS" ]; then 22 | NPM_CLI_JS="$NPM_PREFIX_NPM_CLI_JS" 23 | fi 24 | ;; 25 | *CYGWIN*) 26 | NPM_PREFIX=`"$NODE_EXE" "$NPM_CLI_JS" prefix -g` 27 | NPM_PREFIX_NPM_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npm-cli.js" 28 | if [ -f "$NPM_PREFIX_NPM_CLI_JS" ]; then 29 | NPM_CLI_JS="$NPM_PREFIX_NPM_CLI_JS" 30 | fi 31 | ;; 32 | esac 33 | 34 | "$NODE_EXE" "$NPM_CLI_JS" "$@" 35 | -------------------------------------------------------------------------------- /nodejs/nodejs/npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ 'D:\\Program Files\\nodejs\\node.exe', 3 | 1 verbose cli 'D:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', 4 | 1 verbose cli 'install', 5 | 1 verbose cli '-g', 6 | 1 verbose cli 'BrowserSync' ] 7 | 2 info using npm@1.4.9 8 | 3 info using node@v8.11.4 9 | 4 verbose readDependencies using package.json deps 10 | 5 verbose cache add [ 'BrowserSync', null ] 11 | 6 verbose cache add name=undefined spec="BrowserSync" args=["BrowserSync",null] 12 | 7 verbose parsed url Url { 13 | 7 verbose parsed url protocol: null, 14 | 7 verbose parsed url slashes: null, 15 | 7 verbose parsed url auth: null, 16 | 7 verbose parsed url host: null, 17 | 7 verbose parsed url port: null, 18 | 7 verbose parsed url hostname: null, 19 | 7 verbose parsed url hash: null, 20 | 7 verbose parsed url search: null, 21 | 7 verbose parsed url query: null, 22 | 7 verbose parsed url pathname: 'BrowserSync', 23 | 7 verbose parsed url path: 'BrowserSync', 24 | 7 verbose parsed url href: 'BrowserSync' } 25 | 8 silly lockFile 65e47d97-BrowserSync BrowserSync 26 | 9 verbose lock BrowserSync C:\Users\你大跌\AppData\Roaming\npm-cache\65e47d97-BrowserSync.lock 27 | 10 silly lockFile 65e47d97-BrowserSync BrowserSync 28 | 11 silly lockFile 65e47d97-BrowserSync BrowserSync 29 | 12 verbose addNamed [ 'BrowserSync', '' ] 30 | 13 verbose addNamed [ null, '*' ] 31 | 14 silly lockFile 879e9870-BrowserSync BrowserSync@ 32 | 15 verbose lock BrowserSync@ C:\Users\你大跌\AppData\Roaming\npm-cache\879e9870-BrowserSync.lock 33 | 16 silly addNameRange { name: 'BrowserSync', range: '*', hasData: false } 34 | 17 verbose url raw BrowserSync 35 | 18 verbose url resolving [ 'https://registry.npmjs.org/', './BrowserSync' ] 36 | 19 verbose url resolved https://registry.npmjs.org/BrowserSync 37 | 20 info trying registry request attempt 1 at 10:49:15 38 | 21 http GET https://registry.npmjs.org/BrowserSync 39 | 22 http 404 https://registry.npmjs.org/BrowserSync 40 | 23 verbose headers { date: 'Tue, 04 Sep 2018 02:49:14 GMT', 41 | 23 verbose headers 'content-type': 'application/json', 42 | 23 verbose headers 'content-length': '21', 43 | 23 verbose headers connection: 'close', 44 | 23 verbose headers 'set-cookie': 45 | 23 verbose headers [ '__cfduid=d65e0f5b499fee973d12f60769ef413e21536029353; expires=Wed, 04-Sep-19 02:49:13 GMT; path=/; domain=.registry.npmjs.org; HttpOnly' ], 46 | 23 verbose headers 'cf-cache-status': 'MISS', 47 | 23 verbose headers 'cache-control': 'max-age=300', 48 | 23 verbose headers 'cf-ray': '454d2444b85ab158-HKG', 49 | 23 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 50 | 23 verbose headers vary: 'accept-encoding, accept', 51 | 23 verbose headers server: 'cloudflare' } 52 | 24 silly registry.get cb [ 404, 53 | 24 silly registry.get { date: 'Tue, 04 Sep 2018 02:49:14 GMT', 54 | 24 silly registry.get 'content-type': 'application/json', 55 | 24 silly registry.get 'content-length': '21', 56 | 24 silly registry.get connection: 'close', 57 | 24 silly registry.get 'set-cookie': 58 | 24 silly registry.get [ '__cfduid=d65e0f5b499fee973d12f60769ef413e21536029353; expires=Wed, 04-Sep-19 02:49:13 GMT; path=/; domain=.registry.npmjs.org; HttpOnly' ], 59 | 24 silly registry.get 'cf-cache-status': 'MISS', 60 | 24 silly registry.get 'cache-control': 'max-age=300', 61 | 24 silly registry.get 'cf-ray': '454d2444b85ab158-HKG', 62 | 24 silly registry.get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 63 | 24 silly registry.get vary: 'accept-encoding, accept', 64 | 24 silly registry.get server: 'cloudflare' } ] 65 | 25 silly lockFile 879e9870-BrowserSync BrowserSync@ 66 | 26 silly lockFile 879e9870-BrowserSync BrowserSync@ 67 | 27 error Error: Not found : BrowserSync 68 | 27 error at RegClient. (D:\Program Files\nodejs\node_modules\npm\node_modules\npm-registry-client\lib\request.js:273:14) 69 | 27 error at Request._callback (D:\Program Files\nodejs\node_modules\npm\node_modules\npm-registry-client\lib\request.js:211:65) 70 | 27 error at Request.self.callback (D:\Program Files\nodejs\node_modules\npm\node_modules\request\request.js:123:22) 71 | 27 error at emitTwo (events.js:126:13) 72 | 27 error at Request.emit (events.js:214:7) 73 | 27 error at Request. (D:\Program Files\nodejs\node_modules\npm\node_modules\request\request.js:893:14) 74 | 27 error at emitOne (events.js:121:20) 75 | 27 error at Request.emit (events.js:211:7) 76 | 27 error at IncomingMessage. (D:\Program Files\nodejs\node_modules\npm\node_modules\request\request.js:844:12) 77 | 27 error at emitNone (events.js:111:20) 78 | 28 error If you need help, you may report this *entire* log, 79 | 28 error including the npm and node versions, at: 80 | 28 error 81 | 29 error System Windows_NT 10.0.17134 82 | 30 error command "D:\\Program Files\\nodejs\\node.exe" "D:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "-g" "BrowserSync" 83 | 31 error cwd D:\腾讯游戏\node-v8.11.4-win-x64\node-v8.11.4-win-x64 84 | 32 error node -v v8.11.4 85 | 33 error npm -v 1.4.9 86 | 34 verbose exit [ 1, true ] 87 | -------------------------------------------------------------------------------- /nodejs/nodejs/npm.cmd: -------------------------------------------------------------------------------- 1 | :: Created by npm, please don't edit manually. 2 | @ECHO OFF 3 | 4 | SETLOCAL 5 | 6 | SET "NODE_EXE=%~dp0\node.exe" 7 | IF NOT EXIST "%NODE_EXE%" ( 8 | SET "NODE_EXE=node" 9 | ) 10 | 11 | SET "NPM_CLI_JS=%~dp0\node_modules\npm\bin\npm-cli.js" 12 | FOR /F "delims=" %%F IN ('CALL "%NODE_EXE%" "%NPM_CLI_JS%" prefix -g') DO ( 13 | SET "NPM_PREFIX_NPM_CLI_JS=%%F\node_modules\npm\bin\npm-cli.js" 14 | ) 15 | IF EXIST "%NPM_PREFIX_NPM_CLI_JS%" ( 16 | SET "NPM_CLI_JS=%NPM_PREFIX_NPM_CLI_JS%" 17 | ) 18 | 19 | "%NODE_EXE%" "%NPM_CLI_JS%" %* 20 | -------------------------------------------------------------------------------- /nodejs/nodejs/npx: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | (set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix 3 | 4 | basedir=`dirname "$0"` 5 | 6 | case `uname` in 7 | *CYGWIN*) basedir=`cygpath -w "$basedir"`;; 8 | esac 9 | 10 | NODE_EXE="$basedir/node.exe" 11 | if ! [ -x "$NODE_EXE" ]; then 12 | NODE_EXE=node 13 | fi 14 | 15 | NPX_CLI_JS="$basedir/node_modules/npm/bin/npx-cli.js" 16 | 17 | case `uname` in 18 | *MINGW*) 19 | NPM_PREFIX=`"$NODE_EXE" "$NPX_CLI_JS" prefix -g` 20 | NPM_PREFIX_NPX_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npx-cli.js" 21 | if [ -f "$NPM_PREFIX_NPX_CLI_JS" ]; then 22 | NPX_CLI_JS="$NPM_PREFIX_NPX_CLI_JS" 23 | fi 24 | ;; 25 | *CYGWIN*) 26 | NPM_PREFIX=`"$NODE_EXE" "$NPX_CLI_JS" prefix -g` 27 | NPM_PREFIX_NPX_CLI_JS="$NPM_PREFIX/node_modules/npm/bin/npx-cli.js" 28 | if [ -f "$NPM_PREFIX_NPX_CLI_JS" ]; then 29 | NPX_CLI_JS="$NPM_PREFIX_NPX_CLI_JS" 30 | fi 31 | ;; 32 | esac 33 | 34 | "$NODE_EXE" "$NPX_CLI_JS" "$@" 35 | -------------------------------------------------------------------------------- /nodejs/nodejs/npx.cmd: -------------------------------------------------------------------------------- 1 | :: Created by npm, please don't edit manually. 2 | @ECHO OFF 3 | 4 | SETLOCAL 5 | 6 | SET "NODE_EXE=%~dp0\node.exe" 7 | IF NOT EXIST "%NODE_EXE%" ( 8 | SET "NODE_EXE=node" 9 | ) 10 | 11 | SET "NPX_CLI_JS=%~dp0\node_modules\npm\bin\npx-cli.js" 12 | FOR /F "delims=" %%F IN ('CALL "%NODE_EXE%" "%NPX_CLI_JS%" prefix -g') DO ( 13 | SET "NPM_PREFIX_NPX_CLI_JS=%%F\node_modules\npm\bin\npx-cli.js" 14 | ) 15 | IF EXIST "%NPM_PREFIX_NPX_CLI_JS%" ( 16 | SET "NPX_CLI_JS=%NPM_PREFIX_NPX_CLI_JS%" 17 | ) 18 | 19 | "%NODE_EXE%" "%NPX_CLI_JS%" %* 20 | -------------------------------------------------------------------------------- /nodejs/nodejs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wxapp-unpacker", 3 | "version": "0.2.3", 4 | "description": "Wechat App(微信小程序, .wxapkg)解包及相关文件(.wxss, .json, .wxs, .wxml)还原工具", 5 | "main": "wuWxapkg.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/qwerty472123/wxappUnpacker.git" 9 | }, 10 | "author": "qwerty472123", 11 | "license": "GPL-3.0-or-later", 12 | "bugs": { 13 | "url": "https://github.com/qwerty472123/wxappUnpacker/issues" 14 | }, 15 | "homepage": "https://github.com/qwerty472123/wxappUnpacker#readme", 16 | "dependencies": { 17 | "css-tree": "^1.0.0-alpha.28", 18 | "cssbeautify": "^0.3.1", 19 | "escodegen": "^1.11.0", 20 | "esprima": "^4.0.0", 21 | "js-beautify": "^1.7.5", 22 | "uglify-es": "^3.3.9", 23 | "vm2": "^3.6.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuConfig.js: -------------------------------------------------------------------------------- 1 | const wu=require("./wuLib.js"); 2 | const fs=require("fs"); 3 | const path=require("path"); 4 | const crypto=require("crypto"); 5 | const {VM}=require('vm2'); 6 | function getWorkerPath(name){ 7 | let code=fs.readFileSync(name,{encoding:'utf8'}); 8 | let commPath=false; 9 | let vm=new VM({sandbox:{ 10 | require(){}, 11 | define(name){ 12 | name=path.dirname(name)+'/'; 13 | if(commPath===false)commPath=name; 14 | commPath=wu.commonDir(commPath,name); 15 | } 16 | }}); 17 | vm.run(code.slice(code.indexOf("define("))); 18 | if(commPath.length>0)commPath=commPath.slice(0,-1); 19 | console.log("Worker path: \""+commPath+"\""); 20 | return commPath; 21 | } 22 | function doConfig(configFile,cb){ 23 | let dir=path.dirname(configFile); 24 | wu.get(configFile,content=>{ 25 | let e=JSON.parse(content); 26 | let k=e.pages; 27 | k.splice(k.indexOf(wu.changeExt(e.entryPagePath)),1); 28 | k.unshift(wu.changeExt(e.entryPagePath)); 29 | let app={pages:k,window:e.global&&e.global.window,tabBar:e.tabBar,networkTimeout:e.networkTimeout}; 30 | if(e.subPackages){ 31 | app.subPackages=e.subPackages; 32 | console.log("=======================================================\nNOTICE: SubPackages exist in this package.\nDetails: ",app.subPackages,"\n======================================================="); 33 | } 34 | if(e.navigateToMiniProgramAppIdList)app.navigateToMiniProgramAppIdList=e.navigateToMiniProgramAppIdList; 35 | if(fs.existsSync(path.resolve(dir,"workers.js")))app.workers=getWorkerPath(path.resolve(dir,"workers.js")); 36 | if(e.extAppid) 37 | wu.save(path.resolve(dir,'ext.json'),JSON.stringify({extEnable:true,extAppid:e.extAppid,ext:e.ext},null,4)); 38 | if(typeof e.debug!="undefined")app.debug=e.debug; 39 | let cur=path.resolve("./file"); 40 | for(let a in e.page)if(e.page[a].window.usingComponents) 41 | for(let name in e.page[a].window.usingComponents){ 42 | let componentPath=e.page[a].window.usingComponents[name]+".html"; 43 | let file=componentPath.startsWith('/')?componentPath.slice(1):wu.toDir(path.resolve(path.dirname(a),componentPath),cur); 44 | if(!e.page[file])e.page[file]={}; 45 | if(!e.page[file].window)e.page[file].window={}; 46 | e.page[file].window.component=true; 47 | } 48 | if(fs.existsSync(path.resolve(dir,"app-service.js"))){ 49 | let matches=fs.readFileSync(path.resolve(dir,"app-service.js"),{encoding:'utf8'}).match(/\_\_wxAppCode\_\_\['[^\.]+\.json[^;]+\;/g); 50 | if(matches){ 51 | let attachInfo={}; 52 | (new VM({sandbox:{ 53 | __wxAppCode__:attachInfo 54 | }})).run(matches.join("")); 55 | for(let name in attachInfo)e.page[wu.changeExt(name,".html")]={window:attachInfo[name]}; 56 | } 57 | } 58 | let delWeight=8; 59 | for(let a in e.page){ 60 | let fileName=path.resolve(dir,wu.changeExt(a,".json")); 61 | wu.save(fileName,JSON.stringify(e.page[a].window,null,4)); 62 | if(configFile==fileName)delWeight=0; 63 | } 64 | if(app.tabBar&&app.tabBar.list) wu.scanDirByExt(dir,"",li=>{//search all files 65 | let digests=[],digestsEvent=new wu.CntEvent,rdir=path.resolve(dir); 66 | function fixDir(dir){return dir.startsWith(rdir)?dir.slice(rdir.length+1):dir;} 67 | digestsEvent.add(()=>{ 68 | for(let e of app.tabBar.list){ 69 | e.pagePath=wu.changeExt(e.pagePath); 70 | if(e.iconData){ 71 | let hash=crypto.createHash("MD5").update(e.iconData,'base64').digest(); 72 | for(let [buf,name] of digests)if(hash.equals(buf)){ 73 | delete e.iconData; 74 | e.iconPath=fixDir(name).replace(/\\/g,'/'); 75 | break; 76 | } 77 | } 78 | if(e.selectedIconData){ 79 | let hash=crypto.createHash("MD5").update(e.selectedIconData,'base64').digest(); 80 | for(let [buf,name] of digests)if(hash.equals(buf)){ 81 | delete e.selectedIconData; 82 | e.selectedIconPath=fixDir(name).replace(/\\/g,'/'); 83 | break; 84 | } 85 | } 86 | } 87 | wu.save(path.resolve(dir,'app.json'),JSON.stringify(app,null,4)); 88 | cb({[configFile]:delWeight}); 89 | }); 90 | for(let name of li){ 91 | digestsEvent.encount(); 92 | wu.get(name,data=>{ 93 | digests.push([crypto.createHash("MD5").update(data).digest(),name]); 94 | digestsEvent.decount(); 95 | },{}); 96 | } 97 | });else{ 98 | wu.save(path.resolve(dir,'app.json'),JSON.stringify(app,null,4)); 99 | cb({[configFile]:delWeight}); 100 | } 101 | }); 102 | } 103 | module.exports={doConfig:doConfig}; 104 | if(require.main===module){ 105 | wu.commandExecute(doConfig,"Split and make up weapp app-config.json file.\n\n\n\n app-config.json files to split and make up."); 106 | } 107 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuJs.js: -------------------------------------------------------------------------------- 1 | const wu=require("./wuLib.js"); 2 | const path=require("path"); 3 | const UglifyJS=require("uglify-es"); 4 | const {js_beautify}=require("js-beautify"); 5 | const {VM}=require('vm2'); 6 | function jsBeautify(code){ 7 | return UglifyJS.minify(code,{mangle:false,compress:false,output:{beautify:true,comments:true}}).code; 8 | } 9 | function splitJs(name,cb){ 10 | let dir=path.dirname(name); 11 | wu.get(name,code=>{ 12 | let needDelList={}; 13 | let vm=new VM({sandbox:{ 14 | require(){}, 15 | define(name,func){ 16 | let code=func.toString(); 17 | code=code.slice(code.indexOf("{")+1,code.lastIndexOf("}")-1).trim(); 18 | let bcode=code; 19 | if(code.startsWith('"use strict";')||code.startsWith("'use strict';"))code=code.slice(13); 20 | else if((code.startsWith('(function(){"use strict";')||code.startsWith("(function(){'use strict';"))&&code.endsWith("})();"))code=code.slice(25,-5); 21 | let res=jsBeautify(code); 22 | if(typeof res=="undefined"){ 23 | console.log("Fail to delete 'use strict' in \""+name+"\"."); 24 | res=jsBeautify(bcode); 25 | } 26 | needDelList[path.resolve(dir,name)]=-8; 27 | wu.save(path.resolve(dir,name),jsBeautify(res)); 28 | } 29 | }}); 30 | vm.run(code.slice(code.indexOf("define("))); 31 | console.log("Splitting \""+name+"\" done."); 32 | if(!needDelList[name])needDelList[name]=8; 33 | cb(needDelList); 34 | }); 35 | } 36 | module.exports={jsBeautify:jsBeautify,wxsBeautify:js_beautify,splitJs:splitJs}; 37 | if(require.main===module){ 38 | wu.commandExecute(splitJs,"Split and beautify weapp js file.\n\n\n\n js files to split and beautify."); 39 | } 40 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuLib.js: -------------------------------------------------------------------------------- 1 | const fs=require("fs"); 2 | const path=require("path"); 3 | class CntEvent{ 4 | constructor(){ 5 | this.cnt=0; 6 | this.emptyEvent=[]; 7 | this.encount=this.encount.bind(this); 8 | this.decount=this.decount.bind(this); 9 | this.add=this.add.bind(this); 10 | } 11 | encount(delta=1){ 12 | this.cnt+=delta; 13 | } 14 | decount(){ 15 | if(this.cnt>0)--this.cnt; 16 | if(this.cnt==0){ 17 | for(let info of this.emptyEvent)info[0](...info[1]); 18 | this.emptyEvent=[]; 19 | } 20 | } 21 | add(cb,...attach){ 22 | this.emptyEvent.push([cb,attach]); 23 | } 24 | check(cb,...attach){ 25 | if(this.cnt==0)cb(...attach); 26 | else this.add(cb,...attach); 27 | } 28 | } 29 | class LimitedRunner{ 30 | constructor(limit){ 31 | this.limit=limit; 32 | this.cnt=0; 33 | this.funcs=[]; 34 | } 35 | run(func){ 36 | if(this.cnt0)this.cnt--; 45 | if(this.funcs.length>0){ 46 | this.cnt++; 47 | setTimeout(this.funcs.shift(),0); 48 | } 49 | } 50 | runWithCb(func,...args){ 51 | let cb=args.pop(),self=this; 52 | function agent(...args){ 53 | self.done(); 54 | return cb.apply(this,args); 55 | } 56 | args.push(agent); 57 | this.run(()=>func(...args)); 58 | } 59 | } 60 | let ioEvent=new CntEvent; 61 | let ioLimit=new LimitedRunner(4096); 62 | function mkdirs(dir,cb){ 63 | ioLimit.runWithCb(fs.stat.bind(fs),dir,(err,stats)=>{ 64 | if(err)mkdirs(path.dirname(dir),()=>fs.mkdir(dir,cb)); 65 | else if(stats.isFile())throw Error(dir+" was created as a file, so we cannot put file into it."); 66 | else cb(); 67 | }); 68 | } 69 | function save(name,content){ 70 | ioEvent.encount(); 71 | mkdirs(path.dirname(name),()=>ioLimit.runWithCb(fs.writeFile.bind(fs),name,content,err=>{ 72 | if(err)throw Error("Save file error: "+err); 73 | ioEvent.decount(); 74 | })); 75 | } 76 | function get(name,cb,opt={encoding:'utf8'}){ 77 | ioEvent.encount(); 78 | ioLimit.runWithCb(fs.readFile.bind(fs),name,opt,(err,data)=>{ 79 | if(err)throw Error("Read file error: "+err); 80 | else cb(data); 81 | ioEvent.decount(); 82 | }); 83 | } 84 | function del(name){ 85 | ioEvent.encount(); 86 | ioLimit.runWithCb(fs.unlink.bind(fs),name,ioEvent.decount); 87 | } 88 | function changeExt(name,ext=""){ 89 | return name.slice(0,name.lastIndexOf("."))+ext; 90 | } 91 | function scanDirByExt(dir,ext,cb){ 92 | let result=[],scanEvent=new CntEvent; 93 | function helper(dir){ 94 | scanEvent.encount(); 95 | ioLimit.runWithCb(fs.readdir.bind(fs),dir,(err,files)=>{ 96 | if(err)throw Error("Scan dir error: "+err); 97 | for(let file of files){ 98 | scanEvent.encount(); 99 | let name=path.resolve(dir,file); 100 | fs.stat(name,(err,stats)=>{ 101 | if(err)throw Error("Scan dir error: "+err); 102 | if(stats.isDirectory())helper(name); 103 | else if(stats.isFile()&&name.endsWith(ext))result.push(name); 104 | scanEvent.decount(); 105 | }); 106 | } 107 | scanEvent.decount(); 108 | }); 109 | } 110 | scanEvent.add(cb,result); 111 | helper(dir,ext,scanEvent); 112 | } 113 | function toDir(to,from){//get relative path without posix/win32 problem 114 | if(from[0]==".")from=from.slice(1); 115 | if(to[0]==".")to=to.slice(1); 116 | from=from.replace(/\\/g,'/');to=to.replace(/\\/g,'/'); 117 | let a=Math.min(to.length,from.length); 118 | for(let i=1,m=Math.min(to.length,from.length);i<=m;i++)if(!to.startsWith(from.slice(0,i))){a=i-1;break;} 119 | let pub=from.slice(0,a); 120 | let len=pub.lastIndexOf("/")+1; 121 | let k=from.slice(len); 122 | let ret=""; 123 | for(let i=0;iconsole.timeEnd("Total use")); 140 | } 141 | let orders=[]; 142 | for(let order of process.argv)if(order.startsWith("-"))orders.push(order.slice(1)); 143 | let iter=process.argv[Symbol.iterator](),nxt=iter.next(),called=false,faster=orders.includes("f"),fastCnt; 144 | if(faster){ 145 | fastCnt=new CntEvent; 146 | fastCnt.add(endTime); 147 | } 148 | function doNext(){ 149 | let nxt=iter.next(); 150 | while(!nxt.done&&nxt.value.startsWith("-"))nxt=iter.next(); 151 | if(nxt.done){ 152 | if(!called)console.log("Command Line Helper:\n\n"+helper); 153 | else if(!faster)endTime(); 154 | }else{ 155 | called=true; 156 | if(faster)fastCnt.encount(),cb(nxt.value,fastCnt.decount,orders),doNext(); 157 | else cb(nxt.value,doNext,orders); 158 | } 159 | } 160 | while(!nxt.done&&!nxt.value.endsWith(".js"))nxt=iter.next(); 161 | doNext(); 162 | } 163 | module.exports={mkdirs:mkdirs,get:get,save:save,toDir:toDir,del:del,addIO:ioEvent.add, 164 | changeExt:changeExt,CntEvent:CntEvent,scanDirByExt:scanDirByExt,commonDir:commonDir, 165 | commandExecute:commandExecute}; 166 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuRestoreZ.js: -------------------------------------------------------------------------------- 1 | const wu=require("./wuLib.js"); 2 | const {VM}=require('vm2'); 3 | function catchZGroup(code,groupPreStr,cb){ 4 | const debugPre="(function(z){var a=11;function Z(ops,debugLine){"; 5 | let zArr={}; 6 | for(let preStr of groupPreStr){ 7 | let content=code.slice(code.indexOf(preStr)),z=[]; 8 | content=content.slice(content.indexOf("(function(z){var a=11;")); 9 | content=content.slice(0,content.indexOf("})(__WXML_GLOBAL__.ops_cached.$gwx"))+"})(z);"; 10 | let vm=new VM({sandbox:{z:z,debugInfo:[]}}); 11 | vm.run(content); 12 | if(content.startsWith(debugPre))for(let i=0;i=":11,"<=":11,">":11,"<":11,"<<":12,">>":12, 98 | "-":len==3?13:16 99 | }; 100 | return priorList[op]?priorList[op]:0; 101 | } 102 | function getOp(i){ 103 | let ret=restoreNext(ops[i],true); 104 | if(ops[i] instanceof Object&&typeof ops[i][0]=="object"&&ops[i][0][0]==2){ 105 | //Add brackets if we need 106 | if(getPrior(op[1],ops.length)>getPrior(ops[i][0][1],ops[i].length))ret=enBrace(ret,'(');; 107 | } 108 | return ret; 109 | } 110 | switch(op[1]){ 111 | case"?:": 112 | ans=getOp(1)+"?"+getOp(2)+":"+getOp(3); 113 | break; 114 | case "!": 115 | case "~": 116 | ans=op[1]+getOp(1); 117 | break; 118 | case"-": 119 | if(ops.length!=3){ 120 | ans=op[1]+getOp(1); 121 | break; 122 | }//shoud not add more in there![fall through] 123 | default: 124 | ans=getOp(1)+op[1]+getOp(2); 125 | } 126 | break; 127 | } 128 | case 4://unkown-arrayStart? 129 | ans=restoreNext(ops[1],true); 130 | break; 131 | case 5://merge-array 132 | { 133 | switch (ops.length) { 134 | case 2: 135 | ans=enBrace(restoreNext(ops[1],true),'['); 136 | break; 137 | case 1: 138 | ans='[]'; 139 | break; 140 | default: 141 | { 142 | let a=restoreNext(ops[1],true); 143 | //console.log(a,a.startsWith('[')&&a.endsWith(']')); 144 | if(a.startsWith('[')&&a.endsWith(']')){ 145 | if(a!='[]'){ 146 | ans=enBrace(a.slice(1,-1).trim()+','+restoreNext(ops[2],true),'['); 147 | //console.log('-',a); 148 | }else{ 149 | ans=enBrace(restoreNext(ops[2],true),'['); 150 | } 151 | }else{ 152 | ans=enBrace('...'+a+','+restoreNext(ops[2],true),'[');//may/must not support in fact 153 | } 154 | } 155 | } 156 | break; 157 | } 158 | case 6://get value of an object 159 | { 160 | let sonName=restoreNext(ops[2],true); 161 | if(sonName._type==="var") 162 | ans=restoreNext(ops[1],true)+enBrace(sonName,'['); 163 | else{ 164 | let attach=""; 165 | if(/^[A-Za-z\_][A-Za-z\d\_]*$/.test(sonName)/*is a qualified id*/) 166 | attach='.'+sonName; 167 | else attach=enBrace(sonName,'['); 168 | ans=restoreNext(ops[1],true)+attach; 169 | } 170 | break; 171 | } 172 | case 7://get value of str 173 | { 174 | switch(ops[1][0]){ 175 | case 11: 176 | ans=enBrace("__unTestedGetValue:"+enBrace(jsoToWxon(ops),'['),'{'); 177 | break; 178 | case 3: 179 | ans=new String(ops[1][1]); 180 | ans._type="var"; 181 | break; 182 | default: 183 | throw Error("Unknown type to get value"); 184 | } 185 | break; 186 | } 187 | case 8://first object 188 | ans=enBrace(ops[1]+':'+restoreNext(ops[2],true),'{');//ops[1] have only this way to define 189 | break; 190 | case 9://object 191 | { 192 | function type(x){ 193 | if(x.startsWith('...'))return 1; 194 | if(x.startsWith('{')&&x.endsWith('}'))return 0; 195 | return 2; 196 | } 197 | let a=restoreNext(ops[1],true); 198 | let b=restoreNext(ops[2],true); 199 | let xa=type(a),xb=type(b); 200 | if(xa==2||xb==2)ans=enBrace("__unkownMerge:"+enBrace(a+","+b,'['),'{'); 201 | else{ 202 | if(!xa)a=a.slice(1,-1).trim(); 203 | if(!xb)b=b.slice(1,-1).trim(); 204 | //console.log(l,r); 205 | ans=enBrace(a+','+b,'{'); 206 | } 207 | break; 208 | } 209 | case 10://...object 210 | ans='...'+restoreNext(ops[1],true); 211 | break; 212 | case 12: 213 | { 214 | let arr=restoreNext(ops[2],true); 215 | if(arr.startsWith('[')&&arr.endsWith(']')) 216 | ans=restoreNext(ops[1],true)+enBrace(arr.slice(1,-1).trim(),'('); 217 | else ans=restoreNext(ops[1],true)+'.apply'+enBrace('null,'+arr,'('); 218 | break; 219 | } 220 | default: 221 | ans=enBrace("__unkownSpecific:"+jsoToWxon(ops),'{'); 222 | } 223 | return scope(ans); 224 | } 225 | } 226 | function restoreGroup(z){ 227 | let ans=[]; 228 | for(let g in z.mul){ 229 | let singleAns=[]; 230 | for(let e of z.mul[g])singleAns.push(restoreSingle(e,false)); 231 | ans[g]=singleAns; 232 | } 233 | let ret=[];//Keep a null array for remaining global Z array. 234 | ret.mul=ans; 235 | return ret; 236 | } 237 | function restoreAll(z){ 238 | if(z.mul)return restoreGroup(z); 239 | let ans=[]; 240 | for(let e of z)ans.push(restoreSingle(e,false)); 241 | return ans; 242 | } 243 | module.exports={getZ(code,cb){ 244 | catchZ(code,z=>cb(restoreAll(z))); 245 | }}; 246 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuWxapkg.js: -------------------------------------------------------------------------------- 1 | const wu=require("./wuLib.js"); 2 | const wuJs=require("./wuJs.js"); 3 | const wuCfg=require("./wuConfig.js"); 4 | const wuMl=require("./wuWxml.js"); 5 | const wuSs=require("./wuWxss.js"); 6 | const path=require("path"); 7 | const fs=require("fs"); 8 | function header(buf){ 9 | console.log("\nHeader info:"); 10 | let firstMark=buf.readUInt8(0); 11 | console.log(" firstMark: 0x%s",firstMark.toString(16)); 12 | let unknownInfo=buf.readUInt32BE(1); 13 | console.log(" unknownInfo: ",unknownInfo); 14 | let infoListLength=buf.readUInt32BE(5); 15 | console.log(" infoListLength: ",infoListLength); 16 | let dataLength=buf.readUInt32BE(9); 17 | console.log(" dataLength: ",dataLength); 18 | let lastMark=buf.readUInt8(13); 19 | console.log(" lastMark: 0x%s",lastMark.toString(16)); 20 | if(firstMark!=0xbe||lastMark!=0xed)throw Error("Magic number is not correct!"); 21 | return [infoListLength,dataLength]; 22 | } 23 | function genList(buf){ 24 | console.log("\nFile list info:"); 25 | let fileCount=buf.readUInt32BE(0); 26 | console.log(" fileCount: ",fileCount); 27 | let fileInfo=[],off=4; 28 | for(let i=0;i{ 53 | wu.addIO(()=>{ 54 | console.log("Split and make up done."); 55 | if(!order.includes("d")){ 56 | console.log("Delete files..."); 57 | wu.addIO(()=>console.log("Deleted.\n\nFile done.")); 58 | for(let name in needDelete)if(needDelete[name]>=8)wu.del(name); 59 | } 60 | cb(); 61 | }); 62 | }); 63 | function doBack(deletable){ 64 | for(let key in deletable){ 65 | if(!needDelete[key])needDelete[key]=0; 66 | needDelete[key]+=deletable[key];//all file have score bigger than 8 will be delete. 67 | } 68 | weappEvent.decount(); 69 | } 70 | //This will be the only func running this time, so async is needless. 71 | if(fs.existsSync(path.resolve(dir,"app-service.js"))){//weapp 72 | console.log("Split app-service.js and make up configs & wxss & wxml & wxs..."); 73 | wuCfg.doConfig(path.resolve(dir,"app-config.json"),doBack); 74 | wuJs.splitJs(path.resolve(dir,"app-service.js"),doBack); 75 | if(fs.existsSync(path.resolve(dir,"workers.js"))) 76 | wuJs.splitJs(path.resolve(dir,"workers.js"),doBack); 77 | if(fs.existsSync(path.resolve(dir,"page-frame.html"))) 78 | wuMl.doFrame(path.resolve(dir,"page-frame.html"),doBack,order); 79 | else if(fs.existsSync(path.resolve(dir,"app-wxss.js"))) { 80 | wuMl.doFrame(path.resolve(dir,"app-wxss.js"),doBack,order); 81 | if(!needDelete[path.resolve(dir,"page-frame.js")])needDelete[path.resolve(dir,"page-frame.js")]=8; 82 | } else throw Error("page-frame-like file is not found in the package by auto."); 83 | wuSs.doWxss(dir,doBack);//Force it run at last, becuase lots of error occured in this part 84 | }else if(fs.existsSync(path.resolve(dir,"game.js"))){//wegame 85 | console.log("Split game.js and rewrite game.json..."); 86 | let gameCfg=path.resolve(dir,"app-config.json"); 87 | wu.get(gameCfg,cfgPlain=>{ 88 | let cfg=JSON.parse(cfgPlain); 89 | if(cfg.subContext){ 90 | console.log("Found subContext, splitting it...") 91 | delete cfg.subContext; 92 | let contextPath=path.resolve(dir,"subContext.js"); 93 | wuJs.splitJs(contextPath,()=>wu.del(contextPath)); 94 | } 95 | wu.save(path.resolve(dir,"game.json"),JSON.stringify(cfg,null,4)); 96 | wu.del(gameCfg); 97 | }); 98 | wuJs.splitJs(path.resolve(dir,"game.js"),()=>{ 99 | wu.addIO(()=>{ 100 | console.log("Split and rewrite done."); 101 | cb(); 102 | }); 103 | }); 104 | }else throw Error("This package is unrecognizable.\nMay be this package is a subPackage which should be unpacked with -s=.\nOtherwise, please decrypted every type of file by hand.") 105 | } 106 | function doFile(name,cb,order){ 107 | for(let ord of order)if(ord.startsWith("s="))global.subPack=ord.slice(3); 108 | console.log("Unpack file "+name+"..."); 109 | let dir=path.resolve(name,"..",path.basename(name,".wxapkg")); 110 | wu.get(name,buf=>{ 111 | let [infoListLength,dataLength]=header(buf.slice(0,14)); 112 | if(order.includes("o"))wu.addIO(console.log.bind(console),"Unpack done."); 113 | else wu.addIO(packDone,dir,cb,order); 114 | saveFile(dir,buf,genList(buf.slice(14,infoListLength+14))); 115 | },{}); 116 | } 117 | module.exports={doFile:doFile}; 118 | if(require.main===module){ 119 | wu.commandExecute(doFile,"Unpack a wxapkg file.\n\n[-o] [-d] [-s=
] \n\n-d Do not delete transformed unpacked files.\n-o Do not execute any operation after unpack.\n-s=
Regard all packages provided as subPackages and\n regard
as the directory of sources of the main package.\n wxapkg files to unpack"); 120 | } 121 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuWxml.js: -------------------------------------------------------------------------------- 1 | const wu=require("./wuLib.js"); 2 | const {getZ}=require("./wuRestoreZ.js"); 3 | const {wxsBeautify}=require("./wuJs.js"); 4 | const fs=require('fs'); 5 | const path=require("path"); 6 | const esprima=require('esprima'); 7 | const {VM}=require('vm2'); 8 | const escodegen=require('escodegen'); 9 | function analyze(core,z,namePool,xPool,fakePool={},zMulName="0"){ 10 | function anaRecursion(core,fakePool={}){ 11 | return analyze(core,z,namePool,xPool,fakePool,zMulName); 12 | } 13 | function push(name,elem){ 14 | namePool[name]=elem; 15 | } 16 | function pushSon(pname,son){ 17 | if(fakePool[pname])fakePool[pname].son.push(son); 18 | else namePool[pname].son.push(son); 19 | } 20 | for(let ei=0;ei0) 116 | throw Error("Noticable generics content: "+dec.init.arguments[2].toString()); 117 | let mv={}; 118 | let name=null,base=0; 119 | for(let x of dec.init.arguments[1].elements){ 120 | let v=x.value; 121 | if(!v&&typeof v!="number"){ 122 | if(x.type=="UnaryExpression"&&x.operator=="-")v=-x.argument.value; 123 | else throw Error("Unknown type of object in _m attrs array: "+x.type); 124 | } 125 | if(name===null){ 126 | name=v; 127 | }else{ 128 | if(base+v<0)mv[name]=null;else{ 129 | mv[name]=z[base+v]; 130 | if(base==0)base=v; 131 | } 132 | name=null; 133 | } 134 | } 135 | push(dec.id.name,{tag:dec.init.arguments[0].value,son:[],v:mv}); 136 | } 137 | break; 138 | case "_mz": 139 | { 140 | if(dec.init.arguments[3].elements.length>0) 141 | throw Error("Noticable generics content: "+dec.init.arguments[3].toString()); 142 | let mv={}; 143 | let name=null,base=0; 144 | for(let x of dec.init.arguments[2].elements){ 145 | let v=x.value; 146 | if(!v&&typeof v!="number"){ 147 | if(x.type=="UnaryExpression"&&x.operator=="-")v=-x.argument.value; 148 | else throw Error("Unknown type of object in _mz attrs array: "+x.type); 149 | } 150 | if(name===null){ 151 | name=v; 152 | }else{ 153 | if(base+v<0)mv[name]=null;else{ 154 | mv[name]=z.mul[zMulName][base+v]; 155 | if(base==0)base=v; 156 | } 157 | name=null; 158 | } 159 | } 160 | push(dec.id.name,{tag:dec.init.arguments[1].value,son:[],v:mv}); 161 | } 162 | break; 163 | case "_gd"://template use/is 164 | { 165 | let is=namePool[dec.init.arguments[1].name].content; 166 | let data=null,obj=null; 167 | ei++; 168 | for(let e of core[ei].consequent.body){ 169 | if(e.type=="VariableDeclaration"){ 170 | for(let f of e.declarations){ 171 | if(f.init.type=="LogicalExpression"&&f.init.left.type=="CallExpression"){ 172 | if(f.init.left.callee.name=="_1")data=z[f.init.left.arguments[0].value]; 173 | else if(f.init.left.callee.name=="_1z")data=z.mul[zMulName][f.init.left.arguments[1].value]; 174 | } 175 | } 176 | }else if(e.type=="ExpressionStatement"){ 177 | let f=e.expression; 178 | if(f.type=="AssignmentExpression"&&f.operator=="="&&f.left.property&&f.left.property.name=="wxXCkey"){ 179 | obj=f.left.object.name; 180 | } 181 | } 182 | } 183 | namePool[obj].tag="template"; 184 | Object.assign(namePool[obj].v,{is:is,data:data}); 185 | } 186 | break; 187 | default: 188 | { 189 | let funName=dec.init.callee.name; 190 | if(funName.startsWith("gz$gwx")){ 191 | zMulName=funName.slice(6); 192 | }else throw Error("Unknown init callee "+funName); 193 | } 194 | } 195 | }else if(dec.init.type=="FunctionExpression"){ 196 | push(dec.id.name,{tag:"gen",func:dec.init}); 197 | }else if(dec.init.type=="MemberExpression"){ 198 | if(dec.init.object.type=="MemberExpression"&&dec.init.object.object.name=="e_"&&dec.init.object.property.type=="MemberExpression"&&dec.init.object.property.object.name=="x"){ 199 | if(dec.init.property.name=="j"){//include 200 | //do nothing 201 | }else if(dec.init.property.name=="i"){//import 202 | //do nothing 203 | }else throw Error("Unknown member expression declaration."); 204 | }else throw Error("Unknown member expression declaration."); 205 | }else throw Error("Unknown declaration init type " + dec.init.type); 206 | } 207 | break; 208 | case "IfStatement": 209 | if(e.test.callee.name.startsWith("_o")){ 210 | function parse_OFun(e){ 211 | if(e.test.callee.name=="_o")return z[e.test.arguments[0].value]; 212 | else if(e.test.callee.name=="_oz")return z.mul[zMulName][e.test.arguments[1].value]; 213 | else throw Error("Unknown if statement test callee name:"+e.test.callee.name); 214 | } 215 | let vname=e.consequent.body[0].expression.left.object.name; 216 | let nif={tag:"block",v:{"wx:if":parse_OFun(e)},son:[]}; 217 | anaRecursion(e.consequent.body,{[vname]:nif}); 218 | pushSon(vname,nif); 219 | if(e.alternate){ 220 | while(e.alternate&&e.alternate.type=="IfStatement"){ 221 | e=e.alternate; 222 | nif={tag:"block",v:{"wx:elif":parse_OFun(e)},son:[]}; 223 | anaRecursion(e.consequent.body,{[vname]:nif}); 224 | pushSon(vname,nif); 225 | } 226 | if(e.alternate&&e.alternate.type=="BlockStatement"){ 227 | e=e.alternate; 228 | nif={tag:"block",v:{"wx:else":null},son:[]}; 229 | anaRecursion(e.body,{[vname]:nif}); 230 | pushSon(vname,nif); 231 | } 232 | } 233 | }else throw Error("Unknown if statement."); 234 | break; 235 | default: 236 | throw Error("Unknown type "+e.type); 237 | } 238 | } 239 | } 240 | function wxmlify(str,isText){ 241 | if(typeof str=="undefined"||str===null)return "Empty";//throw Error("Empty str in "+(isText?"text":"prop")); 242 | if(isText)return str;//may have some bugs in some specific case(undocumented by tx) 243 | else return str.replace(/"/g, '\\"'); 244 | } 245 | function elemToString(elem,dep,moreInfo=false){ 246 | const longerList=[];//put tag name which can't be style. 247 | const indent=' '.repeat(4); 248 | function isTextTag(elem){ 249 | return elem.tag=="__textNode__"&&elem.textNode; 250 | } 251 | function elemRecursion(elem,dep){ 252 | return elemToString(elem,dep,moreInfo); 253 | } 254 | function trimMerge(rets){ 255 | let needTrimLeft=false,ans=""; 256 | for(let ret of rets){ 257 | if(ret.textNode==1){ 258 | if(!needTrimLeft){ 259 | needTrimLeft=true; 260 | ans=ans.trimRight(); 261 | } 262 | }else if(needTrimLeft){ 263 | needTrimLeft=false; 264 | ret=ret.trimLeft(); 265 | } 266 | ans+=ret; 267 | } 268 | return ans; 269 | } 270 | if(isTextTag(elem)){ 271 | //In comment, you can use typify text node, which beautify its code, but may destroy ui. 272 | //So, we use a "hack" way to solve this problem by letting typify program stop when face textNode 273 | let str=new String(wxmlify(elem.content,true)); 274 | str.textNode=1; 275 | return wxmlify(str,true);//indent.repeat(dep)+wxmlify(elem.content.trim(),true)+"\n"; 276 | } 277 | if(elem.tag=="block"&&!moreInfo){ 278 | if(elem.son.length==1&&!isTextTag(elem.son[0])){ 279 | let ok=true,s=elem.son[0]; 280 | for(let x in elem.v)if(x in s.v){ 281 | ok=false; 282 | break; 283 | } 284 | if(ok&&!(("wx:for" in s.v||"wx:if" in s.v)&&("wx:if" in elem.v||"wx:else" in elem.v||"wx:elif" in elem.v))){//if for and if in one tag, the default result is an if in for. And we should block if nested in elif/else been combined. 285 | Object.assign(s.v,elem.v); 286 | return elemRecursion(s,dep); 287 | } 288 | }else if(Object.keys(elem.v).length==0){ 289 | let ret=[]; 290 | for(let s of elem.son)ret.push(elemRecursion(s,dep)); 291 | return trimMerge(ret); 292 | } 293 | } 294 | let ret=indent.repeat(dep)+"<"+elem.tag; 295 | for(let v in elem.v)ret+=" "+v+(elem.v[v]!==null?"=\""+wxmlify(elem.v[v])+"\"":""); 296 | if(elem.son.length==0){ 297 | if(longerList.includes(elem.tag))return ret+" />\n"; 298 | else return ret+">\n"; 299 | } 300 | ret+=">\n"; 301 | let rets=[ret]; 302 | for(let s of elem.son)rets.push(elemRecursion(s,dep+1)); 303 | rets.push(indent.repeat(dep)+"\n"); 304 | return trimMerge(rets); 305 | } 306 | function doWxml(state,dir,name,code,z,xPool,rDs,wxsList,moreInfo){ 307 | let rname=code.slice(code.lastIndexOf("return")+6).replace(/[\;\}]/g,"").trim(); 308 | code=code.slice(code.indexOf("\n"),code.lastIndexOf("return")).trim(); 309 | let r={son:[]}; 310 | analyze(esprima.parseScript(code).body,z,{[rname]:r},xPool,{[rname]:r}); 311 | let ans=[]; 312 | for(let elem of r.son)ans.push(elemToString(elem,0,moreInfo)); 313 | let result=[ans.join("")]; 314 | for(let v in rDs){ 315 | state[0]=v; 316 | let oriCode=rDs[v].toString(); 317 | let rname=oriCode.slice(oriCode.lastIndexOf("return")+6).replace(/[\;\}]/g,"").trim(); 318 | let tryPtr=oriCode.indexOf("\ntry{"); 319 | let zPtr=oriCode.indexOf("var z=gz$gwx"); 320 | let code=oriCode.slice(tryPtr+5,oriCode.lastIndexOf("\n}catch(")).trim(); 321 | if(zPtr!=-1&&tryPtr>zPtr){ 322 | let attach=oriCode.slice(zPtr); 323 | attach=attach.slice(0,attach.indexOf("()"))+"()\n"; 324 | code=attach+code; 325 | } 326 | let r={tag:"template",v:{name:v},son:[]}; 327 | analyze(esprima.parseScript(code).body,z,{[rname]:r},xPool,{[rname]:r}); 328 | result.unshift(elemToString(r,0,moreInfo)); 329 | } 330 | name=path.resolve(dir,name); 331 | if(wxsList[name])result.push(wxsList[name]); 332 | wu.save(name,result.join("")); 333 | } 334 | function tryWxml(dir,name,code,z,xPool,rDs,...args){ 335 | console.log("Decompile "+name+"..."); 336 | let state=[null]; 337 | try{ 338 | doWxml(state,dir,name,code,z,xPool,rDs,...args); 339 | console.log("Decompile success!"); 340 | }catch(e){ 341 | console.log("error on "+name+"("+(state[0]===null?"Main":"Template-"+state[0])+")\nerr: ",e); 342 | if(state[0]===null)wu.save(path.resolve(dir,name+".ori.js"),code); 343 | else wu.save(path.resolve(dir,name+".tem-"+state[0]+".ori.js"),rDs[state[0]].toString()); 344 | } 345 | } 346 | function doWxs(code){ 347 | const before='nv_module={nv_exports:{}};'; 348 | return wxsBeautify(code.slice(code.indexOf(before)+before.length,code.lastIndexOf('return nv_module.nv_exports;}')).replace(/nv\_/g,'')); 349 | } 350 | function doFrame(name,cb,order){ 351 | let moreInfo=order.includes("m"); 352 | wxsList={}; 353 | wu.get(name,code=>{ 354 | getZ(code,z=>{ 355 | const before="\nvar nv_require=function(){var nnm="; 356 | code=code.slice(code.indexOf(before)+before.length,code.lastIndexOf("if(path&&e_[path]){")); 357 | json=code.slice(0,code.indexOf("};")+1); 358 | let endOfRequire=code.indexOf("()\r\n")+4; 359 | if(endOfRequire==4-1)endOfRequire=code.indexOf("()\n")+3; 360 | code=code.slice(endOfRequire); 361 | let rD={},rE={},rF={},requireInfo,x,vm=new VM({sandbox:{d_:rD,e_:rE,f_:rF,_vmRev_(data){ 362 | [x,requireInfo]=data; 363 | },nv_require(path){ 364 | return ()=>path; 365 | }}}); 366 | vm.run(code+"\n_vmRev_([x,"+json+"])"); 367 | let dir=path.dirname(name),pF=[]; 368 | for(let info in rF)if(typeof rF[info]=="function"){ 369 | let name=path.resolve(dir,(info[0]=='/'?'.':'')+info),ref=rF[info](); 370 | pF[ref]=info; 371 | wu.save(name,doWxs(requireInfo[ref].toString())); 372 | } 373 | for(let info in rF)if(typeof rF[info]=="object"){ 374 | let name=path.resolve(dir,(info[0]=='/'?'.':'')+info); 375 | let res=[],now=rF[info]; 376 | for(let deps in now){ 377 | let ref=now[deps](); 378 | if(ref.includes(":"))res.push("\n"+doWxs(requireInfo[ref].toString())+"\n"); 379 | else if(pF[ref])res.push(""); 380 | else res.push(""); 381 | wxsList[name]=res.join("\n"); 382 | } 383 | } 384 | for(let name in rE)tryWxml(dir,name,rE[name].f.toString(),z,x,rD[name],wxsList,moreInfo); 385 | cb({[name]:4}); 386 | }); 387 | }); 388 | } 389 | module.exports={doFrame:doFrame}; 390 | if(require.main===module){ 391 | wu.commandExecute(doFrame,"Restore wxml files.\n\n\n\n restore wxml file from page-frame.html or app-wxss.js."); 392 | } 393 | -------------------------------------------------------------------------------- /nodejs/nodejs/wuWxss.js: -------------------------------------------------------------------------------- 1 | const wu=require("./wuLib.js"); 2 | const path=require("path"); 3 | const fs=require("fs"); 4 | const {VM}=require('vm2'); 5 | const cssbeautify=require('cssbeautify'); 6 | const csstree=require('css-tree'); 7 | function doWxss(dir,cb){ 8 | function GwxCfg(){} 9 | GwxCfg.prototype={$gwx(){}}; 10 | for(let i=0;i<300;i++)GwxCfg.prototype["$gwx"+i]=GwxCfg.prototype.$gwx; 11 | let runList={},pureData={},result={},actualPure={},importCnt={},frameName="",onlyTest=true,blockCss=[];//custom block css file which won't be imported by others.(no extension name) 12 | function cssRebuild(data){//need to bind this as {cssFile:__name__} before call 13 | let cssFile; 14 | function statistic(data){ 15 | function addStat(id){ 16 | if(!importCnt[id])importCnt[id]=1,statistic(pureData[id]); 17 | else ++importCnt[id]; 18 | } 19 | if(typeof data==="number")return addStat(data); 20 | for(let content of data)if(typeof content==="object"&&content[0]==2)addStat(content[1]); 21 | } 22 | function makeup(data){ 23 | var isPure=typeof data==="number"; 24 | if(onlyTest){ 25 | statistic(data); 26 | if(!isPure){ 27 | if(data.length==1&&data[0][0]==2)data=data[0][1]; 28 | else return ""; 29 | } 30 | if(!actualPure[data]&&!blockCss.includes(wu.changeExt(wu.toDir(cssFile,frameName),""))){ 31 | console.log("Regard "+cssFile+" as pure import file."); 32 | actualPure[data]=cssFile; 33 | } 34 | return ""; 35 | } 36 | let res=[],attach=""; 37 | if(isPure&&actualPure[data]!=cssFile){ 38 | if(actualPure[data])return '@import "'+wu.changeExt(wu.toDir(actualPure[data],cssFile),".wxss")+'";\n'; 39 | else{ 40 | res.push("/*! Import by _C["+data+"], whose real path we cannot found. */"); 41 | attach="/*! Import end */"; 42 | } 43 | } 44 | let exactData=isPure?pureData[data]:data; 45 | for(let content of exactData) 46 | if(typeof content==="object"){ 47 | switch(content[0]){ 48 | case 0://rpx 49 | res.push(content[1]+"rpx"); 50 | break; 51 | case 1://add suffix, ignore it for restoring correct! 52 | break; 53 | case 2://import 54 | res.push(makeup(content[1])); 55 | break; 56 | } 57 | }else res.push(content); 58 | return res.join("")+attach; 59 | } 60 | return ()=>{ 61 | cssFile=this.cssFile; 62 | if(!result[cssFile])result[cssFile]=""; 63 | result[cssFile]+=makeup(data); 64 | }; 65 | } 66 | 67 | function runVM(name, code) { 68 | // let wxAppCode = {}, handle = {cssFile: name}; 69 | // let vm = new VM({ 70 | // sandbox: Object.assign(new GwxCfg(), { 71 | // __wxAppCode__: wxAppCode, 72 | // setCssToHead: cssRebuild.bind(handle) 73 | // }) 74 | // }); 75 | // vm.run(code); 76 | // for (let name in wxAppCode) if (name.endsWith(".wxss")) { 77 | // handle.cssFile = path.resolve(frameName, "..", name); 78 | // wxAppCode[name](); 79 | // } 80 | 81 | let wxAppCode = {}; 82 | let handle = {cssFile: name}; 83 | let gg = new GwxCfg(); 84 | let tsandbox = { 85 | $gwx: GwxCfg.prototype["$gwx"], 86 | __mainPageFrameReady__: GwxCfg.prototype["$gwx"], //解决 $gwx is not defined 87 | __vd_version_info__: GwxCfg.prototype["$gwx"], //解决 __vd_version_info__ is not defined 88 | __wxAppCode__: wxAppCode, 89 | setCssToHead: cssRebuild.bind(handle) 90 | } 91 | 92 | let vm = new VM({sandbox: tsandbox}); 93 | vm.run(code); 94 | for (let name in wxAppCode) { 95 | if (name.endsWith(".wxss")) { 96 | handle.cssFile = path.resolve(frameName, "..", name); 97 | wxAppCode[name](); 98 | } 99 | } 100 | } 101 | function preRun(dir,frameFile,mainCode,files,cb){ 102 | wu.addIO(cb); 103 | runList[path.resolve(dir,"./app.wxss")]=mainCode; 104 | for(let name of files)if(name!=frameFile){ 105 | wu.get(name,code=>{ 106 | code=code.slice(0,code.indexOf("\n")); 107 | if(code.indexOf("setCssToHead")>-1)runList[name]=code.slice(code.indexOf("setCssToHead")); 108 | }); 109 | } 110 | } 111 | function runOnce() { 112 | for (let name in runList) { 113 | // console.log(name, runList[name]); 114 | runVM(name, runList[name]); 115 | } 116 | } 117 | function transformCss(style){ 118 | let ast=csstree.parse(style); 119 | csstree.walk(ast,function(node){ 120 | if(node.type=="Comment"){//Change the comment because the limit of css-tree 121 | node.type="Raw"; 122 | node.value="\n/*"+node.value+"*/\n"; 123 | } 124 | if(node.type=="TypeSelector"){ 125 | if(node.name.startsWith("wx-"))node.name=node.name.slice(3); 126 | else if(node.name=="body")node.name="page"; 127 | } 128 | if(node.children){ 129 | const removeType=["webkit","moz","ms","o"]; 130 | let list={}; 131 | node.children.each((son,item)=>{ 132 | if(son.type=="Declaration"){ 133 | if(list[son.property]){ 134 | let a=item,b=list[son.property],x=son,y=b.data,ans=null; 135 | if(x.value.type=='Raw'&&x.value.value.startsWith("progid:DXImageTransform")){ 136 | node.children.remove(a); 137 | ans=b; 138 | }else if(y.value.type=='Raw'&&y.value.value.startsWith("progid:DXImageTransform")){ 139 | node.children.remove(b); 140 | ans=a; 141 | }else{ 142 | let xValue=x.value.children&&x.value.children.head&&x.value.children.head.data.name,yValue=y.value.children&&y.value.children.head&&y.value.children.head.data.name; 143 | if(xValue&&yValue)for(let type of removeType)if(xValue==`-${type}-${yValue}`){ 144 | node.children.remove(a); 145 | ans=b; 146 | break; 147 | }else if(yValue==`-${type}-${xValue}`){ 148 | node.children.remove(b); 149 | ans=a; 150 | break; 151 | }else{ 152 | let mValue=`-${type}-`; 153 | if(xValue.startsWith(mValue))xValue=xValue.slice(mValue.length); 154 | if(yValue.startsWith(mValue))yValue=yValue.slice(mValue.length); 155 | } 156 | if(ans===null)ans=b; 157 | } 158 | list[son.property]=ans; 159 | }else list[son.property]=item; 160 | } 161 | }); 162 | for(let name in list)if(!name.startsWith('-')) 163 | for(let type of removeType){ 164 | let fullName=`-${type}-${name}`; 165 | if(list[fullName]){ 166 | node.children.remove(list[fullName]); 167 | delete list[fullName]; 168 | } 169 | } 170 | } 171 | }); 172 | return cssbeautify(csstree.generate(ast),{indent:' ',autosemicolon:true}); 173 | } 174 | wu.scanDirByExt(dir,".html",files=>{ 175 | let frameFile=""; 176 | if(fs.existsSync(path.resolve(dir,"page-frame.html"))) 177 | frameFile=path.resolve(dir,"page-frame.html"); 178 | else if(fs.existsSync(path.resolve(dir,"app-wxss.js"))) 179 | frameFile=path.resolve(dir,"app-wxss.js"); 180 | else if(fs.existsSync(path.resolve(dir,"page-frame.js"))) 181 | frameFile=path.resolve(dir,"page-frame.js"); 182 | else throw Error("page-frame-like file is not found in the package by auto."); 183 | wu.get(frameFile,code=>{ 184 | code=code.slice(code.indexOf('var setCssToHead = function(file, _xcInvalid')); 185 | code=code.slice(code.indexOf('\nvar _C= ')+1); 186 | let oriCode=code; 187 | code=code.slice(0,code.indexOf('\n')); 188 | let vm=new VM({sandbox:{}}); 189 | pureData=vm.run(code+"\n_C"); 190 | let mainCode=oriCode.slice(oriCode.indexOf("setCssToHead"),oriCode.lastIndexOf(";var __pageFrameEndTime__")); 191 | console.log("Guess wxss(first turn)..."); 192 | preRun(dir,frameFile,mainCode,files,()=>{ 193 | frameName=frameFile; 194 | onlyTest=true; 195 | runOnce(); 196 | onlyTest=false; 197 | console.log("Import count info: %j",importCnt); 198 | for(let id in pureData)if(!actualPure[id]){ 199 | if(!importCnt[id])importCnt[id]=0; 200 | if(importCnt[id]<=1){ 201 | console.log("Cannot find pure import for _C["+id+"] which is only imported "+importCnt[id]+" times. Let importing become copying."); 202 | }else{ 203 | let newFile=path.resolve(dir,"__wuBaseWxss__/"+id+".wxss"); 204 | console.log("Cannot find pure import for _C["+id+"], force to save it in ("+newFile+")."); 205 | id=Number.parseInt(id); 206 | actualPure[id]=newFile; 207 | cssRebuild.call({cssFile:newFile},id)(); 208 | } 209 | } 210 | console.log("Guess wxss(first turn) done.\nGenerate wxss(second turn)..."); 211 | runOnce() 212 | console.log("Generate wxss(second turn) done.\nSave wxss..."); 213 | for(let name in result)wu.save(wu.changeExt(name,".wxss"),transformCss(result[name])); 214 | let delFiles={}; 215 | for(let name of files)delFiles[name]=8; 216 | delFiles[frameFile]=4; 217 | cb(delFiles); 218 | }); 219 | }); 220 | }); 221 | } 222 | module.exports={doWxss:doWxss}; 223 | if(require.main===module){ 224 | wu.commandExecute(doWxss,"Restore wxss files.\n\n\n\n restore wxss file from a unpacked directory(Have page-frame.html (or app-wxss.js) and other html file)."); 225 | } 226 | -------------------------------------------------------------------------------- /wxapkg/_-1713870039_45.wxapkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/wxapkg/_-1713870039_45.wxapkg -------------------------------------------------------------------------------- /wxapkg/_-872837891_13.wxapkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/wxapkg/_-872837891_13.wxapkg -------------------------------------------------------------------------------- /wxapkg/_506735826_47.wxapkg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cherrison/CrackMinApp/f175b1a17ce9b1afc827114e99d4084799a7519b/wxapkg/_506735826_47.wxapkg -------------------------------------------------------------------------------- /使用方法.txt: -------------------------------------------------------------------------------- 1 | 直接解压后就可以使用 2 | 将小程序文件放到 wxapkg目录下 3 | 然后打开 CrackMinApp.exe 按说明即可使用 4 | 5 | 6 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 7 | 注意未避免文件名称过长导致的错误,请把目录下文件复制到一个根目录下新建的文件夹下面 8 | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 9 | 10 | 注意: nodejs/nodejs下面这个压缩包node_modules.zip解压一下。 本来这下面是有个node_modules文件夹的可是由于github默认不上传超过100个文件导致没有上传这个关键文件, 故采用了这样的方法 11 | --------------------------------------------------------------------------------