Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
miasm — Python製リバースエンジニアリングフレームワーク | Kitploit
ツール/GitHubGitHub/cea-sec/miasm
静的分析動的分析 (サンドボックス)リバースエンジニアリングデバッガファジングバイナリ解析
GitHubcea-sec/miasm

miasm

Python製リバースエンジニアリングフレームワーク

リポジトリを見る
3.9k48910日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
ウェブサイト

Build Status Build status Miasm tests Code Climate Join the chat at https://gitter.im/cea-sec/miasm

Miasm とは?

Miasm は、フリーかつオープンソース(GPLv2)のリバースエンジニアリングフレームワークです。 Miasm は、バイナリプログラムの解析・改変・生成を目的としています。以下は機能の非網羅的なリストです。

  • PE / ELF 32 / 64 リトルエンディアン / ビッグエンディアンのオープン・改変・生成
  • X86 / ARM / MIPS / SH4 / MSP430 のアセンブル・逆アセンブル
  • 中間言語を用いたアセンブリのセマンティック表現
  • JIT を使用したエミュレーション(動的コード解析、アンパッキングなど)
  • 自動難読化解除のための式簡略化
  • など

その他の例やデモについては、公式 ブログ をご覧ください。

目次

  • Miasm とは?
  • 基本的な例
    • アセンブル / 逆アセンブル
    • 中間表現
    • エミュレーション
    • シンボリック実行
  • どのように動作するのか?
  • ドキュメント
  • Miasm の入手方法
    • ソフトウェア要件
    • 設定
    • Windows と IDA
  • テスト
  • Miasm を既に使用しているプロジェクト
  • その他

基本的な例

アセンブル / 逆アセンブル

Miasm の x86 アーキテクチャをインポート:```pycon

from miasm.arch.x86.arch import mn_x86 from miasm.core.locationdb import LocationDB

root@kitploit:~
位置DBを取得する:```pycon
>>> loc_db = LocationDB()

行を組み立てる```pycon

l = mn_x86.fromstring('XOR ECX, ECX', loc_db, 32) print(l) XOR ECX, ECX mn_x86.asm(l) ['1\xc9', '3\xc9', 'g1\xc9', 'g3\xc9']

root@kitploit:~
オペランドを変更:```pycon
>>> l.args[0] = mn_x86.regs.EAX
>>> print(l)
XOR        EAX, ECX
>>> a = mn_x86.asm(l)
>>> print(a)
['1\xc8', '3\xc1', 'g1\xc8', 'g3\xc1']

結果を逆アセンブルする:```pycon

print(mn_x86.dis(a[0], 32)) XOR EAX, ECX

root@kitploit:~
`Machine` 抽象化の使用:```pycon
>>> from miasm.analysis.machine import Machine
>>> mn = Machine('x86_32').mn
>>> print(mn.dis('\x33\x30', 32))
XOR        ESI, DWORD PTR [EAX]

MIPS 用:```pycon

mn = Machine('mips32b').mn print(mn.dis(b'\x97\xa3\x00 ', "b")) LHU V1, 0x20(SP)

root@kitploit:~
中間表現
---------------------------

指示を作成:```pycon
>>> machine = Machine('arml')
>>> instr = machine.mn.dis('\x00 \x88\xe0', 'l')
>>> print(instr)
ADD        R2, R8, R0

中間表現オブジェクトを作成する:```pycon

lifter = machine.lifter_model_call(loc_db)

root@kitploit:~
空の ircfg を作成する:```pycon
>>> ircfg = lifter.new_ircfg()

インストラクションをプールに追加:```pycon

lifter.add_instr_to_ircfg(instr, ircfg)

root@kitploit:~
現在のプールを表示:```pycon
>>> for lbl, irblock in ircfg.blocks.items():
...     print(irblock)
loc_0:
R2 = R8 + R0

IRDst = loc_4

IRを扱う、例えば副作用を取得するなど:```pycon

for lbl, irblock in ircfg.blocks.items(): ... for assignblk in irblock: ... rw = assignblk.get_rw() ... for dst, reads in rw.items(): ... print('read: ', [str(x) for x in reads]) ... print('written:', dst) ... print() ... read: ['R8', 'R0'] written: R2

read: [] written: IRDst

root@kitploit:~
Miasm IR の詳細については、[対応する Jupyter Notebook](https://github.com/cea-sec/miasm/blob/master/doc/expression/expression.ipynb) を参照してください。

エミュレーション
---------

シェルコードを指定する場合:```pycon
00000000 8d4904      lea    ecx, [ecx+0x4]
00000003 8d5b01      lea    ebx, [ebx+0x1]
00000006 80f901      cmp    cl, 0x1
00000009 7405        jz     0x10
0000000b 8d5bff      lea    ebx, [ebx-1]
0000000e eb03        jmp    0x13
00000010 8d5b01      lea    ebx, [ebx+0x1]
00000013 89d8        mov    eax, ebx
00000015 c3          ret
>>> s = b'\x8dI\x04\x8d[\x01\x80\xf9\x01t\x05\x8d[\xff\xeb\x03\x8d[\x01\x89\xd8\xc3'

