Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Writing an experimental eBPF disassembler
Search
Drumato
July 24, 2021
Programming
0
280
Writing an experimental eBPF disassembler
適当にLTネタになるかな,と思って作った話.
https://github.com/Drumato/ebpf-disasm
Drumato
July 24, 2021
Tweet
Share
More Decks by Drumato
See All by Drumato
仕様と実装で学ぶOpenTelemetry
drumato
2
1.9k
Activities about Kubernetes operation improvements as an SRE
drumato
2
510
DEMO Apps recently implemented
drumato
0
59
An incremental approach to implement an admission controller
drumato
0
170
Components of Kubernetes Cluster
drumato
0
240
cybozu-labs-youth-10th
drumato
1
1k
ELFに蔓延るNULL三姉妹
drumato
1
2.8k
Other Decks in Programming
See All in Programming
初めてのiOS関連GitHub ActionsをMarketplaceに公開するまでの実録
konifar
3
200
現代のVueとTypeScript - 型安全の活用術
minako__ph
4
3.1k
ウォンテッドリーにおけるモバイルアプリ開発 / iOSDC Japan 2024 Sponsor Session
kubode
0
220
Modular Monolith Go Server with GraphQL Federation + gRPC
110y
1
550
僕が思い描くTypeScriptの未来を勝手に先取りする
yukukotani
3
580
どうしてこうなった?から理解するActive Recordの関連の裏側
willnet
5
510
Using Livebook to build and deploy internal tools @ ElixirConf 2024
hugobarauna
0
210
フロントエンドカンファレンス北海道2024 『小規模サイトでも使えるVite 〜HTMLコーディングをよりスマートに〜』長谷川広武(ハム)
h2ham
1
2.5k
これからの時代の新標準!SwiftTestingへの移行とトラブルシューティング
uetyo
0
440
ドメイン駆動設計を実践するために必要なもの
bikisuke
3
290
仮想ファイルシステムを導入して開発環境のストレージ課題を解消する
segadevtech
2
390
実践 Advanced CallKit 〜快適な通話の実現に向けて〜
mot_techtalk
3
110
Featured
See All Featured
What's new in Ruby 2.0
geeforr
340
31k
The Brand Is Dead. Long Live the Brand.
mthomps
53
37k
No one is an island. Learnings from fostering a developers community.
thoeni
18
2.9k
Testing 201, or: Great Expectations
jmmastey
35
6.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
29
2.2k
Producing Creativity
orderedlist
PRO
340
39k
The Mythical Team-Month
searls
218
43k
A Modern Web Designer's Workflow
chriscoyier
690
190k
Typedesign – Prime Four
hannesfritz
38
2.3k
How to train your dragon (web standard)
notwaldorf
85
5.6k
A designer walks into a library…
pauljervisheath
201
24k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
Transcript
eBPF disassemblerを作る Drumato
Attention! • 完全準拠ではない • torvalds/linux/samples/bpfのkernel side sourceがそれっぽくなればOKまで をやった
背景
なんとなくeBPFについての記事を読んでた
"基本的に命令長は64bit固定" という記述を見る
素敵! disasm書きたい! (x64を想いつつ)
書く
身につける必要があった知識 • Object file上でeBPF functionがどのように表現されているか • Opcode encoding/immediateの形式を知る
あとは頑張って書く
これはassembler自作と大して変わらない
ELF Header
eBPF object file#ELF Header
eBPF object file#ELF Header
E_machine以外は普通のrelocに見える
Section Header Table
eBPF object file#SHT
eBPF object file#SHT .textはあるけど 中身は空
eBPF object file#SHT SEC("socket1")のように 書いたsymbolが sectionに
eBPF object file#SHT eBPF mapsもsectionに Entry sizeは Programで決まっていて, Shdr.sh_entsizeを読んでも わからない
Key + valueのどちらも可変なので entsizeは使えないか(linkとinfoは?)
eBPF object file#SHT これは単に"GPL\0"という文字列が 入っているだけ
Symbol table
eBPF object file#symtab
ぱっと見特に気になる点はなし
eBPF object file#summary • なんとなく以下を満たすsectionをdisasすれば良さそう ◦ Shdr.sh_type == SHT_PROGBITS ◦
Shdr.sh_flags & (SHF_ALLOC | SHF_EXECINSTR) != 0 ◦ Shdr.sh_size > 0
eBPF instruction architecture
eBPF instruction architecture#overview
eBPF instruction architecture#overview OpcodeEncoding head byteをどう解釈するか
eBPF instruction architecture#overview InstructionClass Opcodeをどう解釈するか Ex1. ic=0x04ならopcode=0x00はAdd ic=0x05ならopcode=0x00はJA
eBPF instruction format ArithOrJump Memory
eBPF instruction format ArithOrJump Memory ADD/SUB/MUL/DIV/MOD/LSH etc.. JA/JEQ/JGT/JSLT/ etc...
eBPF instruction format ArithOrJump Memory Use src field as register
If S bit is up
eBPF instruction format ArithOrJump Memory ALU/ALU64/JMP/JMP64
eBPF instruction format ArithOrJump Memory IMM/MEM/IND/ABS etc
eBPF instruction format ArithOrJump Memory Byte/Half word/Word/Double Word
eBPF instruction format ArithOrJump Memory LD/LDX/ST/STX
わかったら書く!書く!
機械語programmingは手動かす!
disasm#tips • Building block的に作ると良い ◦ Opcode type/InstClass typeを作ってEncoding typeを作る ▪
それぞれのdecoderを書く ◦ それら(とsrc/dst/offset/imm)をまとめてInstruction typeを作る ▪ decoderを次々呼ぶだけ • srcは ooooxxxx のようになっているけど,4bit rshすると使いやすい ◦ Register numberに変換する感覚
disasm#summary
disasm#summary
このくらいのしょぼ完成度なら サクッと数時間で作れる
references • Linux Socket Filtering aka Berkeley Packet Filter (BPF)
- www.kernel.org • Drumato/ebpf-disasm … 実装 ◦ 完全じゃないよ(Memory InstClassは適当)
Thanks!