你會信任你的AutoIT反編譯程序嗎?

2021-02-16 嘶吼專業版

AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟體,它的設計用於Windows GUI(圖形用戶界面)中進行自動化操作,利用模擬鍵盤按鍵,滑鼠移動和窗口/控制項的組合來實現自動化任務。而這是其它語言不可能做到或無可靠方法實現的(例如VBScript和SendKeys)。

Autoit3 Decompiler是一款功能強大的AutoIt3反編譯工具,可以反編譯由AutoIt編譯的exe程序,直接反編譯出原始碼!還帶有右鍵關聯功能,非常方便。 

在Autoit3 Decompiler中,按「反編譯選中」或「反編譯當前」按鈕,還可以提取exe中的資源(圖片、exe等等)到文件夾。 

Autoit3 Decompiler 主要功能簡介如下: 

1. 支持全系列autoit3,包括v3.0.100.0 - v3.3.7.18,後續版本沒驗證是否支持,理論上是都支持的 

2. 支持EXE及A3X文件反編譯 ;

3. 支持X86及X64格式反編譯 ;

4. 支持ANSI及UNICODE反編譯 ;

5. 支持帶密碼編譯,對於3.2.6.0之前版本可以讀取原始密碼,後續版本無法顯示密碼但可正常反編譯 ;

6. 支持代碼混淆,混淆程序反編譯後可讀性欠佳,但不影響重編譯及執行; 

7. 支持反編譯後文件項信息即時預覽 ;

8. 支持反編譯後文件內容即時預覽 ;

9. 支持批量反編譯 ;

10. 支持命令行及圖形界面操作 ;

11. 支持滑鼠右鍵菜單集成。

在分析AutoIT編譯的惡意軟體樣本期間,會彈出一個消息框,指示在使用Exe2Aut反編譯器時可能執行的樣本。這引起了我對反編譯程序如何工作以及如何首先編譯AutoIt腳本的興趣。在本文中,我將解釋兩個最常見的AutoIT反編譯程序(Exe2Aut和myAut2Exe)是如何工作的,以及它們是如何被騙去反編譯一個誘餌腳本而不是真正的腳本。

什麼是「已編譯」 AutoIT可執行文件?

編譯後的AutoIT可執行文件基本上由兩部分組成:一個獨立的AutoIT解釋程序和作為PE文件中資源顯示的編譯腳本字節碼。AutoIT的創建者已經採取了一些措施來防止簡單的反編譯,並對字節碼應用了一種壓縮和加密的形式。字節碼的解壓縮由編譯的AutoIT二進位文件執行,然後再解釋和執行。

現在,讓我們分析一下Exe2Aut反編譯程序。

如果要在反編譯期間動態分析Exe2Aut,則會注意到以下內容:

1. 將.tmp文件寫入%TEMP%文件夾;

2. 目標二進位文件作為Exe2Aut的子進程加載;

3. .tmp文件被注入目標二進位文件中;

4. 目標二進位文件會將反編譯的autoIT腳本寫入當前工作目錄。

因此,我們可以得出結論,Exe2Aut利用嵌入式解釋程序對腳本字節碼進行解密和解壓縮,然後通過將動態連結庫(DLL)注入目標二進位文件來提取該字節碼。這樣就鉤住了將執行字節碼的函數,並將字節碼解碼回函數名稱,從而使其成為一種動態方法。因此,可以添加代碼來檢測注入並更改其行為。這樣,我們可以欺騙Exe2Aut來反編譯誘餌腳本,而不是在運行應用程式時執行的真實腳本。

Exe2Aut注入模塊

那MyAut2Exe呢?

與Exe2Aut不同,MyAut2Exe無需嵌入式解釋程序就可以提取字節碼資源並解壓縮和解碼。使其成為完整的靜態反編譯程序,因此沒有意外執行任何內容的風險。