シェルコードをインポートするには、Container 抽象化を使用します:```pycon

from miasm.analysis.binary import Container c = Container.from_string(s, loc_db) c <miasm.analysis.binary.ContainerUnknown object at 0x7f34cefe6090>

root@kitploit:~
アドレス `0` のシェルコードを逆アセンブル中:```pycon
>>> from miasm.analysis.machine import Machine
>>> machine = Machine('x86_32')
>>> mdis = machine.dis_engine(c.bin_stream, loc_db=loc_db)
>>> asmcfg = mdis.dis_multiblock(0)
>>> for block in asmcfg.blocks:
...  print(block)
...
loc_0
LEA        ECX, DWORD PTR [ECX + 0x4]
LEA        EBX, DWORD PTR [EBX + 0x1]
CMP        CL, 0x1
JZ         loc_10
->      c_next:loc_b    c_to:loc_10
loc_10
LEA        EBX, DWORD PTR [EBX + 0x1]
->      c_next:loc_13
loc_b
LEA        EBX, DWORD PTR [EBX + 0xFFFFFFFF]
JMP        loc_13
->      c_to:loc_13
loc_13
MOV        EAX, EBX
RET

JITエンジンをスタックで初期化:```pycon

jitter = machine.jitter(loc_db, jit_type='python') jitter.init_stack()

root@kitploit:~
任意のメモリ位置にシェルコードを追加する:```pycon
>>> run_addr = 0x40000000
>>> from miasm.jitter.csts import PAGE_READ, PAGE_WRITE
>>> jitter.vm.add_memory_page(run_addr, PAGE_READ | PAGE_WRITE, s)

シェルコードの戻りをキャッチするためのセンチネルを作成します。```Python def code_sentinelle(jitter): jitter.running = False jitter.pc = 0 return True

jitter.add_breakpoint(0x1337beef, code_sentinelle) jitter.push_uint32_t(0x1337beef)

root@kitploit:~
アクティブなログ:```pycon
>>> jitter.set_trace_log()

任意のアドレスで実行:```pycon

jitter.init_run(run_addr) jitter.continue_run() RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000000 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000000 40000000 LEA ECX, DWORD PTR [ECX+0x4] RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 .... 4000000e JMP loc_0000000040000013:0x40000013 RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000013 40000013 MOV EAX, EBX RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000013 40000015 RET

root@kitploit:~
jitterとの対話:```pycon
>>> jitter.vm
ad 1230000 size 10000 RW_ hpad 0x2854b40
ad 40000000 size 16 RW_ hpad 0x25e0ed0

>>> hex(jitter.cpu.EAX)
'0x0L'
>>> jitter.cpu.ESI = 12

シンボリック実行

IRプールの初期化:```pycon

lifter = machine.lifter_model_call(loc_db) ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)

root@kitploit:~
デフォルトのシンボリック値でエンジンを初期化中:```pycon
>>> from miasm.ir.symbexec import SymbolicExecutionEngine
>>> sb = SymbolicExecutionEngine(lifter)

