要學習Electron逆向,首先要有一個Electron開發的程序的發布的包,這里就以其官方的electron-quick-start作為例子來進行一下逆向的過程。
https://github.com/electron/electron-quick-start
關於如何打包Electron程序,請參考這篇文章:
https://www.cnblogs.com/cc11001100/p/14290548.html
一、Electron打包出來的程序特征識別
要逆向Electron程序,首先第一步肯定是得確定這個程序是不是Electron打包出來的了,Electron打包出來的程序特征比較明顯,嘗試把exe文件修改為zip文件,然后用壓縮程序打開,如果能夠打開,至少說明它不是一個真的ELF文件,然后再看壓縮文件中是不是有一個resources目錄,下面有一個app.asar文件,如果符合這兩個條件,基本就是Electron開發的文件了。
比如
將其修改為zip格式:
然后使用壓縮軟件打開這個壓縮包,尋找resources文件夾:
然后跟進去:
看到有個app.asar,那這個程序八九不離十就是Electron開發的了。
總結一下:
- exe后綴修改為zip用壓縮文件打開
- 存在resources/app.asar這個文件
在本小節的最后抖個機靈,我們當然也可以靠Electron界面所特有的濃濃的Electron風格來辨識Electron開發的程序。 :)
二、Electron打包出來的文件的結構
將electron打包出來的exe文件修改為zip后綴,並用壓縮文件解壓,觀察解壓出來的結構:
這里的重點是resources文件夾和這個exe文件,resources文件夾下有個app.asar是項目源碼的歸檔文件,而這個exe則是程序的啟動文件。也許你會注意到,下面還有個名為LICENSE.electron.txt的文件,也許會覺得這是一個可以用來標識Electron程序的方式,是的,不僅是這個,上面還有個chrome_100_percent.pak、chrome_200_percent.pak,但是這些文件都不是必須的,在有些包里面是可能會被拿掉的,也就是根本找不到這些文件,所以只能起到一些輔助作用。
然后就是進入resources文件夾,這下面有個app.asar文件:
這個文件就是項目源碼的歸檔文件,asar是一種歸檔格式,有專門的解壓工具:
https://github.com/electron/asar/
使用工具解壓就可以了,先安裝這個工具
npm install --engine-strict asar然后命令行進入到asar所在的文件夾,解包它:
asar e app.asar app然后進去app文件夾,就能看到項目所有的東西都被歸檔存儲在這里:

完全可以拿着這份源碼繼續開發或者插入一些惡意邏輯重新打包發布。
三、asar文件結構淺析
asar格式的文件就是個歸檔文件,這玩意兒連壓縮都沒有,只需要看懂它的文件結構然后根據它的方式把文件提取出來就可以得到原始文件了。
使用010 Editor打開一個app.asar文件:
人家比較洋氣,把從最開始一直到那個很長的json結束都叫做文件頭,最開始的4個字節應該是魔數之類的,第2和第3個int說實話沒看明白啥意思,去翻了源碼也只看到是用了一個pickle,似乎是chromium的一個東西,不要再繼續深究了就放棄了:
只需要知道第4個int是緊跟着的json的長度,json結束就是所有被歸檔的文件的字節挨着放的,而json中存放的就是這些文件的元數據,包括文件的位置、字節大小、是否可執行等等,從010 Editor中把那個json復制出來,看一下它的長度:
而4562的轉換為16進制則是11D2:
而之前文件里存儲的長度正是11D2,只不過是小端存儲的,低位在前:
好了,將注意力回歸到json上,格式化觀察下元數據到底是個啥樣:
files下存儲的就是文件,記錄了每個文件的偏移和大小,靠這兩個值就能將其從歸檔文件中提取出來:
對於目錄結構它還是保存了其樹形結構的:
靠這個樹形結構能夠知道提取出來的文件應該如何存儲,至此我們對asar文件的結構和原理已經比較清楚了。
但是還有一個疑問,既然asar只是一個歸檔文件,為什么還要采用這種格式呢? 一種說法是為了能夠加密源代碼,現在我們知道這是胡扯,asar只是一個歸檔文件沒有加密作用,另一種說法是在Windows之類的地方,對資源路徑的長度是有限制的,如果路徑名過長訪問的時候就會報錯,也許大家都遇到過這種情況,將一些比較大的開源項目的源代碼下載到本地解壓會發現路徑過長有些路徑會報錯,而放在歸檔文件中不解壓這樣路徑就可以很深,並且讀取的時候是讀取的一個文件也就不用讀取小文件磁盤各種尋址了。
四、二次開發插入惡意邏輯
本節是基於第二部分解包出來的源代碼二次開發,使用webstorm創建一個空項目,將上面從app.asar中逆向處理的源代碼拷貝過去,但是這里涉及到了幾個比較蛋疼的問題,逆向出來的package.json文件里是沒有devDependencies的,而electron是開發環境依賴,所以要自己手動:
npm init npm add electron --save-dev然后為package.json添加一個script:
"start" : " electron . " ,

然后npm start看下效果:

酷!程序已經被運行起來了!
然后想一想,如何搞個惡意邏輯呢,這里只是為了演示可以做這個事情,所以就在程序啟動后顯示一個對話框提示一下知道我們修改邏輯成功了即可。
在renderer.js中插入一個alert框,它會在程序啟動的時候運行:

再次npm start,效果就是這樣的:

五、重新打包發布帶有惡意邏輯的包
5.1 整個程序重新打包
上面已經插入了惡意邏輯,接下來就是打包發布了,這里采用electron-builder:
https://github.com/electron-userland/electron-builder
先安裝此工具:
npm install electron-builder -g
打包前需要先為項目添加一些打包選項,編輯項目根目錄下的package.json文件,為其添加build選項:
"build": { "appId": "cc11001100.electron.example-001", // 程序包名 "copyright": "CC11001100", // 版權相關信息 "productName": "example-001", // 項目名字 "dmg": { "background": "res/background.png", // 背景圖片的路徑 "window": { // 啟動后窗口左上角位置 "x": 100, "y": 100, // 啟動后窗口的大小 "width": 500, "height": 300 } }, "win": { // 打包后的文件會有個圖標,這個圖標的路徑,不指定的話默認的不好看 "icon": "res/logo.png" }
注意這里的圖標、appId什么的要對應好,然后在項目的根路徑下執行:
electron-builder
即可開始打包,最終得到了發布包:
運行它:
5.2 重打包asar
但是通常情況下我們都是不知道appId之類的東西的,這個時候只重打包asar,然后把目錄重新打包為exe格式的zip包。
將項目的node依賴及其他無用的東西刪除掉,只保留最開始解出來的東西就可以了,不然打出來的包會很大:
在項目根目錄下將整個項目打包為app.asar:
asar p . / app.asar
然后用這個app.asar狸貓換太子,把resources下的app.arsr替換掉。
TODO 怎么把文件夾打包為exe呢? 這里還沒找到比較好的方案
有意思的資料,這里是一個對Electron開發的程序的源碼安全性的討論: