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
4
790
関数の挙動書き換える
takato fukui
November 19, 2025
Tweet
Share
More Decks by takato fukui
See All by takato fukui
機関室の灯りは消えない
takatofukui
0
30
エンジニアリングの良い塩梅🧂🌸
takatofukui
0
46
dd-trace-goのtrace context propagation実装
takatofukui
0
490
ソフトウェアテスト
takatofukui
0
80
なぜコードを書いてはいけないか
takatofukui
0
120
リファクタリング
takatofukui
0
130
本番分析データベースを丸ごと削除した人の顔
takatofukui
0
120
Other Decks in Programming
See All in Programming
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
160
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
4.3k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
430
Deno Tunnel を使ってみた話
kamekyame
0
260
複雑なUI設計への銀の弾丸 「オブジェクト指向UIデザイン」
teamlab
PRO
2
110
Jetpack XR SDKから紐解くAndroid XR開発と技術選定のヒント / about-androidxr-and-jetpack-xr-sdk
drumath2237
1
200
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
1.9k
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
0
190
TestingOsaka6_Ozono
o3
0
180
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
マスタデータ問題、マイクロサービスでどう解くか
kts
0
140
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
160
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
0
310
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
32
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
320
Leo the Paperboy
mayatellez
0
1.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
What the history of the web can teach us about the future of AI
inesmontani
PRO
0
380
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
150
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
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
🤤まとめ • 機械語を読み書きするのは面白い • 通常のアプリケーションコードでやることはないし、やってはいけない