簡單分析AutoIt指令碼的反編譯和程式碼格式化問題
導讀 | 這篇文章主要介紹了AutoIt 的反編譯和程式碼格式化問題分析,需要的朋友可以參考下 |
最近集中冒出一波AutoIt的惡意 來,也就多看了幾個這類的樣本。AutoIt指令碼是以“.au3”為副檔名的明文指令碼,但病毒作者自然不會把明文的指令碼放出來。所以自然用到了AutoIt自帶的這個Au2Exe的工具:
可以看到AutoIt允許使用者將au3的明文指令碼編譯成exe檔案或者a3x檔案。exe檔案自不必贅述,就是我們平時熟悉的PE檔案,但如果編譯成exe檔案,則失去了AutoIt指令碼在惡意程式領域的優勢(懂的自然懂,不細說),所以目前捕獲的大多數惡意樣本都是將指令碼編譯成a3x檔案。
網上比較多的是Exe2Au3的反編譯工具(據說早期版本的AutoIt是自帶這個工具的,後來不帶了),但下了幾個,都很耿直——真的都只能反編譯Exe檔案,而對a3x檔案表示無力。最後才找到了一個叫做Autoit3 Decompiler GUI的工具():
用這個工具,就能很簡單的將a3x檔案反編譯成au3的明文指令碼了。BUT——為什麼萬事總有個BUT——反編譯出來的指令碼看著有些憂桑……
就這程式碼格式……幾十行還可以忍,一兩百行已經是上限了……惡意程式碼動不動幾千行,看著腦袋都大啊……本著磨刀不誤砍柴工的思想,果斷寫了一個自動格式化指令碼(by Python),貼出來和大家分享下。
說明:對AutoIt瞭解不多,僅針對我目前見過的指令碼,做一個比較粗陋而暴力的格式化工作而已
#!/usr/bin/env python2.7 #-*- coding: utf-8 -*- _AU3 = ';./sample.au3'; _AU3_OUT = ';./format.au3'; _INDENT = '; '; * 4 def au3formater(line, indent): line = line.strip().lower() next_indent = indent if (line.startswith(';end';) or line.startswith(';until';) or line in (';next';, ';wend';)): indent -= 1 next_indent -= 1 elif line.startswith(';if';) and line.endswith(';then';): next_indent += 1 elif (line.startswith(';func';) or line.startswith(';for';) or line.startswith(';select';) or line.startswith(';switch';) or line.startswith(';while';) or line == ';do';): next_indent += 1 elif line.startswith(';else';) or line.startswith(';case';): indent -= 1 new_line = _INDENT * indent + line return new_line, next_indent def main(): with open(_AU3, ';r';) as fp: with open(_AU3_OUT, ';w';) as fpw: indent = 0 line = fp.readline() while line: new_line, indent = au3formater(line, indent) fpw.write(';%s\n'; % new_line) line = fp.readline() if __name__ == ';__main__';: main()
格式化完成後,看著就舒服多了(不確定是否是我個人的強迫症而已……):
當然,即便是看著舒服些了,即便是明文指令碼,幾千行的程式碼看著也是很憂桑的
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2900377/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- APK反編譯後程式碼分析(一)APK編譯
- Android反編譯和程式碼混淆Android編譯
- 反編譯之JD-GUI程式碼邏輯分析編譯GUI
- Java程式碼的編譯與反編譯那些事兒Java編譯
- 編譯程式(compiler)的簡單分析編譯Compile
- Unity單例模式,但是是取自Ultrakill反編譯程式碼Unity單例模式編譯
- 使用Reflector和Filedisassembler逆向編譯反編譯.cs.dll檔案程式碼編譯
- 編譯FFMPEG原始碼的指令碼編寫案例編譯原始碼指令碼
- Windows和Linux上均可編譯的簡單HTTP伺服器程式碼WindowsLinux編譯HTTP伺服器
- 程式碼混淆防止APP被反編譯指南APP編譯
- SQL Server 簡單備份指令碼程式碼SQLServer指令碼
- ARMCC和GCC編譯ARM程式碼的軟浮點和硬浮點問題GC編譯
- C# 反編譯問題收集C#編譯
- 程式碼格式化指令碼CodeFormat (轉)指令碼ORM
- 反編譯獲取任何微信小程式原始碼編譯微信小程式原始碼
- Cython加密python程式碼防止反編譯加密Python編譯
- C編寫的簡單密碼程式密碼
- 利用 Powershell 編寫簡單的瀏覽器指令碼瀏覽器指令碼
- apkTool反編譯apk碰到的問題APK編譯
- [譯] Swift 程式碼格式化Swift
- 一些防止java程式碼被反編譯的方法Java編譯
- Vue3原始碼分析——編譯模組和編譯器Vue原始碼編譯
- python編寫的簡單的mysql巡檢指令碼PythonMySql指令碼
- Android開發:APK的反編譯(獲取程式碼和資原始檔)AndroidAPK編譯
- JDBC的XML編碼和Delphi融合時的編碼問題JDBCXML
- 學習Ant編譯指令碼編譯指令碼
- Gradle 編譯警告亂碼問題Gradle編譯
- linux亂碼和資料庫亂碼的問題簡單排查Linux資料庫
- Java反編譯程式碼左側註釋批量清除Java編譯
- Android反編譯:反編譯工具和方法Android編譯
- 關於Basic程式直譯器及編譯原理的簡單化(1)---Basic器的語法分析及主要程式碼 (轉)C程式編譯原理語法分析
- 編寫簡單的Java程式碼:HelloWoridJava
- js實現的字串簡單編碼和解碼程式碼例項JS字串
- python反編譯之位元組碼Python編譯
- android 反編譯APK取原始碼。Android編譯APK原始碼
- 微信小程式“反編譯”實戰(二):原始碼還原微信小程式編譯原始碼
- maven的編碼問題、解決和疑問Maven
- mysql簡單的碎片清理指令碼MySql指令碼