0) | はじめに |
1) | コンパイラとdefine の使い方 |
2) | 簡単な Makefile の書き方 |
3) | 複数ファイルに分けて書く |
5) | ライブラリを書く |
課題) | DoS(denial of Service)プログラムを書く |
Appendix 1 | サンプルファイル |
Appendix 2 | DoS ってなに? |
DoSというテーマを扱っていますが、内容的には、「C 言語と make」です。
1) | プリプロセッサ | 「#」で始まる構文の処理(include,define,ifdef など) コメントの除去(/* */) |
2) | コンパイラ本体 | アセンブラコードの生成 |
3) | アセンブラ | アセンブラコードのコンパイル |
4) | リンケージエディタ | 外部参照の関数や変数の解析など |
ここでは、cpp の機能と define の使い方を練習します。
#define 文を利用する事により、プログラミング効率を上げる事ができます。
#include、#define、#ifdef などは、cpp により、処理されます。
サンプルコードの stream-rg-tutorial/00 ディレクトリへ進んで下さい。
「cpp main.c | less 」としてみて下さい。
「#include <stdio.h>」が展開されています。
次に、「cpp main.c -DDEBUG | less」としてみて下さい。
main の中で printf が一つ追加されているのがわかると思います。
ここでは、「-DDEBUG」というオプションを使い、「#define DEBUG」とコード内に書くのと同じ処理をしています。
「#ifdef、#endif」というのは、「もし define されていたら #endif までのプログラムを含む」という内容です。cpp により処理されます。
-DDEBUG をすると余計に出てくる printf があります。
__FILE__ には、コードのファイル名が入ります。複数ファイルを利用してコードを書いている場合には、どの部分を処理しているかがわかり、便利です。
__LINE__ には、コードの何行目であるかが入ります。これもコードのどの部分が printf されているのかがわかり、便利です。
これらのマクロは、両方とも cpp により処理されます。
debug にいきづまったら、使ってみて下さい。
/usr/include/stdio.h を見てみて下さい。 COPYRIGHT の後に #ifndef _STDIO_H_ という文と #define _STDIO_H_ という文があると思います。 これは、ヘッダファイルを書く時に一般的に使われる手法です。 #ifndef というのは、「もし、〜がdefine されていなければ」という意味です。 その直後で #define _STDIO_H_ をしているので、/usr/include/stdio.h の内容は2度コンパイルされることはありません。 これにより、C のプログラム内で以下のような事をしても問題がなくなります。
============== #include <stdio.h> #include <stdio.h> #include <stdio.h> #include <stdio.h> main() { printf("hello\n"); } ==============
それでは、2つ以上のファイルに分割してプログラムを作ってみましょう。 また、それらのファイルをコンパイルするための Makefile も同時に作ってみましょう。
UDP パケットを送るサンプル | stream-rg-tutorial/net/simple-udp/ |
チェックサムを計算するライブラリ | stream-rg-tutorial/net/lib/ |
ICMP Echo を送るプログラム | stream-rg-tutorial/net/simple-icmp/ |
src アドレスを誤魔化して UDP パケットを投げるプログラム | stream-rg-tutorial/net/src-fake/ |
さらに、ダサダサな DoS ライブラリのサンプルも同時に用意させて頂きました。
UDP パケットを送るサンプル | stream-rg-tutorial/dos-lib-sample/udp/ |
ICMP パケットを送るサンプル | stream-rg-tutorial/dos-lib-sample/icmp/ |
わからない事などがございましたら、お近くの STREAM メンバーにお聞き下さい。
最も簡単な DoS としては、単純に UDP パケットなどを大量に送信し、ネットワークを混雑させて通信をしにくくするというのが一般的です。
また、複数の場所から同時に大量のパケットを送りつけて行なう DoS は DDoS(Distributed DoS)と呼ばれます。