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
関数の挙動書き換える
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
takato fukui
November 19, 2025
Programming
880
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
49
エンジニアリングの良い塩梅🧂🌸
takatofukui
0
79
dd-trace-goのtrace context propagation実装
takatofukui
0
580
ソフトウェアテスト
takatofukui
0
94
なぜコードを書いてはいけないか
takatofukui
0
150
リファクタリング
takatofukui
0
150
本番分析データベースを丸ごと削除した人の顔
takatofukui
0
130
Other Decks in Programming
See All in Programming
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
130
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
440
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
130
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
650
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
590
今さら聞けない .NET CLI
htkym
0
180
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
210
VibeCodingからAgenticWorkflowへ
starfish719
0
140
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
140
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
1
120
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
810
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
390
Featured
See All Featured
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
Faster Mobile Websites
deanohume
310
32k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
41k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
240
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Claude Code のすすめ
schroneko
67
230k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
320
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
🤤まとめ • 機械語を読み書きするのは面白い • 通常のアプリケーションコードでやることはないし、やってはいけない