主頁 > 區塊鏈 > [node.js]PC端微信小程式包解密

[node.js]PC端微信小程式包解密

2020-12-13 10:43:56 區塊鏈

原來發布在掘金,搬過來好了,

微信小程式在PC端是加密存盤的,如果直接打開是看不到什么有用的資訊的,需要經過解密才可以看到包內具體的內容,本文使用nodejs實作解密演算法,主要涉及到crypto, commander, chalk三個包的使用,

小程式的原始碼在哪里

PC端打開過的小程式會被快取到本地微信檔案的默認保存位置,可以通過微信PC端=>更多=>設定查看:

進入默認保存位置下的/WeChat Files/WeChat Files/Applet檔案夾,可以看到該目錄下有一系列前綴為wx的檔案(檔案名其實是小程式的appid),這些就是我們打開過的小程式啦:

進入其中某個小程式的檔案夾,我們可以看到一個名字為一串數字的檔案夾,點進這個檔案夾, 就可以看到一個__APP__.wxapkg檔案,也就是小程式對應的代碼啦:

然而,當我們打開這個檔案之后卻發現是這樣的:

WTF 這能看出來個🔨,很明顯,這個檔案是經過加密的,需要解密才能看到我們想看到的東西,

PC端小程式是怎么被加密的

這里參考了一位大佬用Go語言寫的PC端wxapkg解密代碼,整理一下的話,加密流程是這樣的:

首先將明文代碼在第1024位元組處一分為二,前半部分使用CBC模式的AES加密,后半部分則直接進行異或,最后,將加密后的兩節拼接起來,并在最前邊寫入固定的字串:"V1MMWX",

所以,我們打開__APP__.wxapkg檔案看到的就是加密后的代碼,如果想還原回去的話,需要從后往前逐步推回去,

解密思路

預處理

我們使用node.js去寫一個解碼的程式,根據上邊加密的流程,我們首先讀取加密檔案,把前6個位元組的固定字串去除,由于AES加密和異或前后資料的位數是相同的,我們可以據此獲取到加密后的頭部1024位元組和加密后的尾部部分:

const fs = require('fs').promises;
...

const buf = await fs.readFile(pkgsrc); // 讀取原始Buffer
const bufHead = buf.slice(6, 1024 + 6);
const bufTail = buf.slice(1024 + 6);

加密后的頭部部分

為了得到這1024個位元組的明文,我們需要知道AES加密的初始向量iv,以及一個32位的密鑰,已知16位元組的初始向量iv是字串:“the iv: 16 bytes”,我們接下來需要計算出這個由pbkdf2演算法匯出的32位的密鑰,

pbkdf2(Password-Based Key Derivation Function)是一個用來生成密鑰的函式,它使用一個偽隨機函式,將原文密碼和salt作為輸入,通過不斷的迭代得到密鑰,在crypto庫中,pbkdf2函式是這樣的:

const crypto = require('crypto');
...

crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)

其中引數分別是:原文密碼、鹽值、迭代次數、密鑰長度、散列演算法、回呼函式,已知salt是"saltiest",原文密碼為微信小程式的id(也就是wx開頭的那個檔案夾名),迭代次數為1000,散列演算法為sha1,因此,我們可以寫出計算密鑰的代碼:

crypto.pbkdf2(wxid, salt, 1000, 32, 'sha1', (err, dk) => {
    if (err) {
        // 錯誤
    }
    // dk即為計算得到的密鑰
})

密鑰和初始向量iv都有了之后,我們可以開始對密文進行解密了,AES加密演算法是一種非對稱加密演算法,它的密鑰分成公開的公鑰和只有自己知道的私鑰,任何人都可以使用公鑰進行加密,但是只有持有私鑰的人解密得到明文,

小程式使用的加密演算法是CBC(Cipher Block Chaining, 密碼分組鏈接)模式的AES,也就是它在加密的時候,首先把明文進行分塊,然后將每一塊與前一塊加密后的密文進行異或,再使用公鑰進行加密,得到每一塊的密文,對于第一塊明文,由于它不存在前一塊明文,因此它會與初始向量iv進行異或,再進行公鑰加密,在實作的時候,我們只需要呼叫crypto提供的解密函式就可以啦,

我們知道,AES演算法根據密鑰長度的不同有AES128, AES192和AES256,回顧上邊,我們的密鑰是32位元組,也就是256位的,因此顯然我們應該使用的是AES256,綜上,我們可以寫出來解密的代碼:

const decipher = crypto.createDecipheriv('aes-256-cbc', dk, iv);
const originalHead = Buffer.alloc(1024, decipher.update(bufHead));

其中originalHead就是我們要的前1024位元組的明文啦,我們可以列印出來看看:

嗯…… 有那么點意思了,

加密后的尾部部分

這一部分就很簡單啦,由于異或運算是具有自反性的,因此只需要簡單的判斷一下小程式id的位數獲得異或的xorKey,再把它與密文進行異或,就可以得到原文了:

const xorKey = wxid.length < 2 ? 0x66 : wxid.charCodeAt(wxid.length - 2);
const tail = [];
for(let i = 0; i < bufTail.length; ++i){
    tail.push(xorKey ^ bufTail[i]);
}
const originalTail = Buffer.from(tail);

將頭部部分的明文與尾部部分的明文進行拼接,再以二進制形式寫入檔案,就可以得到最終的明文啦,

再漂亮點

根據上邊的描述,我們可以把我們整個的解密程序封裝成一個黑盒子:

commander

我們可以使用commander庫讓程式直接從命令列讀取小程式的id和密文包,commander是一個nodejs命令列界面的解決方案,可以很方便的定義自己的cli命令,比如說對于下面這一串代碼:

const program = require('commander');
...
program
    .command('decry <wxid> <src> [dst]')
    .description('解碼PC端微信小程式包')
    .action((wxid, src, dst) => {
        wxmd(wxid, src, dst);
    })

program.version('1.0.0')
    .usage("decry <wxid> <src> [dst]")
    .parse(process.argv);

我定義了一個"decry <wxid> <src> [dst]"的命令,其中尖括號代表必選引數,方括號代表可選引數,description內是關于這個命令的描述文本,action則是執行這段命令,在控制臺使用node執行代碼之后,可以看到如下界面:

于是我們就可以根據提示,輸入引數進行解密啦,commander.js的中文檔案在這里,

chalk

為了讓我們的控制臺多一抹顏色,我們可以使用chalk.js來美化輸出,chalk的基本用法也比較簡單:

const chalk = require('chalk');
...

console.log(chalk.green('綠了'))

這樣我們就可以在黑白的控制臺上填上一抹綠色,替大熊貓實作夢想:

除此之外,我們還可以使用es6的字串標簽模板更方便的使用chalk,具體的參考chalk官方檔案吧,

源代碼

代碼發布到github和gitee啦,可以給大家參考一下下~

github點這里, gitee點這里

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/233928.html

標籤:區塊鏈

上一篇:常用演算法之驗證回文串

下一篇:IPFS適合加入嗎?Filecoin未來趨勢如何?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more