Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
関数の挙動書き換える
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
takato fukui
November 19, 2025
Programming
910
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
関数の挙動書き換える
takato fukui
November 19, 2025
More Decks by takato fukui
See All by takato fukui
機関室の灯りは消えない
takatofukui
0
64
エンジニアリングの良い塩梅🧂🌸
takatofukui
0
96
dd-trace-goのtrace context propagation実装
takatofukui
0
620
ソフトウェアテスト
takatofukui
0
98
なぜコードを書いてはいけないか
takatofukui
0
170
リファクタリング
takatofukui
0
160
本番分析データベースを丸ごと削除した人の顔
takatofukui
0
140
Other Decks in Programming
See All in Programming
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
380
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
190
ActionController meets Protocol Buffers
sorah
1
740
続・コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions-again
handlename
0
140
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
110
Performance Optimization With LLMs
xleitix
0
220
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
210
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
1.5k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
Groovy as a human and AI friendly programming language
paulk
0
130
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
360
Modernizing iOS Apps
seyfoyun
0
130
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
730
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
600
The browser strikes back
jonoalderson
0
1.9k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Bash Introduction
62gerente
615
220k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
590
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
770
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Transcript
☢関数の挙動書き換える ‘25/11/19 Go Connect #10 福井崇人@eyasy1217 / WebプロダクトSWE
🚀やりたいこと 2つの引数の数字を足し算する関数を、 プログラムの中から引き算に書き換えて実行する
⚙環境 • Go 1.25.4 • arm64 • Ubuntu 25.05(Lima) •
各ライブラリは最新のものを使用 ⚠ • 通常のアプリケーションでの実用性なし • 内容に誤りがあるかも • 適切なエラーハンドリングはしていない
🧱前提: 関数値(function value)の実体 2 1 配列 ptr len = 2
cap = 4 0x4000010080 refs. スライスの場合 0x400000e048 8B 8B 8B ↓ 24B
🧱前提: 関数値(function value)の実体 00 ptr 0xa4b80 0x400009c030 8B 00 機械語
関数値の場合
🧱前提: 関数値(function value)の実体 出典: "Computer Systems: A Programmer's Perspective" Figure
7.13 00 ptr 0xa4b80 0x400009c030 00 機械語 ELFのレイアウト 機械語はtextセクションに入る ので低位アドレスになる
🚀 / どう関数の挙動を書き換えるか 挙動の書き換え方はいくつかあるが、 ここではメモリに書かれた機械語を直接書き換える
🚀 / 1. 書き換える関数を定義 go tool objdump main 0xa4b80 0xa4b84
0xa4b88 0xa4b8c
🚀 / 2. 元の機械語を表示 アドレス 値 0xa4b80 00 0xa4b81 00
0xa4b82 01 0xa4b83 8b … … メモリイメージ
🚀 / 3. 機械語があるページを書き込めるようにする
🚀 / 3. 機械語があるページを書き込めるようにする XX XX 1ページ ptr len =
4096 cap = 4096 0xa4000 XX … foo関数(0xa4b80)の機械語が含まれる 変数pageSliceのイメージ pageSlice
🚀 / 4. 引き算の機械語を書き込む
🚀 / 5. 書き換え後の機械語を表示して動作確認
😅 noinlineを外すと、関数を書き換えても結果は変わらない -> foo関数は8のまま つまりはコンパイル時にこうなってるようなもの
🍏🚫 macではほとんどのケースでそのままのコードで動かない `man errno` 13 ACCES Permission denied. An attempt
was made to access a file in a way forbidden by its file access permissions.
🍏🚫 どうすれば? • MachカーネルAPI mach_vm_protectを使う • 新しいメモリ領域を割り当てて、書き換えた関数を書き込む • …
☢関数弄る系ライブラリ / bytedance/sonic • 高速なJSONシリアライズ/デシリアライズライブラリ • 型のMarshal/Unmarshalで、型専用のエンコーダー/デコーダーをJITコンパイルす る
☢関数弄る系ライブラリ / bytedance/sonic の裏ではtype Payload専用のMarshal関数を作っ てる 1. mmapで機械語を書き込むメモリ確保 2. 生成した機械語を書き込んで実行可能化す
る 3. Goの関数として扱う Marshalのイメージ
☢関数弄る系ライブラリ / agiledragon/gomonkey ↓のように使う • 関数をパッチする • テストコードで使われる
☢関数弄る系ライブラリ / agiledragon/gomonkey XX 0xXXXXX XX 機械語 YY 0xXXXXX YY
機械語 ジャンプするコードに置 き換える XX … 仕組み 関数foo パッチする関数 ZZ ZZ …
☢関数弄る系ライブラリ / agiledragon/gomonkey • macの場合はMachカーネルAPI mach_vm_protectを呼んでる https://github.com/agiledragon/gomonkey/blob/v2.13.0/write_darwin_arm64.s
🤤まとめ • 機械語を読み書きするのは面白い • 通常のアプリケーションコードでやることはないし、やってはいけない