Language Reference

Atomeis Syntax & Compiler Guide

1. 概要

Atomeisは Python ライクなインデント構文 を持ちながら、コンパイル後に完全に暗号化・シャッフルされたバイトコードとしてGuiltyVM上で実行される言語なんだにゃん!

Python

動的型付け・インタプリタ
メモリ上の値は常に平文
デバッガで完全追跡可能

Atomeis (GuiltyAtomeis)

コンパイル型・VM実行
メモリ上の値は常に難読化
ISAシャッフル+自己回復で解析困難

2. 基本構文

2-1 変数と演算

数値は 32-bit signed 整数。演算子: + - * / ^ << >>

# Python
a = 100
b = 200
x = a + b
print(x)  # → 300
# Atomeis
a = 100
b = 200
x = a + b
reveal(x)  # → 300

→ Python とほぼ同じ記法にゃ。違いは printreveal、そして全変数が難読化される点なんだにゃん!

2-2 文字列連結(+)

文字列は + 演算子で連結できます。文字列リテラル同士はコンパイル時に結合され、変数と文字列の実行時結合もサポート。

# コンパイル時定数畳み込み
reveal("Hello" + " World")
# コンパイル時に "Hello World" に結合

# 実行時結合
name = "Alice"
reveal("Hi, " + name)
# Python 相当
print("Hello" + " World")
# → Hello World

name = "Alice"
print("Hi, " + name)
# → Hi, Alice

→ 演算子は + のみだにゃ。Python と同様の直感的な記述なんだにゃん!

2-3 文字列出力

# Python
print("hello")
print(12345)
# Atomeis
reveal("hello")
reveal(12345)

→ 文字列はプール管理されて、コンパイル時に自動で暗号化・難読化されるにゃ!

2-4 条件分岐(judge / seal)

比較演算子: == != < > <= >=

# Python
if 1 < 2:
    print("yes")
else:
    print("no")
# Atomeis
judge 1 < 2:
    reveal("yes")
seal:
    reveal("no")

if/elsejudge/seal にゃ。インデントブロックは Python と同じなんだにゃん!

2-5 ループ(spiral / orbit)

while 相当 → spiral

# Python
x = 1
while x < 5:
    print(x)
    x = x + 1

# Atomeis
x = 1
spiral x < 5:
    reveal(x)
    x = x + 1

for 相当 → orbit

# Python
for i in range(5):
    print(i)

# Atomeis
orbit i in 5:
    reveal(i)

whilespiralfor i in range(n)orbit i in n だにゃん!

2-6 関数定義(rite)/入れ子関数

# Python
def foo(a, b):
    print(a)
    print(b)
foo(10, 20)
# Atomeis
rite foo(a, b):
    reveal(a)
    reveal(b)
foo(10, 20)

defrite にゃ。関数内に関数を定義する入れ子もサポートしていて、内側の関数から外側の引数や変数にアクセス可能なんだにゃん!

入れ子関数の例

# 外側の関数
rite outer(x):
# 内側の関数
rite inner(y):
reveal(x + y) # 外側の x にアクセス可能
inner(10)

outer(5) # → 15

2-7 条件一致(stigma / fate / abyss)

switch/case/default 相当の制御構文。

# Python
x = 2
match x:
    case 1:
        print("one")
    case 2:
        print("two")
    case _:
        print("other")
# Atomeis
x = 2
stigma x:
    fate 1:
        reveal("one")
    fate 2:
        reveal("two")
    abyss:
        reveal("other")

match/casestigma/fate、default → abyss だにゃん。

2-8 ループ脱出(void)

# Python
while True:
    print("once")
    break
# Atomeis
spiral true:
    reveal("once")
    void

breakvoid にゃ。

3. I/O

Python

name = input("Name: ")
f = open("file.txt")
data = f.read()
f.close()

Atomeis

name = input("Name: ")
fid = open("file.txt")
data = read(fid)
close(fid)

