特願 2026-046620 (請求項 11 / 14d — 旧言語カバレッジ、native binary 逆変換方向含む)

SlimeELF-rev — Linux ELF x86_64 binary → ASM + C 逆変換

tag のない Linux ELF から NASM と C のソースを bit-exact 復元。

銀行 RHEL ・防衛・組込・医療機器の source-lost / vendor-lost な Linux x86_64 native binary を、 NASM intel ソースと C ソースの両方に bit-exact 逆変換。NASM 出力は nasm + ld で再アセンブル、 C 出力は gcc -O0 -nostdlib -static でコンパイル—両方とも実 native ELF を再生成し、 実行すると原 binary と stdout が byte 完全一致するという、最も厳しい round-trip 軸を採用しています。

  • Phase A: ELF64 最小 parser + x86_64 命令 decoder (整数 hot-loop subset) + NASM intel emitter + ストレートライン C emitter
  • Phase B entry: CFG 復元 (Cooper-Harvey-Kennedy 反復 dominator + Aho/Sethi natural loop body) + 構造化 C (do { ... } while (R[1] != 0); + if/else diamond)
  • Phase B (b): 関数境界復元 (prologue/epilogue + call/ret + 自己再帰)。関数ごとに独立した C 関数を出力、call → C call、ret → return;
  • Phase B (d): inter-procedural Slot IR — 関数 = Slot ノード、call graph を IR の一級辺として昇格、deterministic JSON round-trip、自己再帰も自然に表現
  • S9 bench: ELF 8 軸 200/200 + Phase E lift v2 25/25 = 225/225 PASS (2026-05-19)、25 sample (NASM 手書き 8 + gcc -O0 -nostdlib -static 17) — recursive fact(4) = 24、2D matrix ネストループ、struct フィールド offset、SIB-byte indexing 全て ASM + C round-trip で green
  • Phase E lift v2: 関数ごとの stack-slot promotion で真の local 変数を復元 (ELF 25/25 で lift 後 C binary が原 stdout と byte 完全一致)
  • Phase E v3 PoC (loop + natural-cond 復元): regex 変換で goto + BB-label 形式を while (var <= 5) { ... } 等の可読形式へ lift。7/7 ELF loop sample (03_loop / 09_array_sum / 10_strlen / 11_signed_array / 12_int_index / 15_stride / 16_matrix) で build+run PASS、6/7 で natural-cond 復元
  • Phase F PSDP PoC (auto OpenMP 並列化): reduction ループを検出し #pragma omp parallel for reduction(...) を自動挿入。3-reduction sample (sum + product + xor) で gcc -fopenmp 4-thread 出力が serial と byte 一致を確認、binary → 等価 C → lift C → 並列 C 3 段 pipeline を実証

Linux x86_64 の銀行・防衛・組込における 「source-lost native binary」を、 決定論的変換 + 8 軸 round-trip 自動回帰 + 監査チェーンで逆変換する製品。
Windows PE32+ 側は姉妹製品 SlimePE-rev (同じ Slot IR / 共有 decoder)、forward 側は SlimeASM (HLASM + MASM)。

逆変換 PoC / 資料請求 →

主要計測値 (2026-05-19)

200 / 200
ELF 25 sample × 全 8 軸
= NASM 手書き 8 + gcc -O0 17
25 / 25
Phase E lift v2 build+run
= 真の local 変数復元
7 / 7
Phase E v3 PoC (loop 復元)
= 7 loop sample build+run、6/7 で natural-cond 復元
3 段 pipeline
Phase D 等価 C → E lift C → F 並列 C
OpenMP 4-thread と serial 出力が byte 一致 (Phase F PoC)
関数 = Slot
inter-procedural Slot IR
SlimePE-rev と共有、call graph が一級辺、自己再帰 native
~37 opcode
x86_64 命令カバレッジ
SIB / movzx / movsx / cdqe / movsxd / shl-shr-sar / and-or — SlimePE-rev と共有

