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
takato fukui
November 19, 2025
Programming
860
4
Share
関数の挙動書き換える
takato fukui
November 19, 2025
More Decks by takato fukui
See All by takato fukui
機関室の灯りは消えない
takatofukui
0
43
エンジニアリングの良い塩梅🧂🌸
takatofukui
0
72
dd-trace-goのtrace context propagation実装
takatofukui
0
540
ソフトウェアテスト
takatofukui
0
87
なぜコードを書いてはいけないか
takatofukui
0
150
リファクタリング
takatofukui
0
150
本番分析データベースを丸ごと削除した人の顔
takatofukui
0
130
Other Decks in Programming
See All in Programming
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
290
次世代リンターで探る、tsgo 時代における型認識カスタムルールの現実解
ytakahashii
3
1.1k
サークル参加から学ぶ、小さな事業の回し方
yuzneri
0
240
開発とはなにか、Essenceカーネルで見えるもの
ukin0k0
0
220
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
860
CLIであることを活かしたGitHub Copilot CLI活用術 / GitHub Copilot CLI Pro Tips & Tricks
nao_mk2
1
1.1k
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
570
AIとRubyの静的型付け
ukin0k0
0
140
1人1案件のプロダクトエンジニア時代に、"プロセス監督"としてチャレンジしたこと
non0113
0
330
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
10
2.7k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
28
10k
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
130
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Evolving SEO for Evolving Search Engines
ryanjones
0
210
Typedesign – Prime Four
hannesfritz
42
3k
Deep Space Network (abreviated)
tonyrice
0
150
For a Future-Friendly Web
brad_frost
183
10k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Optimizing for Happiness
mojombo
378
71k
Building an army of robots
kneath
306
46k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Navigating Team Friction
lara
192
16k
Code Reviewing Like a Champion
maltzj
528
40k
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
🤤まとめ • 機械語を読み書きするのは面白い • 通常のアプリケーションコードでやることはないし、やってはいけない