→ Atomeis のファイルI/Oは関数呼び出し形式にゃ。 open がファイル記述子を返し、それを read/write/close に渡すんだにゃん。

4. データ構造

map(ハッシュマップ)

m = map_new()
map_set(m, "key", 42)
val = map_get(m, "key")

list(動的配列)

lid = map_new()
list_append(lid, 10)
list_append(lid, 20)

→ 配列インデックスは未実装にゃ。代わりにマップ・リストで代替してにゃん。

5. 特殊構文

import

ソースファイルをインクルードするにゃ。

import "lib.atx"

use_python

Python パーサーモードに切り替えるにゃ!

use_python { print("hi") }

raw

生のバイトコードを直接出力するにゃ(デバッグ用)。

void:
            raw(0x20)

getarg

CLIのコマンドライン引数を取得するにゃ。

arg = getarg(0)

exit

プログラムを終了するにゃ!

exit

check

実行時の整合性をセルフチェックするにゃ。

check

6. コンパイラ (atmc)

Atomeis のソースファイル(.atx)は atmc でコンパイルするにゃ。通常ビルド時は自動的に難読化・ISAシャッフル・メタデータ署名が付与されるんだにゃん!

# 通常ビルド(全セキュリティ有効)
atmc source.atx output
# デバッグモード(セキュリティ無効)
atmc --debug source.atx output
# 生バイトコード出力
atmc --atb source.atx output.atb

7. 実行時セキュリティ

自己整合性検証 (FNV-1a)

バイナリ末尾に刻印された8バイトのFNV-1aチェックサムと4バイトの"ATMX"フッター。1バイトでも書き換えられていれば起動時に即検知して自壊するにゃ!

アンチラッパー / 環境検知

実行時に以下の7種の解析環境を検出し、検出時は無限デコイループ(CPU使用率100%の無限計算)へ飛ばして解析ツールをフリーズさせるにゃ!

  • TracerPid(ptrace / gdb / strace)
  • LD_PRELOAD / LD_LIBRARY_PATH
  • 解析ツール環境変数(STRACE_LOG, GDB_HISTORY 等)
  • タイミング異常(デバッガによる実行遅延)
  • /proc/self/exe 整合性(バイナリラップ検出)
  • ファイルサイズ consistency check
  • 不審なメモリマッピング(rwx セグメント数)

8. 制限事項

  • 64-bit 整数演算なし(int32 / int64 対応)
  • 浮動小数点演算(float32 対応)
  • 文字列結合: 実行時 + コンパイル時定数畳み込み対応済み(演算子 +
  • 入れ子関数: 対応済み(内側から外側の変数にアクセス可能)
  • 配列インデックスなし(マップ・リストで代替)
  • 真の乱数生成なし(seedベースの疑似乱数)

9. テスト一覧

test_simple
Hello World → "hello from atomeis" 42 999
reveal("hello from atomeis")
reveal(42)
reveal(999)
exit(0)
test_add
a=100 b=200 x=a+b → 300
a = 100
b = 200
x = a + b
reveal(x)
exit(0)
test_func
関数定義と呼び出し → 10, 20
rite foo(a, b):
    reveal(a)
    reveal(b)

foo(10, 20)
exit(0)
test_judge
条件分岐 → "yes"
judge 1 < 2:
    reveal("yes")
seal:
    reveal("no")
exit(0)
test_orbit
カウントループ → 0 1 2 3 4
orbit i in 5:
    reveal(i)
exit(0)
test_while
whileループ → 1 2 3 4
x = 1
spiral x < 5:
    reveal(x)
    x = x + 1
exit(0)
test_stigma
switch文 → "two"
x = 2
stigma x:
    fate 1:
        reveal("one")
    fate 2:
        reveal("two")
    abyss:
        reveal("other")
exit(0)
GuiltyAtomeis Runtime Environment
Debugger: GDB/LLVM-View