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

複数のパッケージ管理ツールを使うと紛らわしい

会社ではCentOSyum、自宅ではUbuntuのaptとMacMacPorts
三つも併用していると、こんがらがってくるのでよく使うコマンドをまとめてみる。

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からLinuxMacもある。

何かひとつ簡単なのを解いて説明しようと思ったが、寝不足なのでまた明日。

ほったらかしだったHatenaのアカウントを活用してみる

何か成果物があったら公開できるようにブログを用意しようと思う。
文体は「た・だ」体で。
今までWEBサービスGoogleに全部お任せしていたが、BloggerではTrackbackも外部のサービスに頼らないと出来ないし、Google App Engineに新しく作るのはコストがかかりすぎる。
ということで、ずっと放置してあったHatenaのアカウントを利用してみることにする。
ブログのタイトルはなんとなく。