実行を開始しています:```pycon

symbolic_pc = sb.run_at(ircfg, 0) print(symbolic_pc) ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)

root@kitploit:~
同じですが、ステップログ付き(変更点のみ表示されます):```pycon
>>> sb = SymbolicExecutionEngine(lifter, machine.mn.regs.regs_init)
>>> symbolic_pc = sb.run_at(ircfg, 0, step=True)
Instr LEA        ECX, DWORD PTR [ECX + 0x4]
Assignblk:
ECX = ECX + 0x4
________________________________________________________________________________
ECX                = ECX + 0x4
________________________________________________________________________________
Instr LEA        EBX, DWORD PTR [EBX + 0x1]
Assignblk:
EBX = EBX + 0x1
________________________________________________________________________________
EBX                = EBX + 0x1
ECX                = ECX + 0x4
________________________________________________________________________________
Instr CMP        CL, 0x1
Assignblk:
zf = (ECX[0:8] + -0x1)?(0x0,0x1)
nf = (ECX[0:8] + -0x1)[7:8]
pf = parity((ECX[0:8] + -0x1) & 0xFF)
of = ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1))[7:8]
cf = (((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1)) ^ ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1)))[7:8]
af = ((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1))[4:5]
________________________________________________________________________________
af                 = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5]
pf                 = parity((ECX + 0x4)[0:8] + 0xFF)
zf                 = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1)
ECX                = ECX + 0x4
of                 = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8]
nf                 = ((ECX + 0x4)[0:8] + 0xFF)[7:8]
cf                 = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8]
EBX                = EBX + 0x1
________________________________________________________________________________
Instr JZ         loc_key_1
Assignblk:
IRDst = zf?(loc_key_1,loc_key_2)
EIP = zf?(loc_key_1,loc_key_2)
________________________________________________________________________________
af                 = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5]
EIP                = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
pf                 = parity((ECX + 0x4)[0:8] + 0xFF)
IRDst              = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
zf                 = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1)
ECX                = ECX + 0x4
of                 = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8]
nf                 = ((ECX + 0x4)[0:8] + 0xFF)[7:8]
cf                 = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8]
EBX                = EBX + 0x1
________________________________________________________________________________
>>>

具体的なECXを使って実行を再試行します。ここで、シンボリック実行/コンコリック実行がシェルコードの末尾に到達します:```pycon

from miasm.expression.expression import ExprInt sb.symbols[machine.mn.regs.ECX] = ExprInt(-3, 32) symbolic_pc = sb.run_at(ircfg, 0, step=True) Instr LEA ECX, DWORD PTR [ECX + 0x4] Assignblk: ECX = ECX + 0x4


af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5] EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = parity((ECX + 0x4)[0:8] + 0xFF) IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1) ECX = 0x1 of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8] nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8] cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8] EBX = EBX + 0x1


Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: EBX = EBX + 0x1


af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5] EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = parity((ECX + 0x4)[0:8] + 0xFF) IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1) ECX = 0x1 of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8] nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8] cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8] EBX = EBX + 0x2


Instr CMP CL, 0x1 Assignblk: zf = (ECX[0:8] + -0x1)?(0x0,0x1) nf = (ECX[0:8] + -0x1)[7:8] pf = parity((ECX[0:8] + -0x1) & 0xFF) of = ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1))[7:8] cf = (((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1)) ^ ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1)))[7:8] af = ((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1))[4:5]


af = 0x0 EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = 0x1 IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x2


Instr JZ loc_key_1 Assignblk: IRDst = zf?(loc_key_1,loc_key_2) EIP = zf?(loc_key_1,loc_key_2)


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x10 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x2


Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: EBX = EBX + 0x1


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x10 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3


Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: IRDst = loc_key_3


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x13 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3


Instr MOV EAX, EBX Assignblk: EAX = EBX


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x13 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3 EAX = EBX + 0x3


Instr RET Assignblk: IRDst = @32[ESP[0:32]] ESP = {ESP[0:32] + 0x4 0 32} EIP = @32[ESP[0:32]]


af = 0x0 EIP = @32[ESP] pf = 0x1 IRDst = @32[ESP] zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3 ESP = ESP + 0x4 EAX = EBX + 0x3


root@kitploit:~
動作の仕組み
=================

Miasmは独自の逆アセンブラ、中間言語、命令セマンティクスを内蔵しています。Pythonで書かれています。

コードをエミュレートするために、LLVM、GCC、Clang、またはPythonを使って中間表現をJITします。シェルコードやバイナリの全体または一部をエミュレートできます。Pythonのコールバックを実行して実行とやり取りでき、例えばライブラリ関数の効果をエミュレートできます。

ドキュメント
=============

いくつかのドキュメントリソースが[doc](https://github.com/cea-sec/miasm/blob/HEAD/doc)フォルダにあります。

自動生成されたドキュメントが利用可能です:
* [Doxygen](http://miasm.re/miasm_doxygen)
* [pdoc](http://miasm.re/miasm_pdoc)

Miasmの入手
===============

* リポジトリをクローン: [Miasm on GitHub](https://github.com/cea-sec/miasm/)
* Docker Hubの[Dockerイメージ](https://registry.hub.docker.com/u/miasm/)を取得

ソフトウェア要件
---------------------

Miasmは以下を使用します:

* python-pyparsing
* python-dev
* オプションで python-pycparser (バージョン >= 2.17)

コードJITを有効にするには、以下のモジュールのいずれかが必要です:
* GCC
* Clang
* LLVM with Numba llvmlite, 以下参照

'オプション'でMiasmは以下も使用可能:
* Z3、[定理証明器](https://github.com/Z3Prover/z3)

設定
-------------

ジッターを使用するには、GCCまたはLLVMが推奨されます
* GCC (任意のバージョン)
* Clang (任意のバージョン)
* LLVM
  * Debian (testing/unstable): 未テスト
  * Debian stable/Ubuntu/Kali/など: `pip install llvmlite` または[llvmlite](https://github.com/numba/llvmlite)からインストール
  * Windows: 未テスト
* Miasmのビルドとインストール:```pycon
$ cd miasm_directory
$ python setup.py build
$ sudo python setup.py install

