狠狠撸

狠狠撸Share a Scribd company logo
LibPGEN	
 ?version	
 ?1.0
1st ステップガイド
Slank	
 ?	
 ?[@slankdev,	
 ?http://slankdev.net]
libpgen.org 1
Who	
 ?is	
 ?Slank	
 ??
oパケットが好きな大学生
oLibPGEN開発者
oIPA	
 ?Security	
 ?Camp	
 ?2015	
 ?卒業生
o学生の間はパケット屋さんになりたいです。
libpgen.org 2
What	
 ?Is	
 ?LibPGEN	
 ??
?http://libpgen.org
?パケット解析を簡単に行うためのライブラリ
?C++で開発している
?Linux,	
 ?BSDで動作します(もちろんOSXも)
?ネットワークインターフェースを使わないなら
windowsでも動くはず。。(まだ試していない)
?プロトコル対応数はまだ少ない
?その代わりに拡張しやすい設計を
libpgen.org 3
Agenda
1. LibPGENの使用例
2. 設計について
3. LibPGENの機能紹介
libpgen.org 4
libpgen.org 5
Sample	
 ?Codes	
 ?with	
 ?LibPGEN
?詳細な使用方法を説明する前に簡単なサンプ
ルコードで感じ取ってください。。。
libpgen.org 6
Easy	
 ?Packet	
 ?Capture
?簡単なパケットキャプチャプログラム
?ネットワークインターフェースから受信したパケッ
トを簡単にLibPGENで解析します
?プログラムの流れ
1. パケットを受信待機
2. 受信したら情報表示
libpgen.org 7
Sample	
 ?Code
libpgen.org 8
Execution	
 ?Result
libpgen.org 9
ARP	
 ?Scan	
 ?Program
?ARPパケットを送ってIPアドレスからMACアドレス
を調べるプログラム
?プログラムの流れ
1. ARPパケット作成、送信
2. パケット受信待機
3. 送信先からのARPパケットならそのパケットを表示
libpgen.org 10
Sample	
 ?Code
libpgen.org 11
Execution	
 ?Result
libpgen.org 12
Could	
 ?You	
 ?Feel	
 ??
?なんとなくわかってもらえればとても幸せです。
?ここからは詳しくLibPGENの構造と使いかたを説
明していきます。
libpgen.org 13
libpgen.org 14
LibPGENのアーキテクチャ
libpgen.org 15
3	
 ?Big	
 ?Components
?LibPGENは大きく3つに分けられる。
? PGEN-?‐IO	
 ? 入出力関数群
? PGEN-?‐Core アドレスやパケットのバイナリを解析
? PGEN-?‐Module PGEN-?‐IO,PGEN-?‐Coreを使ったモジュール群
libpgen.org 16
PGEN-?‐IO
?バイナリの入出力用の関数群
?入出力先はネットワークインターフェース、pcap
ファイルに対応しています。(NGは現在実装中)
?ライブラリのコアの開発に参加しない場合はほと
んど意識しなくて構わないので、詳しい説明は公
式ドキュメントを参考にしてください
?http://libpgen.org/documentation/pgen-?‐io
?よく使う関数だけ紹介します
libpgen.org 17
pgen_open()	
 ?in	
 ?PGEN-?‐IO
?pgen_t*	
 ?pgen_open(const	
 ?char*	
 ?if,	
 ?void*	
 ?nouse)
?ネットワークインターフェースを指定してパケット
の送受信用のディスクリプタを確保
?第二引数は予約用でまだ使わない
?成功すると、ディスクリプタのポインタ、失敗する
とNULLを返す
libpgen.org 18
pgen_open_offline()	
 ?in	
 ?PGEN-?‐IO
?pgen_t*	
 ?pgen_open_offline(
const	
 ?char*	
 ?f,	
 ?int mode)
?pgen_open()のpcapファイル版。
?pcapファイルの読み書き用のディスクリプタを確
保
?第一引数にファイル名、第二引数にモードを指
定する。
?成功すればディスクリプタのポインタ、失敗すれ
はNULLを返す
libpgen.org 19
pgen_close()	
 ?in	
 ?PGEN-?‐IO
?void	
 ?pgen_close(pgen_t*	
 ?handle)
?確保したディスクリプタを開放する。
?マナーとして
libpgen.org 20
pgen_perror()	
 ?in	
 ?PGEN-?‐IO
?void	
 ?pgen_perror(const	
 ?char*	
 ?msg)
?標準ライブラリ関数のperror関数のLibPGEN版
?内部でエラー番号を持っているので、それを利
用して情報出力する。
libpgen.org 21
That’s	
 ?a	
 ?PGEN-?‐IO
?こんな感じの基本関数から、細かいとこまで手を
伸ばす関数までいろいろあります。
?さらに詳しい情報は公式ドキュメント
?http://libpgen.org/documentation/pgen-?‐io/
libpgen.org 22
PGEN-?‐Core
?最も重要で機能豊富なコンポーネント
?パケット解析を担当
?PGEN-?‐PacketとPGEN-?‐Addressの二つを子に持つ
コンポーネント
?さらに詳しい情報は公式ドキュメントを参照
?http://libpgen.org/documentation/pgen-?‐core/
libpgen.org 23
PGEN-?‐Address	
 ?in	
 ?PGEN-?‐Core
?アドレス操作を簡単に行えるようにするクラス群
?以降のPGEN-?‐Packetでさんざん出てくるので、こ
こでの説明は省略します
?簡単に説明すると、アドレス操作をNULLポインタ
文字列で操作できるようにしました。
libpgen.org 24
PGEN-?‐Packet	
 ?in	
 ?PGEN-?‐Core
?パケット解析を行うLibPGENの核
?プロトコルごとに様々なクラスがたくさんある
?標準でサポートしているのは
Ethernet,	
 ?ARP,	
 ?IP,	
 ?ICMP,	
 ?TCP,	
 ?UDP
(2015/12/07現在)
libpgen.org 25
PGEN-?‐Packet	
 ?in	
 ?PEGN-?‐Core
libpgen.org 26
?クラスの継承関係は以下のようになっている。
PGEN-?‐Packet	
 ?in	
 ?PGEN-?‐Core
?それぞれのクラスは親クラスのメンバも保持する
?ex)	
 ?pgen_ipクラスは