市場文脈 — source-lost な Linux ELF はどこに存在するか

銀行 (Linux x86_64)近代化案件で出現する source なし / 保守 vendor なしの native ELF / .so。Heirloom / Astadia はメインフレーム HLASM が主軸で Linux native binary を扱わない。
防衛・宇宙10-30 年 frozen な closed binary (embedded Linux ELF / 計装 daemon)。vendor から source 入手不可、しかし C source 復元 + 監査チェーンが要求される。
組込・医療機器FDA / PMDA / IEC 62304 が「完全なソフトウェア記述」を要求。binary-only 部品は 監査再現可能な形式で C 化する必要あり。
運用ドキュメント「動いてるけど触れない」daemon を C 化することで、静的解析 / SBOM / CVE 監査が初めて適用可能になる。
競合関係Ghidra (NSA OSS) / IDA Pro / Hex-Rays / RetDec が既存。SlimeELF-rev の差別化は 3 点: (1) 決定論 + 8 軸 round-trip 自動回帰で「lossless」を bench で証明、(2) SlimePE-rev と統一された Slot IRで OS 横串監査 pipeline 可能、(3) 逆変換出力が gcc/ld で直接 build され、原 binary と stdout 一致

S9 bench — 全 8 軸: ELF 200/200 PASS

S9 bench harness が ELF を bit レベルで検証。Phase B で構築した x86_64 命令 decoder (~37 opcode) は姉妹製品 SlimePE-rev と共有、container 層 (ELF parser、syscall heuristic) のみ ELF 固有。

軸 1a dialect-detecttokenizer が ELF magic + ELFCLASS64 + EM_X86_64 (e_machine = 0x3E) を認識。25/25 PASS。
軸 1b opcode-recover25 sample の全 1,397 .text 命令 (NASM 177 + gcc 1,220) を decode — db 0xNN fallback 件数 = 0。25/25 PASS。
軸 2 mutation-detect.text の 1-bit flip を 5 試行 × 25 sample = 125 試行、125/125 検出。disasm 出力が必ず変わる—invariant。
軸 3 determinismNASM emit 2 回で 25 sample 全 byte 一致。25/25 PASS。
軸 4 ASM round-tripemit NASM → nasm + ld → run → 原 stdout 一致。最も厳しい軸: 2 つの実 native binary (原 + 自社) を実行して比較。25/25 PASS、recursive fact(4) = 24、2D matrix ネストループ、struct フィールド offset、SIB-byte 配列 indexing も含む。
軸 5 C round-tripemit C → gcc -O0 -nostdlib -static → run → 原 stdout 一致。ストレートライン PC dispatch + byte-addressable STACK[] による call/ret/push/pop の bit-faithful モデリング。25/25 PASS。
軸 6 structured-C round-tripCFG 復元の構造化 C (do-while + if/else + 関数別 + call → C call + ret → return;) → gcc → run → 一致。25/25 PASS (ネストループ含む)。
軸 7 Slot IR round-tripSlotImage → JSON → SlotImage → 構造同型 + JSON byte 一致の double check。関数 = Slot ノードと call graph が完全に保存される。25/25 PASS。

Phase E lift v2 — 真の local 変数復元 (25/25)

Phase D の VM 形式 C 出力 (R[] + STACK[] + mem_r/mem_w dispatcher) を構造化 C emit に変換し、関数ごとに stack-slot promotion を適用 (rbp ± offset のメモリアクセスを名前付き C local に lift)。C のスコープ規則により関数間 frame collision は自動的に解消される。

// Phase D VM 形式 (lift 前)
mem_w((R[5] + (uint64_t)((int64_t)(-8LL))), (uint64_t)(R[0]), 8);
R[0] = (uint64_t)(mem_r((R[5] + (uint64_t)((int64_t)(-8LL))), 8));

