ctypesの三つのロード方法
ctypesではDLLのロード方法が三つある。
cdll、windll、oledllの三つだが、その違いはcallされた時のスタックの扱いと、戻り値だ。
ややっこしいのでまとめてみる。
cdllで呼び出すべき関数
- cdecl呼び出し規約に従う
- intを返す
windllで呼び出すべき関数
- stdcall呼び出し規約に従う
- intを返す
oledllで呼び出すべき関数
- stdcall呼び出し規約に従う
- HRESULTを返す
cdeclとstdcallの違いは、Wikipediaが詳しい。
要は、引数をスタックにpushして関数を呼び出すのは同じだが、そのスタックを元に戻す責任があるのが、呼び出された関数側なのか、呼び出した側なのかの違い。
ctypesを使ってみる
ctypesを使うとPythonからDLLや、Shared libraryを呼び出すことが出来る。
ctypes_test.py
from ctypes import * msvcrt = cdll.msvcrt message = "Python ctypes test\n" msvcrt.printf(message)
ポインタや構造体、ユニオンもちゃんと定義できる。
以下は型の対応表。
ctypes type | C type | Python type |
---|---|---|
c_char | char | 1-character string |
c_wchar | wchar_t | 1-character unicode string |
c_byte | char | int/long |
c_ubyte | unsigned char | int/long |
c_short | short | int/long |
c_ushort | unsigned short | int/long |
c_int | int | int/long |
c_uint | unsigned int | int/long |
c_long | long | int/long |
c_ulong | unsigned long | int/long |
c_longlong | __int64 or long long | int/long |
c_ulonglong | unsigned __int64 or unsigned long long | int/long |
c_float | float | float |
c_double | double | float |
c_longdouble | long double | float |
c_char_p | char * (NUL terminated) | string or None |
c_wchar_p | wchar_t * (NUL terminated) | unicode or None |
c_void_p | void * | int/long or None |
複数のパッケージ管理ツールを使うと紛らわしい
会社ではCentOSのyum、自宅ではUbuntuのaptとMacのMacPorts。
三つも併用していると、こんがらがってくるのでよく使うコマンドをまとめてみる。
MacPorts | yum | apt | |
---|---|---|---|
全てのパッケージから検索 | port search hoge | yum search hoge | apt-cache search hoge |
インストール | port install hoge | yum install hoge | apt-get install hoge |
アンイストール | port uninstall hoge | yum remove hoge | apt-get remove hoge |
更新可能なパッケージ一覧 | port outdated | yum check-update | |
更新可能なパッケージを全て更新 | port upgrade installed | yum update | apt-get upgrade |
インストール済みソフトウェアの表示 | port installed | yum list |
歯抜けている部分は後で追加する、つもり。
Very easyをやってみる
Crackmes.deに登録されているcrackmeの難易度は、
- 1 - Very easy, for newbies
- 2 - Needs a little brain (or luck)
- 3 - Getting harder
- 4 - Needs special knowledge
- 5 - Professional problem to solve
- 6 - Hard, for very professionals only
- 7 - Very hard
- 8 - *VERY VERY* hard
- 9 - You can't solve this yourself :)
この九段階に分かれている。
ではまず、Very easyからやってみよう。
今回挑戦するのはflipflopさんの「flipflop's dailycracking」。
さっそく実行すると、「pass:」をという文字が表示されて、入力待ちになっている。
以下は、試しにhogeを入力してみたの図。
hogeの入力に対して、wrongが表示された。
まったくノーヒントに見えるのだが、ここからリバースエンジニアリングで答えを探すということになる。
以下、ネタばれ。
Crackmes.deに登録する
知人に教えてもらってからアカウントだけ作ってずっと放置してあったCrackmes.deを、今更ながら手を付けてみる。
まずCrackmeとは、リバースエンジニアリングの練習ために用意されたプログラム。
一般のソフトウェアはライセンスなどの縛りがあるために、逆アセンブルすると違法だったり、グレーゾーンだったりして手を付けづらい。
その点Crackmeと呼ばれるプログラムなら、もともと解析されることを前提をしているので練習台としてうってつけ、ということになる。
リバースエンジニアリングを用いた、ある種のパズル的な楽しみ方ができる。
そしてCrakmes.deは、Crackmeなプログラムを投稿したり、またはその解答例を投稿したり出来るポータルサイト。
登録されているCrackmeは様々で、対象となるプラットフォームもWindowsからLinux、Macもある。
何かひとつ簡単なのを解いて説明しようと思ったが、寝不足なのでまた明日。
ほったらかしだったHatenaのアカウントを活用してみる
何か成果物があったら公開できるようにブログを用意しようと思う。
文体は「た・だ」体で。
今までWEBサービスはGoogleに全部お任せしていたが、BloggerではTrackbackも外部のサービスに頼らないと出来ないし、Google App Engineに新しく作るのはコストがかかりすぎる。
ということで、ずっと放置してあったHatenaのアカウントを利用してみることにする。
ブログのタイトルはなんとなく。