MyAut2Exe比Exe2Aut更高級,它支持AutoIT和AutoHotkey編譯腳本的多個版本。因此,它具有更多設置來調整已編譯腳本代碼的提取和解壓縮。為了減少正確配置的麻煩,它提供了一個稱為「自動化」的功能。該暴力破解將強制反編譯程序設置,直到腳本成功反編譯為止。當使用「自動」功能時,MyAut2Exe解析可執行文件中的AutoIT魔術字節碼籤名。一旦找到,它將提取並反編譯代碼。由於解析和反編譯會在魔術字節碼序列首次出現時就停止了,因此只要將MyAut2Exe放置在比真實編譯腳本資源低的偏移量處,就可以很容易地誘使MyAut2Exe進行反編譯。

演示過程

雖然理論知識層面我們已經講得更清楚了,但是在網絡安全領域,概念證明(POC)的價值遠遠超過任何理論。

這個想法是要使用三個不同的字節碼來編譯AutoIt可執行文件,一旦被Exe2Aut或MyAut2Exe反編譯,其中一個誘餌腳本就會被反編譯,而不是真正的代碼。

如前所述,MyAut2Exe的誘餌腳本位於真實字節碼之前。對於Exe2Aut,誘餌和真實腳本的腳本資源名稱將在運行時重命名,以使其反編譯錯誤的代碼。

我已經編譯了三種不同的AutoIt腳本,並將它們作為資源添加到.rsrc部分。其中兩個是誘餌腳本,而第三個是真實的腳本。然後,我將.rsrc部分的權限設置為讀取/寫入可移植可執行文件(PE)頭。

真實和誘騙的腳本資源

接下來,我編寫了一個小的程序集shellcode來遍歷進程環境塊中的PEB_LDR_DATA結構,以檢查Exe2Aut注入的DLL是否存在。還可以在磁碟上搜索(UPX壓縮)DLL,因為在注入之前,它位於Windows%TEMP%目錄下的隨機文件名下。我之所以選擇這種方法,是因為它更可靠且更難檢測。遍歷進程環境塊以檢查所有已加載模塊中是否存在節名稱為.UPX0的已加載模塊,這是一種識別Exe2Aut注入模塊的更簡便的方法,因為其他所有DLL通常都不會被UPX壓縮。這個方法甚至可以檢測到各種各樣的Exe2Aut版本,而不僅僅是我使用的那個,甚至還有一些自定義的反編譯器。

創建了shellcode之後,我需要在準備好的可執行文件中找到一個位置,將我的shellcode注入其中。我在.text部分的末尾找到了一個大約210位元組的編解碼器,此時我的shellcode可以很容易地放入其中。為了執行我的shellcode,我決定在調用IsDebuggerPresent之後立即跳轉到它,並在執行完成後返回正常執行流程。

saveRegisters:

     push ecx

     push ebx

     push edx

checkInjected:

     mov ebx, fs:[0x30]                                        ; Get PEB address

     mov ebx, [ebx+0xC]                                        ; Get LDR Table address

     mov ebx, [ebx+0x14]                                       ; first entry of LDR table. (the first entry is the that of the executable)

     mov edx, [ebx+0x10]                                       ; Store the offset in edx

                                                               ;   I need this later to calculate the offsets

                                                               ;   of the resource names

     nextModule:

          mov ebx, [ebx]                                       ; Get address of next LDR entry

          mov ecx, dword ptr ds:[ebx+0x28]                     ; Pointer of the module name

          test ecx, ecx                                        ; If the pointer is OxO it means we have reached

                                                               ;   the end of our LDR table and we want to

          je restoreRegisers                                   ;   continue normal execution

          mov ecx,dword ptr ds:[ebx+0x10]                      ; Get the modules base offset

          mov ecx, dword ptr ds:[ecx+0x178]                    ; load a dword from the modules base offset+0x178

          cmp ecx,0x30585055                                   ;   and check if it is "UPX0"

          je swapResouces

          jmp nextModule