// Phase E lift v2 (lift 後)
int64_t var_m8 = 0;   /* [rbp-8] */
var_m8 = (int64_t)(R[0]);
R[0] = (uint64_t)var_m8;

25 ELF sample 全てで lift 後 C 出力を gcc -nostdlib で再ビルド、原 binary と stdout が byte 完全一致を確認。

Phase E v3 PoC — loop + natural-cond 復元 (7 ELF sample)

構造化 C emit の goto BB_TEST; BB_BODY: body; BB_TEST: cmp; if (cond) goto BB_BODY; 形式 (PC dispatch + BB label) を、まず while (1) { test; if (!cond) break; body; } 形 (v3 minimum) に lift し、続いて cmp + ZF/SF/OF + Jcc の bit レベル符号化を 自然な式 (while (var <= 5) {...}) に書き換え (Jcc 条件 semantics 準拠: je→==、jne→!=、jl→<、jge→>=、jle→<=、jg→>)。7/7 ELF loop sample で build+run PASS、6/7 で natural-cond 復元 (10_strlen は test/jne の異なる pattern を while(1)+break 形で通す)。

本 phase は現状 ELF 先行、PE32+ 拡張は roadmap (命令符号化は共有、MinGW gcc 出力の CFG pattern を吸収すれば移植可能)。

samplev3 minimumv3 fullbuild+run
03_loop✓ (var <= 5)SUM=15
09_array_sumSUM=35
10_strlen− (test/jne 異 pattern、while(1)+break で通す)LEN=14
11_signed_arraySUM=10
12_int_indexSUM=150
15_strideSTR=35
16_matrixMAT=78

Phase F PSDP PoC — reduction ループの自動 OpenMP 並列化

Phase E v3 が出力する natural form C に対して reduction-style ループを検出し、#pragma omp parallel for reduction(...) を自動挿入する。5 種類 (+= / *= / |= / &= / ^=) 対応、複数 reduction を 1 pragma にまとめる。3-reduction sample (sum + product + xor 同時) で gcc -fopenmp 4-thread 出力が serial と byte 一致を確認。

// 入力 (natural C)
for (int i = 0; i < 5; i = i + 1) {
    sum  += arr[i];   prod *= arr[i];   xorv ^= arr[i];
}

// 自動変換出力 (Phase F PSDP PoC)
#pragma omp parallel for reduction(+:sum) reduction(*:prod) reduction(^:xorv)
for (int i = 0; i < 5; i = i + 1) {
    sum  += arr[i];   prod *= arr[i];   xorv ^= arr[i];
}
// → gcc -fopenmp -O2 + 4-thread 実行 → "SUM=015 PROD=120 XOR=001"
// → serial 版と byte 一致 (原 ELF binary の semantics 完全保存)

これは 3 段 pipeline (binary → 等価 C → 可読化 C → 並列化 C) を同一プロジェクトで実証する世界唯一の事例。Hex-Rays / Ghidra / IDA Pro は「可読化 C を出すが build/run/parallelism 保証なし」で止まる。SlimeELF-rev は 3 段すべてを stdout 一致で build+run+parallel 実行下に検証する—決定的な差別化要因。

現状 ELF 先行、PE32+ Phase F 拡張は roadmap。

Sample inventory (25 ELF binary)

NASM 手書き 8 sample (研究 PoC) + gcc -O0 -nostdlib -static でビルドした実世界 C source 17。配列 indexing (SIB byte)、符号付き/なし拡張 (movsx / movzx / movsxd / cdq / cdqe)、bit 演算 (shl / shr / sar / and / or)、ネストループ、2D 配列、struct フィールド offset、再帰を網羅。

NASM-source 8 (研究 PoC、手書き整数 hot-loop subset)

