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
820
関数の挙動書き換える
takato fukui
November 19, 2025
Tweet
Share
More Decks by takato fukui
See All by takato fukui
機関室の灯りは消えない
takatofukui
0
37
エンジニアリングの良い塩梅🧂🌸
takatofukui
0
52
dd-trace-goのtrace context propagation実装
takatofukui
0
500
ソフトウェアテスト
takatofukui
0
81
なぜコードを書いてはいけないか
takatofukui
0
130
リファクタリング
takatofukui
0
130
本番分析データベースを丸ごと削除した人の顔
takatofukui
0
120
Other Decks in Programming
See All in Programming
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
280
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
150
CSC307 Lecture 01
javiergs
PRO
0
690
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
dchart: charts from deck markup
ajstarks
3
1k
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
630
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
6
680
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
740
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
990
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
From π to Pie charts
rasagy
0
130
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Claude Code のすすめ
schroneko
67
210k
The Curious Case for Waylosing
cassininazir
0
240
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
170
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
740
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
460
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
400
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Paper Plane (Part 1)
katiecoart
PRO
0
4.3k
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
🤤まとめ • 機械語を読み書きするのは面白い • 通常のアプリケーションコードでやることはないし、やってはいけない