swapResouces:

     mov byte ptr ds:[edx+ 0xc7656], 0x49                      ; Replace the '1' for a 'I' in "SCR1PT"

     mov byte ptr ds:[edx+ 0xc765e] , 0x35                     ; Replace the 'S' for a '5' in "SCRIPT"

restoreRegisers:

     pop edx

     pop ebx

     pop ecx

     test eax, eax                                            ; Restore the instructions that were overwritten by

     jnz debugerIsPresent                                     ;   the jump to the codecave

     jmp debugerNotPresent                                    ; Return to the normal program flow

程序集shellcode(70位元組)

演示視頻可以點擊這裡,從以上POC中我們可以學到的是,我們不應該總是盲目地相信我們使用的工具。逆向工程師應該意識到他們的工具是如何工作的,以及他們如何可能被欺騙而返回具有誤導性的輸出結果。雖然這裡介紹的技巧可能會誤導兩個反編譯器,但它們不會影響沙箱中的動態分析結果。 

參考及來源:https://unit42.paloaltonetworks.com/autoit-compiled-malware/

相關焦點

  • [原創] Autoit反編譯實例:陌陌呼死你破解教程
    【文章標題】: Autoit反編譯實例:陌陌呼死你破解教程【軟體名稱】: 陌陌呼死你【下載地址】: 自己搜索下載【加殼方式】: UPX【編寫語言】: AutoIt V3【使用工具】: DeAutoIt AutoIt SciTE 【軟體介紹】: 不用介紹了【作者聲明】: 只是感興趣,沒有其他目的。
  • 手把手教你搞懂Android反編譯
    出處:http://www.iosxxoo.com/2016/06/29/2016-06-29/前言反編譯別人的程序不是什麼值得炫耀的事本文主要目的是繞開一個簡單的激活程序。什麼是反編譯我們知道,Android的程序打包後會生成一個APK文件,這個文件可以直接安裝到任何Android手機上,因此,反編譯就是對這個APK進行反編譯。Android的反編譯分成兩個部分:1、一個是對代碼反編譯,也就是java文件的反編譯。
  • Java代碼的編譯與反編譯
    2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進位語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進位的。 編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
  • selenium+python自動化77-autoit文件上傳
    autoit工具處理windows的控制項窗口是專業的,所以這個需藉助AutoIt來解決了。一、環境準備1.可以autoit官網上下載,安裝 http://www.autoitscript.com/site/2.下載到本地後傻瓜式安裝,安裝完之後在應用程式找到這個Autoit v3
  • 小程序/小遊戲 反編譯教程
    使用的反編譯腳本叫做wxappUnpacker開搞吧,我們通過電腦上的安卓模擬器來獲取,我這裡使用的是夜神模擬器,啟動後安裝微信,
  • 反編譯apk教程下篇—利用軟體進行反編譯
    昨天給大家寫了反編譯apk的準備工作,果然不出我所料,閱讀量比平時低了將近一半,也許是本人文筆不好,也有可能是教程太枯燥,導致看的人很少。但是,咱不能虎頭蛇尾,所以我還是決定含淚把這個教程寫完。昨天已經給大家寫了如何配置java環境,今天就進入正題,說下如何反編譯apk。其實反編譯並沒有想像中的那麼難,我用的也是網上大神提供的工具。
  • 教你如何反編譯微信小程序
    當時我在對其他微信小程序應用進行嘗試的時候發現,他們不同於小遊戲,解包後的文件並不能通過簡單增改就直接在微信開發者工具中運行,於是對小程序原始碼=>wxapkg包內文件的具體轉換關係進行了一定研究。
  • Python 中如何安全地進行編譯和反編譯?
    此時,我又在思考,如此簡單的打包過程究竟安全嗎?打包成的exe文件會不會輕而易舉地被反編譯?查閱了相關資料後發現,確實可能。二、pyinstaller 的反編譯過程1.反編譯pyc文件找到了pyc文件,下面自然就是對它進行解密了。pyc其實是python程序執行過程中產生的緩存文件,我們直接運行python代碼時也會看到。對於這種格式的反編譯是比較簡單的,網上有許多工具,甚至還有很多在線工具。這裡為了方便,我就採用了一款在線工具。
  • 面試官:如何防止你的 jar 包被反編譯?
    由於Java字節碼的抽象級別較高,因此它們較容易被反編譯。本文介紹了幾種常用的方法,用於保護Java字節碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實現有多種方式。
  • selenium+python自動化78-autoit參數化與批量上傳
    前言前一篇autoit實現文件上傳打包成.exe可執行文件後,每次只能傳固定的那個圖片,我們實際測試時候希望傳不同的圖片。
  • reko - 通用反編譯工具
    反編譯器引擎以單個可執行文件或反編譯器項目文件的形式從前端接收輸入。Reko項目文件包含有關二進位文件的其他信息,有助於反編譯過程或格式化輸出。然後,反編譯器引擎繼續分析輸入二進位文件。Reko的目標是支持各種處理器體系結構和可執行文件格式的反編譯,許多軟體許可證禁止對其機器代碼二進位文件進行反編譯或其他逆向工程。僅當您具有反編譯二進位文件的合法權限時才使用此反編譯器。
  • 面試官一問:如何防止你的 jar 包被反編譯?
    Part1序由於Java字節碼的抽象級別較高,因此它們較容易被反編譯。本文介紹了幾種常用的方法,用於保護Java字節碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。
  • 手把手教學APK反編譯實現源碼閱讀
    我們編寫源程序經過編譯變成可執行文件,反編譯就是其逆過程。為什麼要需要研究反編譯?
  • Android Apk的反編譯和加密
    下面就簡單介紹一下如何將我們從網上下載的Apk文件進行反編譯得到我們想要獲得的資源文件和源碼。一、Apk文件組成  Android的應用程式APK文件說到底也是一個壓縮文件,那麼可以通過解壓縮得打裡面的文件內容,不過很顯然,當你去解壓完去查看的時候,發現裡面的很多東西和你想像中的不太一樣。
  • dnSpy反編譯、部署調試神器
    一、概要在工作當中,當程序部署了之後就算打了日誌遇到極個別的特殊異常沒有在程序日誌中體現出來或者沒有詳細的報錯原因會讓開發者非常頭疼
  • dnSpy v6.1.7,NET程序集反編譯及調試工具
    dnSpy,堪稱.NET反編譯神器。
  • .net反編譯的九款神器
    Reflector是由微軟員工Lutz Roeder編寫的免費程序。Reflector的出現使·NET程式設計師眼前豁然開朗,因為這個免費工具可以將·NET程序集中的中間語言反編譯成C#或者Visual Basic代碼。除了能將IL轉換為C#或Visual Basic以外,Reflector還能夠提供程序集中類及其成員的概要信息、提供查看程序集中IL的能力以及提供對第三方插件的支持。
  • apk反編譯之工具篇
    會後,突然說:「有沒有遊戲外掛,我最近在玩刀塔傳奇呢?」於是,buder領悟了。。。。下午小編從百度手機助手下載了DOTA2 XX 寶(省去文字2個)作為本次apk反編譯工具介紹篇的素材,30萬的下載量呦(⊙﹏⊙)bAPK是Android Package的縮寫,實質是一個zip壓縮包,通過把android sdk編譯的工程打包成一個安卓系統支持的安裝程序文件。
  • dnSpy 強大的.NET 反編譯軟體
    (給DotNet加星標,提升.Net技能)轉自:.NET西安社區cnblogs.com/xiandnc/p/10132491.html說起.NET的反編譯軟體
  • 如何反編譯Android 5.0 framework
    為了更好的適配,我們不得不對framework層進行反編譯,在Android更新到5.0後,開發人員對framework的反編譯也出現了新的變化。所以在效率方面還無法和ART運行時相比,ART運行時會在應用程式安裝的時候就通過dex2oat將dex字節碼翻譯成本地機器碼,而這個由ART翻譯出來的本地機器碼會對應著一個oat文件。