01 helloSyscall write の "Hello, ELF!\n"。最小 ELF: 1 BB / 8 命令。
02 arith17 + 25 = 42 を 2 桁 ASCII 出力。idiv、add al、mov [rip+disp] 等。
03 looploop sum_loop で 1+2+3+4+5 = 15。CFG に back edge、構造化 C は do { ... } while (R[1] != 0); に復元。
04 branchcmp + jge diamond。構造化 C は if (cond) { ... } else { ... }、共通 join BB で合流。
05 computeimul rax, rbx で 6 × 7 = 42。
06 call_simple_start → do_print。prologue (push rbp; mov rbp, rsp) + epilogue (pop rbp; ret) を関数境界として認識、独立 C 関数に分割。
07 two_funcs3 関数 (_start → add_two + print_dec)。inter-procedural call graph edge 2 本。
08 recursionfactorial(4) = 24 自己再帰。call graph に self-loop edge (fact → fact)、push rbx / pop rbx の caller-saved spill を STK[] で bit-faithful 保存。

gcc -O0 -nostdlib -static 17 (本番ターゲット、実世界 C source)

01 hello (gcc)Freestanding C で "Hello, gcc -O0!\n" 出力。35 命令。
02 arith (gcc)17 + 25 = 42。真の符号付き除算 cqo + idiv。69 命令。
03 loop (gcc)For-loop で 1+2+3+4+5 = 15。71 命令。
04 branch (gcc)if (x >= 5)leave 含む完全 epilogue。46 命令。
05 compute (gcc)6 × 7 = 42 の 2-op imul + 複数 syscall。68 命令。
06 call_simple (gcc)_start → static void do_print(void) → sys_exit。3 関数境界復元。41 命令。
07 two_funcs (gcc)helper add_two() + print_dec()。call graph 5 関数ノード、rdi 経由 inter-procedural 引数渡し bit-faithful。84 命令。
08 recursion (gcc)C 記述 fact(4) = 24 再帰。call graph に self-loop edge。85 命令。
09 array_sum (gcc)arr[5] = {3,5,7,9,11} 合計 → SUM=35SIB byte 配列 indexing。72 命令。
10 strlen (gcc)手書き strlen で "Hello, World!\n"LEN=14movzx + test al, al 終端 loop。81 命令。
11 signed_array (gcc)符号付き char 配列 {-3, 5, -8, 12, 4} 合計 → SUM=10movsx + 符号付き演算。74 命令。
12 int_index (gcc)int i 配列ループ + 3 桁出力 → SUM=150cdqe + 32-bit op variant。89 命令。
13 bitshift (gcc)32 << 3 = 256、>> 1 = 128VAL=128shl / shr / sar。86 命令。
14 bitmask (gcc)0xFF12 & 0xFF = 18RES=18and r/m64, imm8 マスク。65 命令。
15 stride (gcc)ストライドアクセス arr[i*3]STR=35。SIB 添字ロード。72 命令。
16 matrix (gcc)3×4 行列のネスト合計 → MAT=782D 配列 + ネスト CFG、SIB 形式 lea で row offset。85 命令。
17 struct (gcc)struct 配列 pts[3] = {{10,20},{30,40},{50,60}} field 合計 → PT=210SIB + displacement field offset。107 命令。

関数 = Slot ノード、call graph を IR の一級辺 (Phase B (d))

各関数を SlotFunction ノードとして、call edge は IR の一級 (関数ごとの callee 名リスト)。自己再帰は自然に self-loop edge。完全な SlotImage は deterministic JSON で encode/decode (軸 7 round-trip)、call graph と関数構造を 外部ツールチェーン (監査 DB、SBOM、静的解析) へ情報損失なく流せる。Slot IR schema は SlimePE-rev と統一、OS 横串監査 pipeline 構築可能。

