Suche senden
Hochladen
TwitVisor
•
0 gefällt mir
•
1,585 views
S
shimada_201220655
Folgen
Technologie
Melden
Teilen
Melden
Teilen
1 von 43
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
MySQLのプロトコル解説
MySQLのプロトコル解説
Masahiro Tomita
Netty & Apache Camel
Netty & Apache Camel
ssogabe
Apache Camel Netty component
Apache Camel Netty component
ssogabe
デバドラを書いてみよう!
デバドラを書いてみよう!
Masami Ichikawa
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみた
wata2ki
ラボユース最終成果報告会(Web公開版)
ラボユース最終成果報告会(Web公開版)
Shinichi Awamoto
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
Computational Materials Science Initiative
Empfohlen
MySQLのプロトコル解説
MySQLのプロトコル解説
Masahiro Tomita
Netty & Apache Camel
Netty & Apache Camel
ssogabe
Apache Camel Netty component
Apache Camel Netty component
ssogabe
デバドラを書いてみよう!
デバドラを書いてみよう!
Masami Ichikawa
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみた
wata2ki
ラボユース最終成果報告会(Web公開版)
ラボユース最終成果報告会(Web公開版)
Shinichi Awamoto
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
Computational Materials Science Initiative
x86とコンテキストスイッチ
x86とコンテキストスイッチ
Masami Ichikawa
Node-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
SystemV IPC
SystemV IPC
Masami Ichikawa
RouterBOARD with OpenFlow
RouterBOARD with OpenFlow
Toshiki Tsuboi
Scapy presentation
Scapy presentation
ashigirl ZareGoto
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
Cape cod collectables bu473
Cape cod collectables bu473
Christine Petrone
活性粉末狀自體富含血小板之血漿PRP
活性粉末狀自體富含血小板之血漿PRP
Tom Hen
Presentasi abe-10-11-12
Presentasi abe-10-11-12
zulfakar yakub
媒體識讀
媒體識讀
Yi-chun Lu
маркетинг проекта Poworot
маркетинг проекта Poworot
Сергій Кондратюк
อาหารหลัก 5 หมู่
อาหารหลัก 5 หมู่
vaew Seangchareon
Cape cod collectables final power point
Cape cod collectables final power point
Christine Petrone
Cerpen menggenggem angin nanda sevty utomo
Cerpen menggenggem angin nanda sevty utomo
Nanda Utomo
Powdered form of PRP (platelet rich plasma)
Powdered form of PRP (platelet rich plasma)
Tom Hen
Silva et al. 2010a
Silva et al. 2010a
Lucas Silva
Cms 303 presentation
Cms 303 presentation
novealindsay
Final power point
Final power point
Christine Petrone
Japanese American Internment
Japanese American Internment
MeowMix808
Nhan sinh quan 1
Nhan sinh quan 1
Huy Trần
The battle of the coral sea
The battle of the coral sea
meleana808
Sam lightnin’ hopkins
Sam lightnin’ hopkins
kaelipyles
Weitere ähnliche Inhalte
Was ist angesagt?
x86とコンテキストスイッチ
x86とコンテキストスイッチ
Masami Ichikawa
Node-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
SystemV IPC
SystemV IPC
Masami Ichikawa
RouterBOARD with OpenFlow
RouterBOARD with OpenFlow
Toshiki Tsuboi
Scapy presentation
Scapy presentation
ashigirl ZareGoto
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
Was ist angesagt?
(6)
x86とコンテキストスイッチ
x86とコンテキストスイッチ
Node-v0.12の新機能について
Node-v0.12の新機能について
SystemV IPC
SystemV IPC
RouterBOARD with OpenFlow
RouterBOARD with OpenFlow
Scapy presentation
Scapy presentation
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Andere mochten auch
Cape cod collectables bu473
Cape cod collectables bu473
Christine Petrone
活性粉末狀自體富含血小板之血漿PRP
活性粉末狀自體富含血小板之血漿PRP
Tom Hen
Presentasi abe-10-11-12
Presentasi abe-10-11-12
zulfakar yakub
媒體識讀
媒體識讀
Yi-chun Lu
маркетинг проекта Poworot
маркетинг проекта Poworot
Сергій Кондратюк
อาหารหลัก 5 หมู่
อาหารหลัก 5 หมู่
vaew Seangchareon
Cape cod collectables final power point
Cape cod collectables final power point
Christine Petrone
Cerpen menggenggem angin nanda sevty utomo
Cerpen menggenggem angin nanda sevty utomo
Nanda Utomo
Powdered form of PRP (platelet rich plasma)
Powdered form of PRP (platelet rich plasma)
Tom Hen
Silva et al. 2010a
Silva et al. 2010a
Lucas Silva
Cms 303 presentation
Cms 303 presentation
novealindsay
Final power point
Final power point
Christine Petrone
Japanese American Internment
Japanese American Internment
MeowMix808
Nhan sinh quan 1
Nhan sinh quan 1
Huy Trần
The battle of the coral sea
The battle of the coral sea
meleana808
Sam lightnin’ hopkins
Sam lightnin’ hopkins
kaelipyles
Twitter
Twitter
Johana Martinez
Andere mochten auch
(17)
Cape cod collectables bu473
Cape cod collectables bu473
活性粉末狀自體富含血小板之血漿PRP
活性粉末狀自體富含血小板之血漿PRP
Presentasi abe-10-11-12
Presentasi abe-10-11-12
媒體識讀
媒體識讀
маркетинг проекта Poworot
маркетинг проекта Poworot
อาหารหลัก 5 หมู่
อาหารหลัก 5 หมู่
Cape cod collectables final power point
Cape cod collectables final power point
Cerpen menggenggem angin nanda sevty utomo
Cerpen menggenggem angin nanda sevty utomo
Powdered form of PRP (platelet rich plasma)
Powdered form of PRP (platelet rich plasma)
Silva et al. 2010a
Silva et al. 2010a
Cms 303 presentation
Cms 303 presentation
Final power point
Final power point
Japanese American Internment
Japanese American Internment
Nhan sinh quan 1
Nhan sinh quan 1
The battle of the coral sea
The battle of the coral sea
Sam lightnin’ hopkins
Sam lightnin’ hopkins
Twitter
Twitter
Ähnlich wie TwitVisor
Akka HTTP
Akka HTTP
TanUkkii
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
Ruo Ando
Scapy presentation Remake(訂正)
Scapy presentation Remake(訂正)
ashigirl ZareGoto
IoTデバイス センサデータ分析システム
IoTデバイス センサデータ分析システム
Yuki Nihei
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
稔 小林
ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
Ähnlich wie TwitVisor
(6)
Akka HTTP
Akka HTTP
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
法政大学情報科学部 2012年度コンピュータネットワーク-第12回授業-Web公開用
Scapy presentation Remake(訂正)
Scapy presentation Remake(訂正)
IoTデバイス センサデータ分析システム
IoTデバイス センサデータ分析システム
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
ぱっと見でわかるC++11
ぱっと見でわかるC++11
Kürzlich hochgeladen
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Kürzlich hochgeladen
(12)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
TwitVisor
1.
TwitVisor (Web公開用)� *筑波大学大学院 島田恭平 筑波大学大学院 芹川大地
1
2.
注意事項 本スライド中のソースコード等は,スライドのレイアウトの 都合上,一部省略や簡略化されている部分があります
2
3.
TwitVisorとは? — BitVisor(ver 1.2)を改変し,twitterへのツイート
投稿機能を追加 — ゲストOSを介さずにBitVisorから直接twitterへ投 稿する 3
4.
TwitVisorとは? — BitVisor(ver 1.2)を改変し,twitterへのツイート
投稿機能を追加 — ゲストOSを介さずにBitVisorから直接twitterへ投 稿する BitVisorがつぶやく 4
5.
TwitVisor(@vmm_ict)からの投稿
5
6.
開発経緯 — 大学院のグループワークの授業 —
グループで自由に問題を設定し,問題を解決するシステ ムの設計,実装を行う — 「VMMを用いた健全なコンピュータ使用支援システム」 の開発をすることに決定 — 企業で管理者が社内のPC使用状況を監視するシステム — 利点 — 使用しているOSやアプリケーションに依存しない — 管理者権限でもゲストOSからシステムを停止されない 6
7.
システム概要図(案)
7
8.
システム概要 — VMMにBitVisorを使用し,PCの使用状況を監視する —
PCの使用時間 — 入力したキー — …etc — 収集したデータをWebサーバ上に送信 8
9.
システム概要 — VMMにBitVisorを使用し,PCの使用状況を監視する —
PCの使用時間 — 入力したキー — …etc — 収集したデータをWebサーバ上に送信 送信先をtwitterにしよう 9
10.
システム概要図(改)
10
11.
システム概要図(改)
11
12.
TwitVisorの実装目標 — BitVisorからゲストOSを介さずtwitterに直 接投稿する
— 複雑な実装を極力排除する — twitter APIの仕様に沿って,実際にtweetする パケットを作成して送信する 12
13.
実装した点 — Twitterに投稿するための必要最低限のTCP実装 —
3ウェイハンドシェイク — データの送受信 — コネクション切断 — ゲストOSから独立したtwitterへの送受信機能 — OAuthに必要なデータを取得,計算する機能 13
14.
twitterに
投稿するまでの流れ Twitter BitVisor SYN=1 API SYN=1, ACK=1 ACK=1 (実際のデータ送信) リクエスト結果 リクエスト結果の応答 FIN=1 ACK=1 FIN=1 ACK=1 14
15.
twitterに
投稿するまでの流れ Twitter BitVisor SYN=1 API SYN=1, ACK=1 3ウェイ ハンドシェイク ACK=1 (実際のデータ送信) データの リクエスト結果 送受信 リクエスト結果の応答 FIN=1 ACK=1 コネクションの 切断 FIN=1 ACK=1 15
16.
3ウェイハンドシェーク
Twitter BitVisor SYN=1 API SYN=1, ACK=1 3ウェイ ハンドシェイク ACK=1 (実際のデータ送信) リクエスト結果 リクエスト結果の応答 FIN=1 ACK=1 FIN=1 ACK=1 16
17.
3ウェイハンドシェイク 実装概要
Guest OS BitVisor NIC twitter 準パススルー ドライバ ③ ① ② SYN/ ACK SYN ACK ハードウェア NIC 17
18.
3ウェイハンドシェイク/1手目(1/2) 1. SYNパケットを作る
— core/tty.cのmkudp(UDPヘッダ作成)を参考に実装 — UDPヘッダの変わりにTCPヘッダ,TCPパケットを作成する関数を作成 — mktcpHeader関数 — mktcp関数 void oneHand(u8 *sip, u16 sport, u8 *dip, u16 dport) TCPヘッダ構造体の作成 { SYNフラグ(0x02) <略> code_bit = mkcodeBit(off, off, off, off, on, off); th = mktcpHeader(sport, dport, (u32)12345, (u32)0, code_bit, (u16)1500, (u16)0); memcpy(pkt+12, “x08x00”, 2); //フレームタイプ pktsiz = mktcp(pkt+14, sip, dip, th, NULL, 0) + 14; パケット(pkt)にIPヘッダと TCPヘッダを結合 tty_tcp_putchar((char *)pkt, pktsiz); (NULLはTCPペイロード) <略> } パケット送信(次スライド) 18
19.
3ウェイハンドシェイク/1手目(2/2) 2. パケットを送信する
— core/tty.cのtty_udp_putcharを参考にtty_tcp_putcharを実装 void tty_tcp_putchar (char *pkt, unsigned int pktsiz) { 任意のパケットとパケットサイズを受け取るように <略> LIST1_FOREACH (tty_udp_list, p) { p->tty_send (p->handle, pkt, pktsiz); } } 19
20.
3ウェイハンドシェイク/2手目,3手目 — TwitterAPIからのパケットをフックする
— vpn/Se/SeVpn.cのSeVpnRecvEtherPacketにTCPフック用の関数を追加 void *SeVpnRecvEtherPacket(SE_VPN *v, SE_ETH *e) { <略> // 次のパケットを取得 packet = SeEthGetNextRecvPacket(e); 全てのTCPパケットをフックし, if (packet == NULL){return NULL;} Twitter APIのパケットならtrue (詳細は次ページ) if( hookTcpPacket(packet, 56789) ){ return NULL; } <略> } NULLを返して ゲストOSにパケットが届かないようにする 20
21.
hookTcpPacket bool hookTcpPacket(void *_packet,
u16 selected_port){ <略> if( !is_tcp(_packet) ) return false; twitter APIからの if( !is_twitter(_packet, selected_port) ) return false; パケットであることを確認 if( is_syn_ack_packet(_packet) ){ 3ウェイハンドシェークの threeHand(selected_port, seq_num, ack_num); 3手目を送信 実際にツイートする (1手目と同様に送信) tweet(); データを送信(後述) }else{ //3ウェイハンドシェークとは関係のないパケット } return true; } 21
22.
hookTcpPacket bool hookTcpPacket(void *_packet,
u16 selected_port){ <略> if( !is_tcp(_packet) ) return false; twitter APIからの if( !is_twitter(_packet, selected_port) ) return false; パケットであることを確認 if( is_syn_ack_packet(_packet) ){ 3ウェイハンドシェークの threeHand(selected_port, seq_num, ack_num); 3手目を送信 実際にツイートする (1手目と同様に送信) tweet(); データを送信(後述) }else{ //3ウェイハンドシェークとは関係のないパケット } 最低限の3ウェイハンドシェークを実装 return true; } 22
23.
データの送受信,コネクションの切断
Twitter BitVisor SYN=1 API SYN=1, ACK=1 ACK=1 (実際のデータ送信) データの リクエスト結果 送受信 リクエスト結果の応答 FIN=1 ACK=1 コネクションの 切断 FIN=1 ACK=1 23
24.
データの送受信,コネクションの切断 — 前述したhookTcpPakect関数に処理を追加 bool hookTcpPacket(void
*_packet, u16 selected_port){ <略> ①. 実際にツイートする if( is_syn_ack_packet(_packet) ){ データを送信(後述) //前述した3ウェイハンドシェークの実装 tweet(); }else{ if( is_fin_packet(_packet) ){ send_tcp_packet(/*FINに対するACKを送信*/) send_tcp_packet(/*BitVisorからもFINを送信*/) }else if( is_fin_ack_packet(_packet) ){ //切断完了の処理 }else{ //シーケンシャル番号,ACK番号を更新しACKを送信する send_tcp_packet(/*略*/); } } return true; 24 }
25.
データの送受信,コネクションの切断 — 前述したhookTcpPakect関数に処理を追加 bool hookTcpPacket(void
*_packet, u16 selected_port){ <略> ①. 実際にツイートする if( is_syn_ack_packet(_packet) ){ データを送信(後述) //前述した3ウェイハンドシェークの実装 tweet(); }else{ if( is_fin_packet(_packet) ){ send_tcp_packet(/*FINに対するACKを送信*/) send_tcp_packet(/*BitVisorからもFINを送信*/) }else if( is_fin_ack_packet(_packet) ){ //切断完了の処理 }else{ //シーケンシャル番号,ACK番号を更新しACKを送信する send_tcp_packet(/*略*/); } ②. ①で送信したリクエスト結 } 果に対してACKを返送 return true; 25 }
26.
データの送受信,コネクションの切断 — 前述したhookTcpPakect関数に処理を追加 bool hookTcpPacket(void
*_packet, u16 selected_port){ <略> ①. 実際にツイートする if( is_syn_ack_packet(_packet) ){ データを送信(後述) //前述した3ウェイハンドシェークの実装 tweet(); ③. FINを受信するとACKを返送し, }else{ こちらからもFINパケットを送信 if( is_fin_packet(_packet) ){ send_tcp_packet(/*FINに対するACKを送信*/) send_tcp_packet(/*BitVisorからもFINを送信*/) }else if( is_fin_ack_packet(_packet) ){ //切断完了の処理 }else{ //シーケンシャル番号,ACK番号を更新しACKを送信する send_tcp_packet(/*略*/); } ②. ①で送信したリクエスト結 } 果に対してACKを返送 return true; 26 }
27.
データの送受信,コネクションの切断 — 前述したhookTcpPakect関数に処理を追加 bool hookTcpPacket(void
*_packet, u16 selected_port){ <略> ①. 実際にツイートする if( is_syn_ack_packet(_packet) ){ データを送信(後述) //前述した3ウェイハンドシェークの実装 tweet(); ③. FINを受信するとACKを返送し, }else{ こちらからもFINパケットを送信 if( is_fin_packet(_packet) ){ send_tcp_packet(/*FINに対するACKを送信*/) send_tcp_packet(/*BitVisorからもFINを送信*/) }else if( is_fin_ack_packet(_packet) ){ ④. ③で送信したFINに対するACK //切断完了の処理 を受信すると切断 }else{ //シーケンシャル番号,ACK番号を更新しACKを送信する send_tcp_packet(/*略*/); } ②. ①で送信したリクエスト結 } 果に対してACKを返送 return true; 27 }
28.
TwitVisorのTCP通信の問題点 — エラー等に対する処理が全くない —
送受信パケットが欠損すると正しく通信できない — 再送機能ない — 送信パケットにフラグメントが起きることを考慮していない — 1ツイートは最大でも約1100バイト(日本語で140字の場合) — 1文字のツイートで約600バイト — 意図的に長い文字列を送信しない限りはツイートのPOSTでフラ グメンテーションを気にする必要はない 28
29.
TwitterにPOSTするデータの作成
Twitter BitVisor SYN=1 API SYN=1, ACK=1 ACK=1 (実際のデータ送信) リクエスト結果 リクエスト結果の応答 FIN=1 ACK=1 FIN=1 ACK=1 29
30.
Twitterに送信するデータ
Ethernet Header IP Header TCP Header HTTP Header OAuth header TCP ペイロード メッセージ・ボディ 30
31.
TwitterにPOSTするデータの作成 — 前述のhookTcpPacket関数内のtweet()関数で データを作成する
— 送信方法は3ウェイハンドシェークと同様 — TCPヘッダに加えてさらに各ヘッダ,データを追加 — HTTPヘッダ — Oauthヘッダ — メッセージ・ボディ — パケットの送信は3ウェイハンドシェークと同様 31
32.
HTTPヘッダ &
メッセージ・ボディの作成(1) — 接続先のURLとリクエストの種類を指定する — Twitterへの投稿は特定のURLへポストすればよい — POST http://api.twitter.com/1.1/statuses/ update.json — メッセージ・ボディ — status=【tweetしたい文字列】 — その他の値はHTTPの規定どおりにヘッダを作成する 32
33.
OAuthヘッダ — 必要な情報 —
Consumer Key(アプリ登録時に既知) — Consumer Key Secret(同上) — Access Token(同上) — Access Token Secret(同上) — Timestamp — Nonce BitVisor内で値の取得や計算が必要 — Signature — Signature Method(HMAC-SHA1固定) — Version(1.0で固定) 33
34.
Timestampの取得(1) — TimestampにはUnixtimeを指定する —
BIOS時刻から取ってくる — RTCレジスタの値を取得するget_rtc_register関数を作成 #define CMOS_ADDRESS 0x70 #define CMOS_DATA 0x71 unsigned char get_rtc_register(int reg){ u8 data; asm_outb(CMOS_ADDRESS, reg); asm_inb(CMOS_DATA, &data); return data; } 34
35.
Timestampの取得(2) — regの値を変えて年,月,日,時間,分,秒をそれぞれ取得 second =
get_rtc_register(0x00); minute = get_rtc_register(0x02); hour = get_rtc_register(0x04); day = get_rtc_register(0x07); month = get_rtc_register(0x08); year = get_rtc_register(0x09); — 取得した時刻をUnixタイムに変換 35
36.
Nonce(1) — 毎リクエストごとにランダムかつ一意な文字列 が入る
— Timestamp値をMD5でハッシュ化 — MD5ハッシュ化はBitVisorに内蔵されている OpenSSLの機能を使用 — #include <openssl/md5.h>をインクルード 36
37.
Nonce(2) — Nonceを取得するget_oauth_nonce関数を作成 #include <openssl/md5.h> void
get_oauth_nonce(char *timestamp, char *oauth_nonce){ u32 i, index = 0; char tmp[17]; TimestampをMD5で const char TO_HEX[] = “0123456789abcdef”; ハッシュ化してtmpに格納 MD5(timestamp, strlen(timestamp), tmp); 数値から文字列に変換して for(i = 0; i < MD5_DIGEST_LENGTH; i++){ oauth_nonceに格納 oauth_nonce[index] = TO_HEX[tmp[i] / 16]; oauth_nonce[index + 1] = TO_HEX[tmp[i] % 16]; index += 2; } } 37
38.
Signatureの作成 1. OAuthの仕様にしたがってSignature Base
Stringを作成する — OAuthのパラメータ等を”&”で連結し文字列を作成する — 値は全て既知なのでそのまま連結 — 連結した文字列をURLエンコーディング 2. Signature Base StringをHMAC-SHA1でハッシュ化 — キーはConsumer SecretとAccess Token Secretを”&”で連 結したもの(いずれも既知) 3. ハッシュ化した文字列をBase64エンコーディングする 38
39.
URL/Base64エンコーディング — それぞれurl_encode関数,b64_encode関数を実装 void url_encode(const
char *src, u32 src_len, char *dest, u32 *dest_len); void b64_encode(const char *src, u32 src_len, char *dest, u32 *dest_len); — 各関数内でエンコード規則にしたがってsrcをエンコードしdest に格納する 39
40.
HMAC-SHA1 — HMAC-SHA1はBitVisorに内蔵されている
OpenSSLの機能を使用 — #include <openssl/hmac.h>をインクルード — HMACマクロが使用できる HMAC( const EVP_MD EVP_sha1(), //ハッシュ化方法を選択【今回はEVP_sha1()固定】 const void *key, //前述のキー int key_len, //キーの長さ const u8 *base_str, //前述のSignature Base String size_t base_str_len, //Signature Base Stringの長さ u8 *dest, //ハッシュ化した値を格納する配列 u32 *dest_len //destの長さが格納される ); 40
41.
twitterへの投稿成功
41
42.
まとめ — BitVisorからTwitterに投稿する機能を実装 —
BitVisorにTwitterに投稿するための最低限 のTCP実装をした — OAuthヘッダを作成し,Signature等の各種 値の計算をBitVIsor内で行った *汎用的なTCP実装とはほど遠い 42
43.
おわりに — 本システムは「筑波大学大学院 ICTソリューション・ アーキテクト育成プログラム ソリューション型研究開
発プロジェクト」の支援のもと作成しました 43
Jetzt herunterladen