
PEファイル向けのx64バイナリ難読化ツール。制御フローの平坦化、逆アセンブル対策、インポート難読化、命令変異を備え、リバースエンジニアリングを妨害します。
Alcatrazは、さまざまなPEファイル(.exe、.dll、.sysなど)を難読化できるx64バイナリ難読化ツールです。
Install: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) 左上隅のfileをクリックしてバイナリを読み込みます。
2.) Functionsツリーを展開して関数を追加します。(上部の検索バーに名前を入力して検索できます。)
3.) compileを押します(注: 多数の関数を難読化するには数秒かかる場合があります)。
以下のデモでは、紹介されている機能以外はすべて無効になっています。
即値がレジスタに移動される場合、複数のビット演算を適用して難読化します。人気の関数_security_init_cookieを見てみましょう。
変更前:
変更後:

コンパイラが生成した整然としたプログラム構造を取り除き、コードを新しく生成されたブロックに配置することで、プログラムの複雑性を高めます。この簡単なmain関数を例に説明します(このプログラムの最適化は無効になっています):

これをIDA 7.6で開くと、逆コンパイラは最適化を試みます:

ここで制御フローを平坦化し、IDAで再度解析してみます:

ご覧の通り、生成されたコードのごく一部しか表示していないにもかかわらず、複雑性が大幅に増加しています。CFGがどのようなものか知りたい場合は:

レジスタ(例: RAX)が別のレジスタ(例: RCX)に加算される場合、その命令を変異させます。つまり、構文は変わりますが、意味は変わりません。
命令ADD RCX, RAXは次のように変異します:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
変異について詳しく知りたい場合は、persesを参照してください。
PEファイルが.exeの場合(.dllのサポートは後日追加予定)、起動時に実際のエントリポイントを復号するカスタムエントリポイントを作成します(!!! 手動マッピングでは機能しません)。

LEA難読化は非常にシンプルですが効果的です。異なる位置をレジスタに移動し、その後復号します。これにより、リバースエンジニアは特定のデータや関数を相互参照できなくなります。
次のような命令を見つけたとします: lea rcx, [0xDEAD]
これを次のように変異します:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
バイト0xFFで始まる命令を見つけた場合、その前に0xEBを挿入します。
これは、0xEB 0xFFがjmp rip + 1にエンコードされ、最終的に実際の最初の0xFFにジャンプするためです。これにより、線形に命令をデコードするツールを混乱させます。
変更前:

変更後:

時々、次のコードを挿入することもできます:
jz 3
jne 1
0xE8
IDAは0xE8(call)をデコードしようと試みますが、成功しません:

現時点では「適切な」IAT難読化はありません。今のところ0xFFアンチディスアセンブリのトリックで対応しています。適切な実装は以下で計画されています:
iat.cpp
これは、アンチディスアセンブリ以外のすべての機能を有効にしたmain関数のスニペットです(IDAが関数を作成できるようにするため):