監査適合性 (金融・防衛・医療機器)

  • bit-exact同じ ELF 入力 → 同じ sha256 NASM/C 出力。CFG / 関数境界 / 命令ストリーム全て完全決定論的。
  • native ELF round-trip出力 NASM を nasm + ld で再アセンブル、出力 C を gcc -nostdlib で compile、2 つの実 native ELF を実行して原 binary と stdout を比較。シミュレーションでなく実機検証。
  • 改ざん検出.text の 1-bit flip で必ず disasm が変わる。25 × 5 = 125/125 検出—改ざんは即座に可視化される。
  • determinism同じ ELF を 2 回 disasm + emit で byte 一致。並列・GPU 実行下でも安定。
  • Slot IR 監査関数 = Slot ノード + call graph を deterministic JSON で永続化。SBOM / 監査 DB pipeline に構造化資産として接続。
  • build-time LLMLLM は decoder rule 構築時のみ。runtime は決定論的 rule-based—銀行・防衛の監査要件と整合。

サポート命令 (SlimePE-rev と共有、~37 pattern)

データ移動mov reg/mem, imm/reg (B8+r / 89 /r / 8B /r / C7 /0 / 88 /r、64-bit + 32-bit) / movzx r32/64, r/m8 (0F B6 /r、zero-extend) / movsx r32/64, r/m8 (0F BE /r、sign-extend) / lea r64, m (8D /r、SIB / [reg+disp] / [rip+disp] 全形式) / nop / leave
算術add / sub r/m, r / imul r, r/m (REX.W 0F AF) / idiv r/m (F7 /7) / cqo / cdqe / cdq / movsxd r64, r/m32
論理and / or / xor r/m64, r64 / xor reg, reg idiom = zero-init
bit shiftshl / shr / sar r/m, imm8 (C1 /N) / shl / shr / sar r/m, 1 (D1 /N)
compare / testcmp r/m64, r64 / cmp r/m, imm8 (83 /7) / test r/m, r
分岐Jcc rel8/32 (je / jne / jge / jg / jl / jle / jb / jae / jbe / ja / js / jns ...) / jmp rel8/32 / loop rel8 (E2)
call / stackcall rel32 (E8) / ret (C3) / push/pop r64 (50-5F) / push imm
system (ELF)syscall (0F 05) — sys_write (rax=1) / sys_exit (rax=60) を heuristic で認識。(PE32+ は IAT-indirect call。SlimePE-rev 参照。)
memory operand[reg] / [reg+disp8/32] / [rip+disp32] / [base+index*scale+disp] (SIB byte、scale=1/2/4/8、REX.X による index 拡張) — [rbp-disp] local 変数アクセス、[rax*8+disp] 配列 indexing 完全カバー。

次フェーズ拡張: printf / malloc / PLT/GOT 動的リンク、SSE2 / SSE4 (XMM + 浮動小数点)、3-op imul r64, r/m64, imm32movabs r64, imm64

License モデル

課金対象WASM/WASI converter ツール (開発者側)
非課金生成された NASM / C source (顧客資産、永久デプロイ)
方式Ed25519 144B 署名 license + 3-hop air-gap activation (金融・防衛監査対応)
並列化 (PSDP)本製品に含まれない。SlimeNENC 内の独立 SKU PSDP 参照。

関連資料

  • 姉妹 (同 OS、forward)SlimeASM — HLASM + Win x64 MASM forward 変換。
  • 姉妹 (Windows 逆変換)SlimePE-rev — Windows PE32+ x86_64 逆変換、同じ Slot IR + 共有 decoder。
  • 逆変換ファミリー overviewSlimeASM-rev landing — 逆変換ファミリー総合ページ。
  • Slot IR 共有ファミリーSlimeCOBOL / SlimePL/I / SlimeRPG / SlimeMUMPS が同じ Slot IR (Core64 + Ext32 fixed-bit) を共有。
  • 特許出願特願 2026-046620 v15b、請求項 11 / 14d。

逆変換 PoC / 資料請求 SlimeNENC ファミリーへ戻る SlimePE-rev (Windows pair)