John Hammond Self-Extracting Executables for Hackers

2024-12-28

今年整個忙於工作,實在沒辦法騰出好時間寫文章,但其實研究的步調並沒有落下,所以於是就想說針對常看到YT挑一些有趣的東西拿來寫

首先附上
REF: https://www.youtube.com/watch?v=mAond4BkCfM

主要的利用工具是這個 iexpress.exe

相關介紹
https://zh.wikipedia.org/zh-tw/IExpress
https://ss64.com/nt/iexpress.html

其實透過 iexpress 產生惡意程式 loader 好像不是什麼新鮮事了
https://blog.csdn.net/cssxn/article/details/102294173

它的使用方法也很簡單
首先打開他,記得要用 admin 權限開,不然到後面會有 error


這邊選第一個

取標題名稱

詢問是否需要提示 prompt

詢問是否需要 pop license

選擇需要打包的軟體

選擇執行安裝的軟體,同時也可以選擇安裝完成後要額外執行的軟體

選擇是否要顯示安裝視窗

安裝完成後的訊息欄

選擇 Package 要存哪

如果這邊選了 Store files 那個選項的話,會跳出提示,這邊我們不選
安裝完是否需要重新啟動

選擇 SED 要存在哪

最後給他跑

如果這邊不是用 admin 權限跑的話就會出現以下錯誤

最後執行完成

到這邊流程告一段落,來看看產生的檔案如何

可以看到印有 Micorsoft 的字串,並且沒有簽章

透過 process explorer 長這樣

然後 iexpress 可以透過 cmd 呼叫

所以還可以只傳送 SED file,讓他透過 cmd 產生 exe

細部打開 SED file 內部長這樣子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=1
HideExtractAnimation=1
UseLongFileName=0
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=N
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=calc.exe
SourceFiles=SourceFiles
[Strings]
InstallPrompt=
DisplayLicense=
FinishMessage=
TargetName=C:\Users\users\Documents\iexpress_test\installer.EXE
FriendlyName=installer
AppLaunched=calc.exe
PostInstallCmd=calc.exe
AdminQuietInstCmd=
UserQuietInstCmd=
FILE0="calc.exe"
[SourceFiles]
SourceFiles0=C:\Windows\System32\
[SourceFiles0]
%FILE0%=

TargetName 就是實際 exe 會產生的位置,無論在哪邊解 SED file 最後都會在 TargetName 產生 exe
AppLaunched 就是實際 exe 會執行的內容,這邊可以替換為後門程式,但要注意,需要在 SourceFiles0 指定的 path 能找到對應的檔案名稱才行

當把 calc.exe 改為 notepad.exe 的時候會發現一個有趣的現象

這個 process tree 看起來合理多了,為什麼呼叫 calc.exe 的時候不是直接從 installer.exe spawn 呢?
還好現在有 chatgpt 可以解答我的疑問..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
你所描述的情況,當你運行 calc.exe(計算器)時,它似乎是由 sihost.exe 進程啟動,而不是由你的父進程啟動,同時 notepad.exe(記事本)則由父進程啟動,在 Process Explorer 中顯示為父子關係,這可能與 Windows 如何處理進程和用戶界面(UI)進程的管理方式有關。

1. Sihost.exe 和 Windows Shell
Sihost.exe(Shell Infrastructure Host)是 Windows 操作系統中的一個系統進程,負責處理一些與用戶界面(UI)相關的圖形元素,比如透明效果、主題、視覺特效等。
Sihost.exe 是 Windows Shell 的一部分,負責管理桌面環境的某些視覺元素。在你運行像 calc.exe(計算器)這樣的應用程序時,它可能會通過 sihost.exe 來啟動,因為 sihost.exe 需要處理與桌面 UI 相關的任務。
Sihost.exe 作為父進程來啟動 UI 類應用程序(如 calc.exe),是為了更好地管理窗口和視覺效果,這是與 Windows 用戶界面相關的一種設計行為。
2. Notepad 和父進程
Notepad.exe(記事本)通常會直接從你的父進程(如 explorer.exe 或你的用戶會話進程)啟動。這是因為 notepad.exe 是一個簡單的應用程序,它不需要依賴 sihost.exe 來管理視覺效果或桌面環境。
Notepad 是一個比較簡單的程序,只是打開文本編輯窗口,因此它不需要像 calc.exe 那樣與 sihost.exe 進行交互。這樣它就可以直接從 explorer.exe(Windows 的桌面進程)或者啟動它的父進程啟動。
3. 進程樹的行為
Windows 進程樹:Windows 的進程樹有時候比我們預期的更複雜,尤其是像 sihost.exe 這樣的進程,它負責管理 UI 元素,會在一定情況下作為父進程啟動其他進程。即使 calc.exe(計算器)看似是從 sihost.exe 啟動的,它依然是作為一部分用來管理桌面界面的一個過程。
為什麼會這樣:

Windows UI 管理:Windows 操作系統會優先考慮一些進程,比如 sihost.exe,來處理用戶界面和視覺效果。所以像 calc.exe 這樣的應用程序需要與桌面環境的視覺元素兼容,因此它會通過 sihost.exe 啟動。
Notepad 的簡單性:Notepad 是一個比較簡單的應用程序,它不需要與 sihost.exe 交互來處理視覺效果,因此它會直接從父進程(如 explorer.exe)啟動。
4. 為什麼會有 Sihost.exe 參與
Sihost.exe 負責處理 Windows 系統中的一些圖形界面元素,包括桌面透明效果、開始菜單、任務欄等。當你運行像 calc.exe(計算器)這樣的程序時,Windows 需要確保這些應用能夠正確顯示並與系統視覺元素兼容。因此,這類應用可能會通過 sihost.exe 啟動,以確保它們的視覺效果能夠正常運行。
這意味著,當你啟動 calc.exe 時,Windows 會通過 sihost.exe 來協調與視覺界面的交互,從而使應用程序的窗口顯示正常。
5. Process Explorer 中的父子關係
Process Explorer 顯示的父子進程關係是根據 Windows 系統記錄的啟動過程來顯示的,這可能不完全反映進程啟動的實際邏輯。它所顯示的父進程可能是 sihost.exe,但實際上這只是進程樹中的一個顯示,並不代表 sihost.exe 真正是啟動 calc.exe 的進程。
Notepad 出現直接從父進程(如 explorer.exe)啟動,可能是因為它是簡單的應用程序,不需要過多的 UI 管理。這些進程在 Process Explorer 中的顯示可能讓你覺得它們是從父進程啟動的,但其實 Windows 是根據需要來處理每個應用的啟動方式的。
6. 結論
Sihost.exe 會管理 calc.exe 的啟動,是因為 sihost.exe 負責 Windows 系統的圖形界面管理和視覺效果。Notepad.exe 則直接由父進程啟動,是因為它是一個簡單的應用程序,並不依賴於這些 UI 管理。
Process Explorer 顯示的進程樹可能會讓你感覺 calc.exe 由 sihost.exe 啟動,而 notepad.exe 由父進程啟動,這實際上是 Windows 根據不同應用程序的需求來管理進程的結果。

另外產生出來的 exe 也有參數可以呼叫喔

所以可以做到這樣,明明 SED 的參數是呼叫 notepad.exe, 卻可以透過 /C 改寫呼叫的程式(指令),這裡的說明是安裝指令,代表可以不需要看 SourceFiles0

可以任意指定參數

另外在文章中有引出另一篇推特文章
https://x.com/0gtweet/status/1759868814148133078
基本上就是把 iexpress 當作 loader 了
看到後當然會想試一下

1
2
3
4
5
6
7
8
9
10
11
12
13
echo [Version] > lol.sed 
echo Class=IEXPRESS >> lol.sed
echo SEDVersion=3 >> lol.sed
echo [Options] >> lol.sed
echo TargetName=.\LOLBin.EXE >> lol.sed
echo AppLaunched="cmd.exe /c start calc.exe" >> lol.sed
echo PostInstallCmd=^<None^> >> lol.sed
echo SourceFiles-SourceFiles >> lol.sed
echo [SourceFiles] >> lol.sed
echo SourceFiles0=. >> lol.sed
echo [SourceFiles0] >> lol.sed
echo lol.sed-lol.sed >> lol.sed iexpress.exe /n lol.sed
LOLBin.exe