セキュリティ・リサーチ

研究結果のノート的なもの ほとんど個人用

Pythonで自己書き換えについて

ソフトウェアの暗号化技術として自己書き換えというものがある.

自己書き換えを行うことで,マルウェアが自身を書き換えることでパターンマッチングを逃れたりすることも可能である為,マルウェア解析者もこの技術について馴染み深いだろう.

この自己書き換えを行うことで改ざんを修復したり,改ざんを検知することなどが可能である.

しかし,自己書き換えは基本的なソフトウェア開発者においては不要な技術な為デフォルトでは使用できない.例えばWindowsプログラムでは.TextセグメントのWriteFlagを書き換えなければそのプログラムで自己書き換えはできない.

またマイコンではデータメモリとプログラムメモリが混同のノイマンアーキテクチャのものでしか自己書き換えはできない.

従って自己書き換えは強力な反面,使用できる環境は限定的である.

 

今回はPythonでの自己書き換えについて調査したのでここにまとめる.

最初に結論を挙げるとPythonで自己書き換えはできない.

Pythonの内部仕様について調べるとどうやらJava Virtual Machineと似たような機構Python Virtual Machineというものが存在し,Pythonで書かれたソースコードPython Byte Codeという中間言語に変換し,これをPython Virtual Machineが逐次解釈し,実行していくという流れであるようだ.

従ってPython Virtual Machineに渡されるPython Byte Codeを自己書き換えできれば良いということになるがPython Byte CodeはPython上からは書き換えが禁止されている(別の言語からPython Byte Codeを書き換える手法は存在するが,プラットフォームに依存してしまうのでここでは参考程度に挙げるのみとする).

Python Byte Codeの確認はFunction型のオブジェクト Oの次のメンバにアクセスすれば確認できる

O.func_code.co_code

例えば O.func_code.co_code = "\xx\xx\xx"ができれば,Function Oを呼び出した時に実行される処理を変更できるが,書き換え禁止されているので出来ない.

 

以上のようなことが分かった.

恐らくインタプリタ型の言語では基本的にPython同様自己書き換えは禁止されているのだろうが,どうにかして出来ないか調査した結果活路が見いだせたので,これらの結果をまとめ自己書き換えを用いたソフトウェアの耐タンパー化処理について,いずれどこかの学会等で発表する予定で,もし製品化可能であればそちらも着手していきたいと考えている.