いずれかのjitterモジュールのコンパイル中に問題が発生した場合、Miasmはエラーをスキップし、該当するモジュールを無効にします(コンパイル出力を参照)。

Windows & IDA

MiasmのIDAプラグインのほとんどは、Miasm機能のサブセットを使用しています。これらを動作させる簡単な方法は、以下を追加することです:

  • pyparsing.py to C:\...\IDA\python\ or pip install pyparsing
  • miasm/miasm directory to C:\...\IDA\python\

JITter関連の機能を除くすべての機能が利用可能になります。より完全なインストールについては、上記の段落を参照してください。

Testing

Miasmには回帰テストのセットが付属しています。すべてを実行するには:```pycon cd miasm_directory/test

Run tests using our own test runner

python test_all.py

Run tests using standard frameworks (slower, require 'parameterized')

python -m unittest test_all.py # sequential, requires 'unittest' python -m pytest test_all.py # sequential, requires 'pytest' python -m pytest -n auto test_all.py # parallel, requires 'pytest' and 'pytest-xdist'

root@kitploit:~
いくつかのオプションを指定できます:

* モノスレッディング: `-m`
* コードカバレッジの計装: `-c`
* 高速テストのみ: `-t long`(長時間テストを除外)

これらはすでにMiasmを使用しています
======================

ツール
-----

* [Sibyl](https://github.com/cea-sec/Sibyl): 関数占いツール
* [R2M2](https://github.com/guedou/r2m2): miasmをradare2プラグインとして使用
* [CGrex](https://github.com/mechaphish/cgrex): CGCバイナリ向けの標的パッチ適用ツール
* [ethRE](https://github.com/jbcayrou/ethRE): Ethereum EVMのリバースエンジニアリングツール(対応するMiasm2アーキテクチャ)

ブログ記事 / 論文 / カンファレンス
---------------------------------

* [Deobfuscation: recovering an OLLVM-protected program](http://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html)
* [Taming a Wild Nanomite-protected MIPS Binary With Symbolic Execution: No Such Crackme](https://doar-e.github.io/blog/2014/10/11/taiming-a-wild-nanomite-protected-mips-binary-with-symbolic-execution-no-such-crackme/)
* [Génération rapide de DGA avec Miasm](https://www.lexsi.com/securityhub/generation-rapide-de-dga-avec-miasm/): DGAの高速計算(フランス語の記事)
* [Enabling Client-Side Crash-Resistance to Overcome Diversification and Information Hiding](https://www.internetsociety.org/sites/default/files/blogs-media/enabling-client-side-crash-resistance-overcome-diversification-information-hiding.pdf): 間接呼び出しの潜在的な引数を検出
* [Miasm: Framework de reverse engineering](https://www.sstic.org/2012/presentation/miasm_framework_de_reverse_engineering/)(フランス語)
* [Tutorial miasm](https://www.sstic.org/2014/presentation/Tutorial_miasm/)(フランス語のビデオ)
* [Graphes de dépendances : Petit Poucet style](https://www.sstic.org/2016/presentation/graphes_de_dpendances__petit_poucet_style/): 依存関係グラフ(フランス語)

書籍
-----

* [Practical Reverse Engineering: X86, X64, Arm, Windows Kernel, Reversing Tools, and Obfuscation](http://eu.wiley.com/WileyCDA/WileyTitle/productCd-1118787315,subjectCd-CSJ0.html): Miasmの紹介(第5章「難読化」)
* [BlackHat Python - Appendix](https://github.com/oreilly-japan/black-hat-python-jp-support/tree/master/appendix-A): 日本のセキュリティ書籍のサンプル
ツールをダウンロード