pgen_packet,	
 ?pgen_ethのメンバも保持する
libpgen.org 27
PGEN-?‐Packet	
 ?in	
 ?PGEN-?‐Core
?よく使うメンバ関数
? send(pgen_t*	
 ?handle)	
 ?,
send_dev(const	
 ?char*	
 ?if) パケット送信
? cast(const	
 ?void*	
 ?buf,	
 ?int buflen) バイナリ解析
? hex(),	
 ?info(),	
 ?summary(),	
 ?help() 情報出力
? clear() 要素値リセット
?たまに使うメンバ関数
? byte()	
 ?	
 ?	
 ?	
 ? パケット先頭ポインタ
? length() パケット長
libpgen.org 28
send(),	
 ?send_dev()	
 ?in	
 ?PGEN-?‐Packet
?void	
 ?send(pgen_t*	
 ?handle)
? PGENディスクリプタを指定してパケットを送信
? 引数のディスクリプタはpgen_open()やpgen_open_offline()などで
確保したものを指定する。
?void	
 ?send(const	
 ?char*	
 ?if)
? ネットワークインターフェースを指定してパケットを送信
? 引数にはインターフェース名を指定(ex.	
 ?“wlan0”など)
libpgen.org 29
cast()	
 ?in	
 ?PGEN-?‐Packet
?void	
 ?cast(const	
 ?void*	
 ?buf,	
 ?int buflen)
? バイナリを解析してメンバ変数に格納する
? buf,	
 ?buflenにはバイナリの先頭ポインタ、バイナリ長を指定する。
libpgen.org 30
hex(),	
 ?info(),	
 ?summary(),	
 ?help()
in	
 ?PGEN-?‐Packet
?情報出力用関数
?void	
 ?hex()
? パケットのhexdumpを出力
?void	
 ?info()
? 詳細情報を出力
?void	
 ?summary()
? 簡易情報を一行で出力
?void	
 ?help()
? メンバ変数の使い方を出力
libpgen.org 31
Protocols	
 ?of	
 ?PGEN-?‐Packet
?PGEN-?‐Packetは標準でEthernet,	
 ?ARP,	
 ?IP,	
 ?ICMP,	
 ?
TCP,	
 ?UDPをサポート
?プロトコルごとのクラスの簡単な使い方は後述
libpgen.org 32
PGEN-?‐Module
?PGEN-?‐IO,	
 ?PGEN-?‐Coreを使って作られたモジュー
ル群
?現在安定版なのはsniff()のみ
?sniff()はパケット受信で使用
libpgen.org 33
sniff()	
 ?in	
 ?PGEN-?‐Module
?void	
 ?sniff(pgen_t*	
 ?handle,	
 ?
bool	
 ?(*callback)(const	
 ?u_char*	
 ?buf,	
 ?int buflen))
?handleで指定されたインターフェースからパケッ
トを一つ受信し、そのパケットを第二引数の
callback()に渡す。
?callback()がtrueを返す間パケットを受信し続ける
libpgen.org 34
libpgen.org 35
For	
 ?Analyze	
 ?Protocols
?先ほど飛ばした PGEN-?‐Packetの派生クラスにつ
いて説明します
?作者お気に入りのプロトコルのクラスをいくつか
紹介します
libpgen.org 36
pgen_arp class
?お気に入りプロトコル
?メンバ変数
? ETH.src
? ETH.dst
? ETH.type
? ARP.operation
? ARP.hwsrc
? ARP.psrc
? ARP.hwdst
? ARP.pdst
libpgen.org 37
pgen_tcp class
? メンバ変数
? ETH…(省略)
? IP.hlen
? IP.tos
? IP.tot_len
? IP.id
? IP.frag_off
? IP.ttl
? IP.protocol
? IP.src
? IP.dst
libpgen.org 38
? TCP.src
? TCP.dst
? TCP.seq
? TCP.ack
? TCP.doff
? TCP.flags.fin
? TCP.flags.syn
? TCP.flags.rst
? TCP.flags.psh
? TCP.fgags.ack
? TCP.flags.urg
? TCP.window
That’s	
 ?a	
 ?PGEN-?‐Packet
?このようにして、プロトコルごとのパケットを詳しく
簡単に解析します。
?他のプロトコルに関する情報は公式ドキュメント
を参照してください。
?http://libpgen.org/pgen-?‐core/packet-?‐class
libpgen.org 39
How	
 ?Do	
 ?You	
 ?Think	
 ??
?これで基本的な使用方法は説明しました。
?LibPGENの構造、使い方の基本は以上です
?ぜひ使って文句をたくさん
?これで楽しくパケット解析をするだけ……
libpgen.org 40
What	
 ?is	
 ?Next…
?今回はLibPGENの簡単な使い方を紹介しました。
?次回はLibPGENの「拡張しやすい設計」
について紹介します
?ライブラリの詳しい情報は
http://libpgen.orgを参照してください
libpgen.org 41

More Related Content

LibPGEN 1st Step Guide