[-]=======================================================================[-] Wizard Bible vol.17 (2005,4,29) [-]=======================================================================[-] x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ---- 第0章:目次 --- x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ○第1章:ウイルスプログラミングへの招待 〜インポートセクションを持たずにAPIを使う方法〜 まひん 著 ○第2章:人工衛星と衛星データ 多変量解析 著 ○第3章:ビバ!OllyDbg DokoDon 著 ○第4章:CCDA研修受講 D 著 ○第5章:hostsファイルの名前変更 金床 著 ○第6章:日本のクラックシーンの起源 kn0wledge 著 ○第7章:Bookmarkletでインターネットをちょっとだけ快適に えいる 著 ○第8章:吉里吉里2で作成されたソフトの解析 dori 著 ○第9章:個人でできるリアル世界でのセキュリティ2 〜護身術を中心に〜 黒猫 著 ○第10章:DHCPDoS 山本洋介山 著 ○第11章: ソーシャルエンジニアリングで秘密調査 くろいみや 著 ○第12章: Windows 2000/MEの脆弱性 Will 著 ○第13章: 東京賃貸生活ぐんにょり物語 理事長 著 ○第14章: Windows Device Driver Programming Part 1 Kenji Aiko 著 ○第15章: カード審査の実態 Aluminumovercast 著 ○第16章: ソーシャルネットワーキングサイトmixiをハクる Zer0real 著 ○第17章: 最近のアセンブリ言語本事情 eagle0wl 著 ○第18章: 音の本質 IPUSIRON 著 ○第19章: ハッカーの教科書【完全版】 編集後(悔)記 まど 著 ○第20章:お知らせ ○第21章:著者プロフィール x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第1章: ウイルスプログラミングへの招待 〜インポートセクションを持たずにAPIを使う方法〜 --- 著者:まひん x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  WindowsアプリはPEファイルという構造をしています。もっとも基本的なウイル スは感染するときに自分のPEヘッダなどは一切コピーせずにコードセクションの みを宿主ファイルにコピーします。PEファイルの構造中にWindowsAPIを使うため のインポートセクションがあることを考えると、コードセクションのみを宿主フ ァイルにコピーしてはAPIが使えないことになります。  しかし、インポートセクションをまったく持たずにAPIを使う方法があります。  ウイルスプログラミングの基本中の基本ですが、少し複雑で、DOSウイルスの作 者の多くが挫折した部分でもあります。この手法は、現在、アプリをクラックか ら保護するようなプロテクターなどにも応用されている技術です。ウイルスの技 術的おもしろさの一部を垣間見ることができるのではないかと思います。  この記事ではアセンブラにNASMを使用しています。したがって、ソースコード の書式はNASM式です。ご注意ください。 ■0x02.) 必要なAPIを使うには  自分の使いたいAPIがなんでも使えるようにするには、LoadLibrary()とGetPro cAddress()があれば大丈夫です。LoadLibrary()はDLLがロードされたベースアド レスの値を返す関数です。また、Windowsアプリはプログラムの終わりに必ずExi tProcess()を使用して終了する必要があります。この3つのAPIはすべてkernel32 .dllからエクスポートされている関数です。つまりKernel32のベースアドレスと GetProcAddress()のアドレスが取得できればいいわけです。 ■0x03.) カーネルのベースアドレスの取得  Windowsではプログラムが実行されるとKernel内からcall命令によって呼び出さ れます(CreateThread()から)。したがって、スタックには戻り先のアドレス( Kernel内のアドレス)が入っていることになります。  DLLをロードするメモリ上の位置は必ずページ単位になっています。また、DLL もPEファイルなのでMZシグネチャ、PEシグネチャといった署名があります。これ らの情報を元にカーネルのベースアドレスを知る方法を以下に示します。 ----- ;; リミッター。50ページに制限する mov ecx,5 ;; Kernel内へのリターンアドレスを取得する mov eax,[esp] ;; 下4桁を0でマスクする and eax,0FFFF0000h .check1: ;; リミッターのチェック cmp ecx,0 je .not_found ;; MZヘッダのチェック cmp word [eax],'MZ' je .check_PE .check2: ;; 次の10ページへ sub eax,10000h dec ecx jmp .check1 .check_PE: ;; PEヘッダのチェック mov edi,[eax+3ch] add edi,eax cmp word [edi],'PE' je got_k jmp .check2 -----  プログラムのスタート直後にはespにリターンアドレスが入っています。これを 「mov eax,[esp]」で取り出します。DLLがロードされる位置はxxxx0000hというア ドレスなのでAND命令を使ってマスキングします。あとは、10000hごとにMZシグネ チャを探し、さらに対応するPEシグネチャがあるかを調べることでKernelのベー スアドレスが取得できます。  この手法で見つからないことはありませんが、各OSのKernelのロードアドレス をハードコードしてもいいでしょう。 =====表 Win95/98 0bff70000h WinME 0bff60000h WinNT 077f00000h Win2000 077e00000h WinXP 07c800000h ===== ------ mov eax,0bff70000h ; win95/98 cmp word [eax],'MZ' je got_k mov eax,0bff60000h ; winME cmp word [eax],'MZ' je got_k mov eax,077f00000h ; WinNT cmp word [eax],'MZ' je got_k mov eax,077e00000h ; Win2000 cmp word [eax],'MZ' je got_k mov eax,07c80000h ; WinXP ------ ■0x04.) Kernel32のエクスポートディレクトリを探索  Kernel32.dllが提供するAPIは、エクスポートディレクトリにすべて格納されて います。エクスポートディレクトリでAPI名とそのアドレスが分かります。つまり、 エクスポートディレクトリを調べ上げることで任意のAPIのアドレスを取得できる のです。  まずNumberOfNamesをはじめとするエクスポートディレクトリの基本情報を取得 します。 ----- ;; エクスポートディレクトリ内を探索 mov esi,[edi+78h] ; エクスポートディレクトリ add esi,ecx add esi,18h lodsd ;; NumberOfNamesを保存 mov dword [NumberOfNames],eax lodsd add eax,ecx ; ベースアドレスを考慮 ;; AddressOfFunctionsを保存 mov dword [AddressOfFunctions],eax lodsd add eax,ecx ; ベースアドレスを考慮 ;; AddressOfNamesを保存 mov dword [AddressOfNames],eax lodsd add eax,ecx ; ベースアドレスを考慮 ;; AddressOfNameOrdinalsを保存 mov dword [AddressOfNameOrdinals],eax ----- ■0x05.) GetProcAddressA()のアドレスを取得  次に"GetProcAddressA"という文字列を元に、対応するアドレスを探すことにな ります。AddressOfNamesで探索するAPI名の最大値を設定します。あとは単純な文 字列比較をして、一致する箇所を確定します。 ----- ;; GetProcAddressAを探す準備 mov esi,[AddressOfNames] mov dword [nIndex],esi mov edi,[esi] add edi,ecx xor ecx,ecx lea ebx,[nGetProcAddress] ; 'GetProcAddressA',0 search_GPA: .next: mov esi,ebx .check: ;; API名が一致しているか? cmpsb jne .nextAPI cmp byte [edi],0 ; 文字列の終端か? je .got jmp .check .nextAPI: ;; 一致していないので次のAPI名へ ;; インデックスとカウンタをずらす inc ecx cmp ecx,dword [NumberOfNames] jge exit add dword [nIndex],4 mov esi,[nIndex] mov edi,[esi] add edi,[kernel] jmp .next -----  'GetProcAddressA'の文字列が見つかれば、あとはAddressOfFunctionsの対応す る位置からAPIアドレスを取得することができます。 ----- .got: mov ebx,esi inc ebx shl ecx,1 mov esi,dword [AddressOfNameOrdinals] add esi,ecx xor eax,eax mov ax,word [esi] shl eax,2 mov esi,[AddressOfFunctions] add esi,eax mov edi,dword [esi] add edi,[kernel] mov dword [aGetProcAddress],edi; GetProcAddressAのアドレスを保存 ----- ■0x06.) 取得したAPIを実際に使う  取得したGetProcAddressA()を元にBeep()のアドレスを調べます。APIの呼び出 しはアセンブリ言語では、第n引数、第n-1引数、…、第2引数、第1引数の順にPU SHして、APIをCALLすればいいだけです。 ----- GetkAPIAddress: mov esi,nBeep ; 'Beep',0 mov edi,aBeep ; Beep()のアドレスを格納する場所 ;; GetProcAddressA()を呼び出してBeep()のアドレスを取得する push esi ; 'Beep',0 ;; LoadLibraryA()で得られる値はベースアドレスそのもの! push dword [kernel] call dword [aGetProcAddress] test eax,eax je exit stosd ; aBeepにBeep()のアドレスを保存 ;; Beep(0x1000,0x1000) push 1000h push 1000h call dword [aBeep] ----- ■0x07.) ソースコード  NASMとGOLINKを使用して以下のようにすれば実行ファイルが完成します。なお、 ウイルスで用いられる基本パターンを元にしたプログラムなので、コンパイルし たときにアンチウイルスにより検出されることがあるかもしれません。理解した 上でお使いください。 ○NASM http://nasm.sourceforge.net/ ○GOLINK http://www.jorgon.freeserve.co.uk/ ----- nasm -fwin32 -O3 getapi.s golink -entry start getapi.obj ----- ----- ソースコード section .date nGetProcAddress db 'GetProcAddressA',0 nBeep db 'Beep',0 nExitProcess db 'ExitProcess',0 section .bss kernel resd 1 ; Kernel32のベースアドレス ;;; Kernel32のエクスポートディレクトリの要素 NumberOfNames resd 1 AddressOfFunctions resd 1 AddressOfNames resd 1 AddressOfNameOrdinals resd 1 ;;; GetProcAddressAを探すときに使うインデックス nIndex resd 1 ;;; 取得したAPIのアドレス aGetProcAddress resd 1 ; GetProcAddressA() aBeep resd 1 ; Beep() section .text global start start: ;; リミッター。50ページに制限する mov ecx,5 ;; Kernel内へのリターンアドレスを取得する mov eax,[esp] ;; 下4桁を0でマスクする and eax,0FFFF0000h .check1: ;; リミッターのチェック cmp ecx,0 je .not_found ;; MZヘッダのチェック cmp word [eax],'MZ' je .check_PE .check2: ;; 次の10ページへ sub eax,10000h dec ecx jmp .check1 .check_PE: ;; PEヘッダのチェック mov edi,[eax+3ch] add edi,eax cmp word [edi],'PE' je got_k jmp .check2 .not_found: ;; 調べていって見つからなければ ;; 各OSのデフォルト値を試してみる mov eax,0bff70000h ; win95/98 cmp word [eax],'MZ' je got_k mov eax,0bff60000h ; winME cmp word [eax],'MZ' je got_k mov eax,077f00000h ; WinNT cmp word [eax],'MZ' je got_k mov eax,077e00000h ; Win2000 cmp word [eax],'MZ' je got_k mov eax,07c80000h ; WinXP mov edi,[eax+3ch] add edi,eax cmp word [edi],'PE' jne exit got_k: ;; 取得したKernelのベースアドレスを保存 mov dword [kernel],eax mov ecx,eax ;; エクスポートディレクトリ内を探索 mov esi,[edi+78h] ; エクスポートディレクトリ add esi,ecx add esi,18h lodsd ;; NumberOfNamesを保存 mov dword [NumberOfNames],eax lodsd add eax,ecx ; ベースアドレスを考慮 ;; AddressOfFunctionsを保存 mov dword [AddressOfFunctions],eax lodsd add eax,ecx ; ベースアドレスを考慮 ;; AddressOfNamesを保存 mov dword [AddressOfNames],eax lodsd add eax,ecx ; ベースアドレスを考慮 ;; AddressOfNameOrdinalsを保存 mov dword [AddressOfNameOrdinals],eax ;; GetProcAddressAを探す準備 mov esi,[AddressOfNames] mov dword [nIndex],esi mov edi,[esi] add edi,ecx xor ecx,ecx lea ebx,[nGetProcAddress] search_GPA: .next: mov esi,ebx .check: ;; API名が一致しているか? cmpsb jne .nextAPI cmp byte [edi],0 ; 文字列の終端か? je .got jmp .check .nextAPI: ;; 一致していないので次のAPI名へ ;; インデックスとカウンタをずらす inc ecx cmp ecx,dword [NumberOfNames] jge exit add dword [nIndex],4 mov esi,[nIndex] mov edi,[esi] add edi,[kernel] jmp .next .got: mov ebx,esi inc ebx shl ecx,1 mov esi,dword [AddressOfNameOrdinals] add esi,ecx xor eax,eax mov ax,word [esi] shl eax,2 mov esi,[AddressOfFunctions] add esi,eax mov edi,dword [esi] add edi,[kernel] mov dword [aGetProcAddress],edi; GetProcAddressAのアドレスを保存 GetkAPIAddress: mov esi,nBeep ; 'Beep',0 mov edi,aBeep ; Beep()のアドレスを格納する場所 ;; GetProcAddressA()を呼び出してBeep()のアドレスを取得する push esi ; 'Beep',0 ;; LoadLibraryA()で得られる値はベースアドレスそのもの! push dword [kernel] call dword [aGetProcAddress] test eax,eax je exit stosd ; aBeepにBeep()のアドレスを保存 ;; Beep(0x1000,0x1000) push 1000h push 1000h call dword [aBeep] exit: mov esi,nExitProcess push esi push dword [kernel] call dword [aGetProcAddress] push 0 call eax ----- ■0x08.) おわりに  ウイルスでは、この手法を元に、ウイルス用にカスタマイズして使用すること になります(ウイルスはコードセクションのみを使用するなどの制限が出てくる からです)。  PEファイルフォーマットを理解していることを前提に書いてみましたが、PEフ ァイルフォーマットから説明しだすとキリがないので、「クラッカープログラム 大全」や近々発売予定の続編を参照していただければ幸いです。さらに、もう少 し先の話になりますが、今までのくだらないワームスクリプト作成マニュアルみ たいなものではなく、本格的なウイルス技術体系を今回の記事の100倍ぐらいわか りやすく、詳しい解説をつけて出版する予定でいます。ご期待下さい。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第2章: 人工衛星と衛星データ --- 著者:多変量解析 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  最近だと、Google map(http://maps.google.com/)やhotwireの記事など、衛 星写真関係の記事をネットでもよく見かけるようになってきました。 ○Google map http://maps.google.com/ ○hotwireの記事 http://hotwired.goo.ne.jp/news/culture/story/20050414203.html ○x51.orgの記事 http://x51.org/x/05/04/1948.php  Wizard Bibleの趣旨には関係ないかもしれませんが、地球観測衛星は軍事衛星 の民間転用として発展してきている歴史を見てみても、アングラっぽいと思って しまったという経緯があることを考慮していただけると幸いです。単なるそこら へんにいる普通の大学生が無責任に書いた文章です。事実か否かについては一切 受け付けません。間違いの指摘もなしでお願いします。テキトーに読み進めてく ださい。 ■0x02.) 人工衛星  人工衛星には色々な種類があることは皆さんはご存知であると思います。それ らの種類をどのくらい挙げることができますか? 多分、気象衛星、スパイ衛星、 GPS衛星などが主でしょう。しかし、人工衛星にはもっと多くの種類が存在します。 それでは、次に列挙してみます。 1:技術開発衛星 2:科学衛星 3:月探査機 4:惑星探査機 5:有人宇宙船 6:物質補給線 7:通信放送衛星 8:気象衛星 9:地球観測衛星 10:偵察衛星 11:早期警戒衛星 12:航行・測位衛星 13:測地衛星 14:アマチュア無線衛星 15:データ中継衛星 16:宇宙葬衛星 17:微小重力実験機  …16が気になりますが、この記事では衛星写真を回折しています。となります と、9、10、15などの衛星を中心的に扱うことになります。 ■0x03.) リモートセンシング  いきなり衛星写真の話をする前に、手法論について触れたいと思います。  リモートセンシング(以下、リモセン)とは、そのまま訳すと「対象物に直接、 触れることなく、その物体の性状を探知する」となるかと思います。人間の場合 には五感のうち、視覚、聴覚、嗅覚というセンサーで対象物をリモセンしている ことになります。様々なセンサーを開発し、稼動させることによって、人間には 到底探査することができないようなものが、科学技術の発達のおかげで探査可能 になったわけです。見えないものが見えるなんて素敵だと思います。衛星データ の場合は、「遠距離から電磁波を媒体として対象物をセンサーで探査する」こと になります。媒体として電磁波が選ばれた理由は、偏光、偏波という性質や多く の波長が利用でき、情報伝達時の変量がたくさんあるので解析対象の情報量が多 く、しかも、地上から宇宙まで少ない減衰で伝播するからです。それ以外の媒体 として考えられるものには、「圧力波」、「力の場」、そして「テレパシー」( 嘘)があるそうですが…私の理解を超えているので解説できません。 ■0x04.) 電磁波の区分  波長域の詳細はググればわかると思います。波長の短いほうから列挙します。 γ線、X線、紫外線、可視光線、近赤外線、中赤外線、熱赤外線、マイクロ波( EHF/SHF/UHF)、ラジオ波(VHF/HF/MF/LF/Vlf)、電力波となります。  今回は衛星写真ということなので、地表面をリモセンする必要があります。そ こで問題になってくるのが「大気の窓」といわれる電磁波です。これが、地表の 電磁波発信源(リモセンする場所)と人工衛星のやり取りするを邪魔します。そ こで、水蒸気の吸収帯、二酸化炭素の吸収帯、オゾンの吸収帯以外の電磁波の波 長帯を使用します。逆をいえば、大気をリモセンしたいときはそれらの波長帯を 使用すればいいわけです。しかし、大気による電磁波の吸収、散乱や大気からの 放射(熱を持つ物質は熱放射している)の影響を無視することはできません。し かも、大気条件(気温、気圧、吸収成分の濃度)、センサーの位置・方向、地表 面状態は日々変化していくため、リモセンから得られるデータの画像処理・解析 は複雑になります。そのために、吸収、散乱、放射の大気での影響(path radia nce:パスラジアンス)を精密な放射伝達モデルに従い、観測時の大気の透過率、 放射量、観測されるエネルギー量を数値シュミレーションにより計算することで 対応します。  数値シュミレーション用のソフトウェアを選ぶときは、使用目的に依存します。 計算結果が厳密解の必要ならばこれ、実用解で十分ならばこれといった感じです。 そのため、あらゆる種類のシュミレーション用のソフトウェアが提供されていま す。その中でも一番有名なのは米国空軍が開発したLOWTRANというコンピュータコ ードが有名でバージョンアップが繰り返されています、安定した数値シュミレー ションソフトとして人気があります。 ■0x05.) 地球観測衛星のセンサー  地球観測衛星のセンサーは、2つに分類できます。 ・画像センサ ・非画像センサ  さらに、それぞれについて、2つに大別できます。 ・受動型 ・能動型  受動型は初期のタイプであり、能動型は後で登場したタイプです。  受動型はその名前のとおり、受動的にデータ収集します。ただ、宇宙を漂いな がら自然現象で集まってくるデータ(太陽放射、大気散乱放射、地表の放射・反 射、熱放射)を観測します。プランクの法則から導かれる式より、温度をパラメ ーターとして波長との関係がわかるので、熱放射の波長域を観測すれば温度が推 定できます。従って、ヒートアイランドなどの地表面上の暖かいところがわかり ますし、水温とかもわかります。  能動型は人工的に発生させた放射を利用するレーザレーダ、マイクロ波レーダ などを放射し、観測します。例えば、合成開口レーダ(SAR:Synthetic Apertur e Radar)が代表的です。  地球からの衛星データの取得方法ですが、地球観測衛星は気象衛星と異なり軌 道を南北に周回する衛星であるため、地上受信局から見える範囲が狭くなり、こ うなると地球上の限られた狭い範囲の観測データしか入手できません。そこで、 データレコーダを搭載し、限られた時間(数十分らしい)に2,000コマンドぐらい 送り込んで人工衛星に仕事をさせ、地球全体をカバーします。地上受信局でしか 受信できない地域以外のデータをレコーダに一時記録し、再び地上局と直接通信 できるエリアに入ったときにデータを再生し受信局へ送信します。  また、他の方法として、データ中継衛星(「0x02」の人工衛星15)を静止衛星 軌道上に約110度離れた2箇所に置いておき、データリレーでデータ収集をします。 人工衛星の「landsat」はその恩恵を受けています。 ■0x06.) 衛星データとは  衛星データとは、人工衛星から得られる地球観測データのことです。今回は衛 星画像について触れるので地球観測衛星から得られるデータになります。衛星デ ータから得られるものは、当然ですが量子化されたデータです。1ピクセルあたり のビット数は最近では11ビットですが、一般的には8ビットで提供されることが 多いようです。昔は7ビットだったそうです。しかし、数ビットの差による画像判 定特性にはたいした差がなく無意味だという意見もあります。ビット数が少ない 方がデータ転送量が少なくすむからです。 ■0x07.) 衛星写真  はい、ようやくメインディッシュに来ました。  8ビット衛星データの場合、0〜255の256(=2^8)階調を得ます。お好きな3バ ンドを選択し、光の3原色であるRGBに割り当て統合します。すると、人工衛星デ ータからカラーの画像を得ることができます。しかし、これは普通の人たちの思 っているような「写真」とは違います。あるバンドの組み合わせをもって初めて、 いわゆる「写真」のような衛星画像ができます。これを一般的に衛星写真といっ てんじゃないのでしょうか…。  さまざまな物質にはそれらの物質がもつ個別の反射スペクトル特性があり、物 質の判別ができきるので、バンドの組み合わせによって、いわゆる「写真」とは 一味も二味も違った情報を得ることができます。厳密には間違っているかもしれ ませんが、「衛星データ=地理情報」と考えてもらえれば直感的にわかると思い ます。  衛星データの例をテキトーに列挙します。  例えば、植生、灌漑地、地表の水分、海流の流れ、地形標高、植生活性度、地 熱の状況、火山の温度分布、断層、漁場の発見、熱慣性、水質、都市の成長過程、 土地被覆など。まだまだ、たくさんありますよ。 ■0x08.) 人工衛星の寿命とは  話は変わりますが、宇宙ごみは皆さんご存知だと承知しております。人工衛星 の寿命はセンサーの故障…ではないです、センサーは壊れることはありますが、 滅多にそんなことはありません。アポジモーターの燃料が人工衛星の寿命です。 宇宙ごみなどにぶつかって、向きが変わったときに「プシュー、プシュー」って 向きを補正します。その燃料が衛星の寿命です。 ■0x09.) 人工衛星の破壊の仕方  重さが2トンクラスまでの人工衛星なら大気圏で燃やして焼却しきれると思いま すが、そうでない場合は地上3,500kmの軌道から地球から遠ざける方向に最後の燃 料を使い、アポジモーターでフッ飛ばします。ですから、今も、宇宙を漂ってい るゴミ人工衛星があります。宇宙人が拾うかもしれません。 ■0x0A.) ロケットについて  私は日本人です。h2aロケットが成功とか失敗とかTV報道されていますが、ロケ ットというのは単なる輸送システムにすぎません、事実、JAXA(宇宙航空研究開 発機構)のサイトには輸送システムって書いてあると思います。肝心なのは、ロ ケットに積んでいるものです。そうであるにもかかわらず、それが詳細に報道さ れていません。そこが目的なのに、手段ばかりが注目されています。  ロケットの形状を思い浮かべてみてください、何かに似てませんか?  …そうです。ミサイルです。乗せているものが人か、人工衛星か、核弾頭か、 爆薬か、生物兵器かなどの違いだけなのです(編注1)。  「打ち上げ成功」とは「ミサイル成功」といっても過言ではないと思います…。  よかったね、日本人。いつでも、発射できる技術があるよ。ロケットは東向き に発射させます。地球の自転をカタパルトになるわけね。  また、日本の場合、種子島から発射させるので万が一のときに海に落とすこと ができます。 ○JAXA(宇宙航空研究開発機構) http://www.jaxa.jp/index_j.html 【編注1】ロケットの起源は10世紀といわれています。10世紀始めには中国で黒色 火薬が発明されました。最初は花火などの目的に使用しましたが、11世紀中頃で あり「火矢」と呼ばれていたロケット花火そっくりの武器が登場します。1232年 に宋の首都(現在の開封)をモンゴル軍が包囲した戦いにおいて、火矢を本格的 に軍事目的に利用したといわれています。その後、鎌倉時代(13世紀)になると、 モンゴル軍が日本を襲いました。元寇です。モンゴル軍は火矢や鉄砲(初期の鉄 砲となるもの)を活用し、日本軍の鎌倉武士たちを苦戦させます。実際、このと きの絵は歴史の教科書によく出てくるので記憶している方も多いでしょう。その 後、様々な戦争で利用された火気ですが、現在のようなロケットのような形にな ってきたのは20世紀になってからです。アメリカ生まれのロバート・ゴダートが 登場します(近代ロケットの父と呼ばれている)。彼の作成したゴダートロケッ ト2は、姿勢制御されたロケットが発射され安定して飛行しました。到達高度1,4 00メートル、平均時速880キロメートルです。形もミサイルそっくりです。一方、 ドイツ人のフォン・ブラウンもロケット開発を行っていました。彼は若干25歳で 技術責任者になり、ナチスによる秘密研究が続けられ、第二次世界大戦直前には ジャイロで慣性誘導する全長6.5メートルのロケットの実験に成功しました。そし て引き続き、この2倍を超える大型ロケットの開発に着手して、成功を収めました。 このロケットがイギリスを恐怖に落としたV-2ロケットです。全長14メートル、最 大径1.65メートル、推力25トン、最大速度マッハ4.5の大型ロケットでした。 ■0x0B.) 地上(土地)分解能、熱分解能、スペクトル分解能について  衛星の持つセンサーのレベルを語るのに使用される言葉です。地上分解能はひ とつの画素が表せる領域のことです。例えば、quick birdの場合、確か0.82mくら いだったと思いますが、これは1画素が82cm分の領域を表しますので、車がどちら の方向に向いているのかくらいまで、拡大(ズーム)できるわけです。  google mapでも拡大できる場所と出来ない場所があることに気付くかと思いま す。  イラク戦争のときに軍事アナリストがいっていましたが、某国は分解能5cmまで のセンサーを隠し持っているらしいです。これで監視してんのかなぁ。あの人を。 ■0x0C.) その他  シーン幅、熱分解能、スペクトル分解能、衛星データの利用・活用方法につい てはいつか機会のあったときにする予定です。別に衛星ではなく飛行機にセンサ ー積んでやることも当然あります。衛星データが売れるのは戦争のときや、津波、 地震、などの天変地異が起きたときに売れまくるそうですよ。  衛星データは売っているので買ってみれば? ■0x0D.) お遊的にLINKする  問題があるかもしれないので、公系のサイトと外国の有名所です。国内の民間 の企業にも、衛星データを売っている会社はあります。 ●空中写真サービストップページ by 国土地理院 http://mapbrowse.gsi.go.jp/airphoto/  あなたのお家を探してみたら。JavaScriptはONでなければうまく見れないと思 います。 ●地球観測情報システム/データ公開システム http://www.eoc.jaxa.jp/  Webページ内の「探す/見る」>「地球観測情報システム」>「一般ユーザー はこちらから!」>「サービス開始」ボタンを選択することで、データ検索のペ ージに切り替わります。 ●DegitalGlobe http://archivetool.digitalglobe.com/  衛星データのシーン検索サイトにどうぞ。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第3章: ビバ!OllyDbg --- 著者:DokoDon x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  OllyDbgはOleh Yuschuk氏の作ったデバッガで、今やその人気は世界トップレベ ルといっても過言ではないでしょう。私とOllyDbgのはじめての出会いは、当時私 にとって最強の情報源であり、神のことばでもあった「解析素材」の以下の記事 によってでした。 ----- OllyDbg 2000/12/14 フリーなデバッガ。 ブレークポイントに API を指定できなかったり、 機能的には既存のデバッガに少し劣るのだけど、わりと期待できそうな感じ? -----  以来、今日まで私はOllyDbgと共に解析の道を歩むことになるのです。 ■0x02.) OllyDbgの歴史  では、わかる範囲でOllyDbgの歴史を振り返ってみたいと思います。 ●記念すべきVer1.00  OllyDbgの最初のバージョンは2000年11月16日にリリースされました。といって も先にも書いたとおり、私自身はその時点では知りませんでしたが。まさに彗星 のごとくあらわれ、当時TRW2000を使っており、ナグにウンザリしていた私はOll yDbgの手軽さ、扱いやすさと安定度に一発で魅了されました。この最初のリリー スですでにインポート関数を名前で表示してくれるなど、ディスアセンブルコー ドの可読性はすばらしいものでした。  また、オブジェクトやライブラリをサーチして静的結合されたルーチンを特定 してくれるなど、現在でもかなり有用な分析機能をこの時点で有していました。  ちなみにホイールマウスには対応していませんでした(書きながら確認)。 ●Ver1.01  初版リリースの約一ヵ月後の2000年12月27日に出たバージョン1.10では、限定 的ながらボーランド形式のデバッグ情報に対応する試みがなされています。 ●Ver1.02  2001年3月17日にリリースされたバージョン1.02ではWM_PAINTなどのウィンドウ メッセージをデコードできるようになりました。またボーランドデバッグ情報へ の対応もより進みました。 ●Ver1.03  2001年4月25日リリース。このころから末尾の数字が奇数のバージョンは中間バ ージョンでテスト的なものに位置付けられました(ひょっとしたら最初からだっ たかも)。ヘルプの更新などがなされなくなったので、変更点についてはわかり にくくなりましたが、オプションの項目が増えていることよりこのバージョンか らSFX機能が搭載されました。SFX機能とは、パックや暗号化されているアプリの 自己展開ルーチンをトレースしてくれる機能で、アンパックの最大の友と言える ものです。が、このころはなんのことやらまったくわからず、アンパックのなん たるかも知らなかったので使っていませんでした。今使ってみると、例外の自動 処理がまだできないため、途中で止まってしまったりして、使用にはまだ不十分 だったもののようです。 ●Ver1.04  2001年6月15日リリース。Ver1.03で試されていたSFX機能が、例外を無視(プロ グラムにそのまま処理させる)オプションの追加と共に、使えるものになってい ます。  そして、恐らくOllyDbg史上最大の進化であるプラグインへの対応がなされまし た。これによりOllyDbgは無限の可能性を秘めたデバッガへと成長することになり ます。  また、インポートライブラリ内の関数の序数名前解決やジャスト・イン・タイ ムデバッガへの登録、PE/COFFヘッダーのデコード、ラン・トレースなど多くの便 利な機能が追加されています。  ところで、このバージョンからついた、「Options」メニューの「Analysis1」 タブにある「Decode tricky code sequences」はmuffinさんのリクエストにより 実現された機能です。 ●Ver1.05  ホイールマウスに対応してました。正式には次の1.06で対応とのことですが。 ●Ver1.06  なぜかReadme.txtが見当たらず、ファイルの更新日時からVer1.06は2002年2月 25日頃のリリースと思われます。このバージョンでは1.04で登場したラン・トレ ースに条件を指定できるようになり、この機能もアンパックに有用なものとなり ました。「Options」メニューに「Appearance」が加わり、フォントと色をユーザ ーが指定できるようになりました。これにより、日本語文字列の表示が可能にな りました。多くの新機能が追加された結果、内部で使用している構造体が大幅な 変更となり、Ver1.06以前用のプラグインはそのままでは使えなくなりました。 といっても、新しいPlugin Development Kitでコンパイルし直すだけでVer1.06 で使えるようになったのですが。 ●Ver1.08  2002年11月16日リリース。M$形式のデバッグ情報ファイルに対応しました。ジ ャンプ命令を選択すると飛び先を示す矢印が表示されるようになりました。  また、コードハイライト機能が追加され、命令のカテゴリ別にコードに色がつ けられますます可読性が増しました。 ●Ver1.10-ファイナルバージョン  Ver1.xxの最終バージョンとなる1.10は2004年5月23日にリリースされました。 DLLの単独デバッグ、SEHチェーンの表示、アナライザへの分析ヒント設定(強制 的に指定したデータと見なすように指定する)などを加え、ディスアセンブラと してもIDAに迫る分析能力を得ました。 ●今後  OllyDbg V1シリーズのプロジェクトは終了し、V2シリーズが完全再設計でスタ ートしています。開発の方は時間がかかっていますが順調に進んでいるようです。  また、V1シリーズもプラグインにより拡張が可能でありまだまだ進化すること でしょう。  駆け足でOllyDbgの歴史を振り返ってみました。読んでもなんのことかわらない かもしれませんが、筆者も書いていてよくわからなくなってきてるのでご容赦く ださい。 ■0x03.) プラグインを作ってみよう  さて、OllyDbgの最大の特徴ともいえるプラグインによる機能拡張はすべての人 に開かれたものです。OllyDbgをより使いやすいものにするため、ぜひプラグイン 作成に挑戦していただきたいと思います。ここではプラグインを作成するための 基本コード(雛型)について見ていきたいと思います。 ●プラグイン・コールバック関数  プラグイン・コールバック関数とは、OllyDbgのイベントによって呼び出される プラグインの関数でOllyDbgとプラグインとのインターフェースとなるものです。 PDK1.10では下記の14のプラグイン・コールバック関数が用意されています(引数 省略)。  ・ODBG_Plugindata  ・ODBG_Plugininit  ・ODBG_Pluginmainloop  ・ODBG_Pluginsaveudd  ・ODBG_Pluginuddrecorddata  ・ODBG_Pluginmenu  ・ODBG_Pluginaction  ・ODBG_Pluginshortcut  ・ODBG_Pluginreset  ・ODBG_Pluginclose  ・ODBG_Plugindestroy  ・ODBG_Paused  ・ODBG_Pausedex  ・ODBG_Plugincmd  この中で必須なのはODBG_PlugindataとODBG_Plugininitの2つだけで、他はオプ ションです。  ODBG_Plugindata関数はプラグイン名を引数に渡し、プラグインバージョンを戻 り値とすることでこれらをOllyDbgに知らせる役目を担います。 ----- extc int _export cdecl ODBG_Plugindata(char shortname[32]) { strcpy(shortname,"Sample"); // Name of plugin return PLUGIN_VERSION; }; -----  ODBG_Plugininit関数は文字通りプラグインの初期化を行うための関数です。 ----- extc int _export cdecl ODBG_Plugininit(int ollydbgversion,HWND hw, ulong *features) { // まず、OllyDbgのバージョンとプラグインのバージョンをチェックします。 // OllyDbgのバージョンが古ければ処理を中断するため-1を返します。 if (ollydbgversion #include #include #include "plugin.h" HINSTANCE hinst; // DLLインスタンス格納用グローバル変数 HWND hwmain; // OllyDbgメインウィンドウのウィンドウハンドル用 BOOL WINAPI DllEntryPoint(HINSTANCE hi,DWORD reason,LPVOID reserved) { if (reason==DLL_PROCESS_ATTACH) hinst=hi; // Mark plugin instance return 1; // Report success } extc int _export cdecl ODBG_Plugindata(char shortname[32]) { strcpy(shortname,"Sample"); // プラグインの名前 return PLUGIN_VERSION; } extc int _export cdecl ODBG_Plugininit(int ollydbgversion,HWND hw, ulong *features) { // まず、OllyDbgのバージョンとプラグインのバージョンをチェックします。 // OllyDbgのバージョンが古ければ処理を中断するため-1を返します。 if (ollydbgversion○○○○○〜様 投稿者:津田%初段 08月28日 08時19分 警告したにもかかわらず、許可を得ずにパッチを公開してしまいましたね。 公開するのではなく、パッチ方法をメールで私に知らせていただけませんか? >○○○○○〜様、その他の方々 -----  この後、津田氏によるクラッキングコンテストが開催されたことはなかったと 記憶しています。2ちゃんねるでもお祭騒ぎになったオフィスヒラカワ社が行なっ た販売時点情報管理(POS)システムソフト「ぽす助」でも同じことですが、残念 ながらどうも日本では一度破られると「次は、これでどうだ!」といったものが ないように思えます(ぽす助の場合プロテクトに他社のプログラムを使用してい たため事情が異なりますが)。  ちなみに、あまり詳しいわけではありませんが、海外のクラッカーのコミュニ ティーでプロテクトを研究している人が「これはクラックできるか?」、「それ がクラックできたなら、今度のこれはどうだ?」というような、クラッカーとソ フト開発者のやり取りがあるといっていました。つまり、日本とは違った形でプ ロテクトを強化するシステムが形成されているとういうことです。日本にもこの ようなシステムがあればと思います。日本ではただ掲示板にソフトウェアを不正 利用したい人間(クラック依頼を出す人間)とプロテクトに興味があり、それを クラック人間(クラック依頼に答える人間)という二つのタイプだけしかいませ ん。ソフトウェア製作者がクラックの場面に参加しないために、単にクラックが 「できた・できない」ということに終始し、プロテクトの強化やプロテクトの技 術が他の国から比べて遅れてしまっているんだと私は思います。私個人の意見と しては、ぜひともソフトウェア製作者も積極的にシリアル掲示板に書き込みをし、 プロテクトを解除する側とコミュニケーションを取り、ソフトウェアのプロテク トを強化するとともに機能を制限したフリー版、フル機能のシェア版と二つ用意 するようになって欲しいと思っています。  ちなみに、シェアウェア作家協会の掲示板でクラッキングコンテストが開かれ た時代はたくさんのシリアル系掲示板が存在したときでもあります。各々の掲示 板によって書き込みするクラッカーが違うために、あの掲示板ではあのプロテク トに強いなどという色がでてきて楽しい時代でした。  また、各クラックチームも多くのプログラムや文章を発表したりと繁栄の時代 だったといえます。 ■0x04.) クラックシーンの衰退  繁栄の時代があれば当然のように衰退の時代があります。現在はまさにその衰 退の時代だと思います。数えることができない程たくさんあったシリアル系掲示 板の多くは閉鎖され、正常に機能している掲示板は数える程しかない状態です。 また、FCJ、Team iCE、Team next Generationなどといったたくさんあったクラッ クチームは活動停止や解散という状態になりました。  ここであるクラックチーム解散のときに発表された文章から一部引用したいと 思います。 ----- もともとTeamを作った本音は、 Krack汎用手法を貪欲に欲していたからでした。 簡単にいって手法技法情報の交換を行いたかった。 しかし、 KrackWEBの周辺は、 多数の、Krack結果情報だけを求めている人 中数の、できるなら学んでKrackしたいと思っている人 中数の、Krack関連情報を提供している人 少数の、本気でKrack手法を探して学んでいる人 少数の、KrackerおよびKrack結果情報を提供している人 極少数の、Krack汎用手法情報を研究公開している人 という構成になっていて、 かつ、Krackerは初心者のうちは寄り合うが 一定のラインに到達すると寄り合い難くなる、 つまり独立活動と技の奥義秘密化に向かってしまう。 またKracker同士といっても、 Krackerによって関心があることが違うので、 寄り合っても、話題興味がずれて なかなか有意義な情報交換ができない。 Krackなんて言葉は最近できたものではあるが、 いまやKrackという言葉でひとからげにはできない(編注)、 暗号Krack、ドングルKrack、デバッガ対策Krackなどと 細分化して語らないと焦点がボケてしまう状況なのかな、 -----  この引用した文章にもあるように、現在クラックキングはあまりにも細分化さ れクラックとひとつの言葉でくくるには無理ができてきました。こうして見ると シリアル系掲示板がたくさんあり、複数のチームが存在していたときに掲示板に 書き込みしていた人の姿は今どの掲示板でも見ることがなくなりました。その理 由は「独立活動」、これを行なっているためだと私は思います。私は現在どのよ うな人がシリアル系掲示板で活躍しているのかまったく知りませんが、おそらく あるラインにたどり着いたとき、すなわち細分化されたひとつの道を選択して「 独立活動」を始めたとき、その人は掲示板で依頼を受けてそれをクラックするこ とをしなくなるのではないでしょうか。そして、シリアル系掲示板やクラック系 Webサイトを見て自分でやってみようと思った人がシリアル系掲示板に書き込みす るようになり、またその人も他と同じように独立活動を始める、このサイクルが 繰り返されると私は考えています。 【編注】「ひとからげ」(一絡げ)とは、ひとつにたばねること。また細かい違 いを無視して、多くのものをひとまとめに扱うことを指します。 ■0x05.) 最後に  正確にはわかりませんが私が保存しているファイルのタイムスタンプによると 1996年となっているので、それから考えると9年間になります。その9年間見てき た私の感じたことや思ったことを書かせていただきました。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第7章: Bookmarkletでインターネットをちょっとだけ快適に --- 著者:えいる x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  はじめまして、えいるといいますヽ(´ー`)ノ  今回は便利な割には知名度があまり高くない(と思ってる)Bookmarkletについ て書こうと思います。こんなのすでに常識だったらごめんなさい。 ■0x02.) ブックマークレットって?  Bookmarkletとは、JavaScriptで記述されたコードをブラウザのお気に入りから 任意のページに対して実行できる状態(お気に入りに登録する)にしたものです。  例えば自分の好きなようにページの色を変えたり、本来ユーザが見ることので きない(といってもローカルにデータはあるのですが)情報を閲覧したりといっ たことが可能となります。  以下ではいくつかのサンプルを見ながら解説をして行こうと思います。なお、 JavaScriptの細かい構文の解説は省いてます。動作確認はIE6です。 ■0x03.) 実際のコードと解説  現在閲覧中のサイトのタイトルを表示させるBookmarkletは次のようになります。 ---- javascript:alert(document.title); ----  上記のコードをコピーしてお気に入りに登録し、任意のページ上でそのお気に 入りを選択します。すると、今見ているサイトのタイトルがダイアログに表示さ れるはずです。もちろんブラウザの設定でJavascriptの実行を許可する必要があ ります。コードを分解して、簡単に説明すると以下のようになります。 ---- javascript: //これ以降のコードがJavascriptだということを表す宣言 alert(document.title); //閲覧中のサイトのタイトルをダイアログで表示する ----  もう少し複雑なものも作ってみます ---- javascript:(function() {var s = "";s = document.cookie; if (s) { alert("このページ上のクッキー\n\n" + s);window.clipboardData.setData("text",s); } else { alert("このページに対してcookieはありません"); } }) (); ----  少し構文が増えましたが、あまり変わらないですね。  現在閲覧しているwebサイトが発行しているクッキーを表示し、クリップボードにコピーします。 ---- javascript:( //これ以降のコードがJavascriptだということを表す宣言 function(){ //無名関数の宣言 var s = ""; //変数sの宣言と初期化 s = document.cookie; //クッキーの値を変数sに格納 if (s) //sの中身が空かどうかの判定 { //クッキーが発行されている場合の処理 alert("このページ上のクッキー\n\n" + s); //クッキーの値を表示する window.clipboardData.setData("text",s); //クッキーの値をクリップボードにコピー } else { //クッキーが発行されていない場合の処理 alert("このページに対してcookieはありません"); //クッキーが存在しない旨を表示するダイアログ }) ();//無名関数の呼び出し ----  先ほどのコードとの違いは、2行目のfuntionで一度関数を作り、最後に呼び出 しているところですね。もちろん先ほどのように書いても動くのですが、このよ うに書いたのには理由があります。  3行目で変数sを宣言していますが、関数を使用せずに宣言すると、見ているサ イト内で同じ名前の変数が使用されている場合その値を書き換えてしまいます。 そのせいでサイトでのJavaScriptの動作がおかしくなる可能性があるので、関数 の中だけでしか使えないようにしているわけです。もちろん、そういった動作を させたい場合はその限りではありませんが…。上の例ではクッキーを取得してい ますが、同じ要領でクッキーを書き換えることも可能です。会員制Webサイトのロ グインユーザの判定に毎回同じクッキーを発行しているような場合だと、あらか じめそういったBookmarkletを登録しておくことによりログインを簡単に行うこと ができますね。  また、Javascriptがフォーム上のテキストボックスなどにアクセスできること を利用すると以下のようなコードも書くことができます。 ---- javascript:( function(){ var s,F,j,f,i; //変数の宣言 s = ""; //sの初期化 F = document.forms; //Fにフォームへの参照を格納 for(j=0; j NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); #ifdef __cplusplus } #endif NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { return STATUS_SUCCESS; } -----  まぁ見てわかる通り何もしないプログラムのようです。デバイスドライバでは、 DriverEntryからコードが始まります。要するにWinMainもしくはmain関数みたい なものです。では、これをコンパイルして実行してください。といっても、どう やってコンパイルするかわかりません。そもそもWinDDKをもってませんという人 は以下のアドレスからDLしてください。私はWindowsXP環境なので「XP DDK」を使 っています。CD-ROMイメージなのでCDに焼くか、仮想CDドライブソフト(Daemon Toolsなど)を使ってインストールしてください。リンク切れてたらマイクロソ フトから注文してください。 ○DDK http://club.shelek.com/viewfiles.php?id=2 ○DAEMON Tools http://www.daemon-tools.cc/dtcc/portal/download.php?mode=ViewCategory&catid=5 ○DAEMON Tools Homepage http://www.daemon-tools.cc/dtcc/portal/index.php ○Microsoft Windows Driver Development Kit http://www.microsoft.com/whdc/devtools/ddk/default.mspx  2年くらい前まではマイクロソフトのホームページで無償で提供されていたので すが、何故か突然やめてしまったので、現在では正規の入手方法はマイクロソフ トに直接注文するしかなくなりました。ちなみにDDK本体は無料なのですが、送料 が25ドルくらいかかるらしいです。でも、ネット上を探してみれば意外と見つか りますので、わざわざ注文する必要もないかもしれません(編注1)。  さて、本題に戻ります。DDKをインストールしたら通常「C:\WinDDK」というフ ォルダが作成されます。その中に入ると「2600」というフォルダがあり、その中 に実質的なWinDDKのファイル群があるわけです。この中のひとつに「src」という、 いかにもサンプルプログラムが大量に入ってそうなフォルダが目に付きますが、 ご想像の通りサンプルプログラムは初心者がみてもまず理解できないシロモノに なっていますので、最初の頃はほぼ無意味です。それでこれらはとりあえず置い といて、ひとつフォルダを上がって「2600」と同じ場所に「hello」というフォル ダを作ってください。そしてその中に「hello.cpp」を入れてください。これで、 「C:\WinDDK\hello\hello.cpp」というファイルが存在することになります。そし て、さらにhelloフォルダ以下に、次の2つのファイルを作成してください。 ----- MAKEFILE !INCLUDE $(NTMAKEENV)\makefile.def ----- ----- SOURCES TARGETNAME=hello TARGETTYPE=DRIVER TARGETPATH=obj SOURCES=hello.cpp -----  さて、これで準備完了です。「C:\WinDDK\hello\hello.cpp」、「C:\WinDDK\h ello\MAKEFILE」、「C:\WinDDK\hello\SOURCES」の3つのファイルを作成したら、 いよいよコンパイル(ビルド)となります。Windowsお馴染みのスタートメニュー から「スタート→プログラム→Development Kits→Windows DDK 2600→Build En vironments→Win XP Checked Build Environment」としてください。もしくはコ マンドプロンプトを起動して「C:\WINDDK\2600\bin\setenv.bat C:\WINDDK\2600 chk」と実行してください。すると、以下のような入力画面でコマンドプロンプ トが止まります。 ----- コマンドプロンプト C:\Documents and Settings\kenji>C:\WINDDK\2600\bin\setenv.bat C:\WINDDK\2600 chk C:\WINDDK\2600> -----  ここで「cd C:\WINDDK\hello」と入力して場所を移動します。そして、buildと 入力することでコンパイルされます。 ----- コマンドプロンプト C:\WINDDK\2600>cd C:\WINDDK\hello C:\WINDDK\hello>build BUILD: Object root set to: ==> objchk BUILD: Adding /Y to COPYCMD so xcopy ops won't hang. BUILD: /i switch ignored BUILD: Compile and Link for i386 BUILD: Loading C:\WINDDK\2600\build.dat... BUILD: Computing Include file dependencies: BUILD: Examining c:\winddk\hello directory for files to compile. c:\winddk\hello - 1 source files (17 lines) BUILD: Compiling c:\winddk\hello directory Compiling - hello.cpp for i386 BUILD: Linking c:\winddk\hello directory Linking Executable - objchk\i386\hello.sys for i386 BUILD: Done 2 files compiled 1 executable built C:\WINDDK\hello> -----  無事コンパイルが完了すると、SOURCESファイル、MAKEFILEファイル、hello.c ppファイルの他に2つのフォルダと1つのログファイルが作成されます。そしてob jchk\i386フォルダ以下にある「C:\WINDDK\hello\objchk\i386\hello.sys」とい う拡張子が.sysのファイルが、デバイスドライバファイルです。これでコンパイ ルは無事完了となります。ちなみにこの例ではチェックビルドを行いましたが、 フリービルドでも構いません。64ビット環境の方は、64ビットのチェック(また はフリー)ビルドを行ってください。では、このhello.sysファイルを実行するこ とにします。 【編注1】WB10の「ブルースクリーンと仲良くなろうよ」という記事にもあるよう に、「Debugging Tools for Windows」というツールの中にDDK(Driver Develop ment Kit)が含まれていたと思います。 http://www.microsoft.com/japan/whdc/devtools/debugging/default.mspx ■0x03.) 実行  実際ビルドして作成されたhello.sysファイルですが、これいったいどうやって 実行するのでしょうか? というかそもそも.sysファイルって何だろうと思いま すが、それは私にも分かりません。ただドライバは一般的に.sysファイルみたい です。WindowsXPなら「C:\WINDOWS\system32\drivers」以下をみると.sysファイ ルがたくさんあるのがわかります。  さて、とりあえず実行したいわけですが、ドライバは通常Windows起動時にWin dows本体に組み込まれます。ドライバの中にはOSのboot時に実行されるものやシ ステム初期化時に実行されるものなど、もはやOSの一部となるような動作をする のが当たり前というか、そういう処理が必要なソフトウェアがそもそもドライバ を利用するわけです。なので、再起動が日常茶飯事になります。動作を確認する ためにはOSの再起動をしなければなりませんし、実行を解除するためにもやはり OSの再起動が必要となります。さらに通常のアプリケーションデバッガは意味を 持ちませんので、OllyDbgやVC++についているデバッガも無意味です。なのでデバ ッグを行う際はSoftICEなどを使うことになるようです。  話がずれてきたので元に戻します。ドライバを実行するためにはレジストリを 変更する必要があります。そしてその後再起動を行ないOSに組み込みます。とい うことで以下のようなファイルを作成します。 ----- hello.reg REGEDIT4 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\hello] "Start"=dword:1 "Type"=dword:1 "ErrorControl"=dword:1 "DisplayName"="hello" -----  .regファイルはダブルクリックするとレジストリにデータを追加してくれます。 ちなみに後で手動で消さなければならないので、「HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Services\hello」の位置は覚えておいてください。  hello.regをレジストリに追加して、さらにhello.sysファイルを「C:\WINDOWS\ system32\drivers」以下にコピーします。これで準備完了です。Windowsを再起動 してください。  Windowsが起動するとちゃんとhello.sysが実行されています。といってもその ままでは確認できないため、デバイスドライバを表示するツールを使うことにし ます。もし私と同じ環境である「WinXP DDK」を使っているならば「Device Tree V2.6」というツールが「WinXP DDK」の中に入っていますのでそれを起動してく ださい。 http://ruffnex.oc.to/kenji/windriver/pic1.png  もしXP以外のDDKを使っている場合は、「Sysinternals」というサイトから「W inObj」というドライバ閲覧ツールをDLしてください。WinObjを使ってhello.sys ドライバを確認したキャプチャー画像が以下です。 http://ruffnex.oc.to/kenji/windriver/pic2.png ○Sysinternals http://www.sysinternals.com/ ○WinObj http://www.sysinternals.com/ntw2k/freeware/winobj.shtml  これで無事ドライバがコンパイル実行できました。さて、実際実行されたドラ イバですが、一度実行してしまうとOS起動中は終了できません。いわばOSに組み 込まれている状態ですので、終了させるためには再びレジストリを変更して、he llo.sysファイルを削除して、再起動する必要があります。つまりデバイスドライ バは、作成後、実行確認と終了時の2回の再起動を必要とするわけです。通常のア プリケーションプログラムのように、.exeファイルをダブルクリックして実行し、 [×]ボタンで終了というように簡単にはいかないのです。なんともメンドクサイ ですが、これがデバイスドライバの開発みたいです。  では、ファイル名を指定して実行よりregedit.exeを起動して、実行時に登録し たレジストリ「HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\hello」 を削除してください。さらに、「C:\WINDOWS\system32\drivers」以下にコピーし たhello.sysも削除してください。そして再起動してください。  再起動後、再び「Device Tree V2.6」を使ってドライバを確認してください。 helloはもう起動していません。これで終了となります。 ■0x04.) サービス制御マネージャー  つまり、ドライバ開発の一連の流れは以下のようになります。 1、ソースコードを書く 2、SOURCESファイル、MAKEFILEファイルをそれぞれ作成する 3、ソースコードのビルドを行う 4、レジストリを変更し、.sysファイルをdriversファイルにコピーする 5、再起動 6、実行を確認 7、レジストリを変更し、.sysファイルをdriversファイルから削除する 8、再起動 9、終了を確認  そして、実行時にエラーなどがあったらもちろん再度ソースを編集してビルド し、実行を確認しなければならないので、以後3から9を繰り返すことになります。  うーん、かなりメンドクサイです。特に2回の再起動はたえられません。一度実 行を確認するだけで、2回も再起動を要するのはさすがにやる気でません。という ことで、これを何とか打開しようと筆者(つまり私)は考えました。まぁデバイ スドライバですので「一度実行してしまったら、再起動する限り終了できない」 というのは分かります。でも実行するくらいは、ボタンひとつでやらせてくださ い。  ここで現れる救世主が「サービス制御マネージャー」です。これを利用すると、 なんとボタンひとつでデバイスドライバが起動するツールが作れるらしいのです。 ということで実際に作ってみました。 http://ruffnex.oc.to/kenji/windriver/idriver.zip  ソースコードも添付してますので、興味があったらご覧ください。ソースコー ドの解説はしませんのでご了承ください。でも毎度のごとくコメントはたくさん つけてます。  起動すると以下のように表示されます。 http://ruffnex.oc.to/kenji/windriver/install.png  .sysファイルを選択して「Install」ボタンをクリックするとWindowsにドライ バがインストールされます。「Device Tree V2.6」で確認してください。ちなみ に、インストールはすぐにできますが、「UnInstall」ボタンを押してもその瞬間 からアンインストールはされません。あくまで再起動時(Windows終了時)にアン インストールが実行されます。あと、アンインストールしなければ次回OS起動時 もドライバが実行されます。 ■0x05.) デバッグ  SoftICEを用意してもらえれば万事解決なのですが、さすがにそうもいかないの でデバッグ環境を整えることにします。というか、デバイスドライバって、CUIプ ログラムのようにテキストを表示する場所もなければ、Windows(GUI)プログラ ムのようにウィンドウを描画するわけでもないので、どこまで実行されているの か、どこにエラーがあるのかが、まったくもって分かりません。そもそもデバイ スドライバというものそれ自体がWindowsの内部でこっそりと動いているモノであ るわけですので、デバッグという観点から見たら、もう救いようがありません。 よって、まずはそこから整えていくことにします。 ○Sysinternals http://www.sysinternals.com/ ○DebugView http://www.sysinternals.com/ntw2k/freeware/debugview.shtml  「Sysinternals」というサイトに「DebugView」なるツールがあります。まずは これをDLしてください。現在のバージョンは4.3です。これはドライバ開発者の中 ではかなり有名なツールらしく、結構いろいろな人に使われているようです。さ て、このツール、その名の通りデバッグ情報を出力してくれるだけなのですが、 OutputDebugStringからのデータだけでなく、DbgPrintからのデータも表示してく れるところがGOODです。つまりカーネルモードからのデバッグ情報も表示してく れるわけです。ちなみにDbgPrintはカーネルモードのOutputDebugStringみたいな もので、MSDNでは以下のように定義されています。 ○DbgPrint - MSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/DebugFns_5e11bbcc-adc2-46c0-b371-0e54c50bb2dc.xml.asp ----- ULONG DbgPrint(IN PCHAR Format, ...[arguments] ); -----  みてわかるとおり、使い方はprintfと同じです。では、これを利用してhello. cppを改良します。以下のプログラムをみてください。 ----- Dhello.cpp #ifdef __cplusplus extern "C" { #endif #include NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); #ifdef __cplusplus } #endif NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { DbgPrint("Hello World! from kernel mode."); return STATUS_SUCCESS; } ----- ----- MAKEFILE !INCLUDE $(NTMAKEENV)\makefile.def ----- ----- SOURCES TARGETNAME=Dhello TARGETTYPE=DRIVER TARGETPATH=obj SOURCES=Dhello.cpp -----  簡単ですね。DbgPrintが追加されただけです。ではこれをビルドしてください。 hello.sysの時は再起動しましたが、今回は「サービス制御マネージャー」の項で 作成したツールを使ってください。  まずは、Dbgview.exeを起動します。これはいろいろと設定できるようですが、 私の場合はDLした状態(デフォルト)のままでOKでしたので、何も変更しない状 態で起動してください。起動すると以下のようなウィンドウが表示されます。 http://ruffnex.oc.to/kenji/windriver/dbview.png  そして、起動した状態のまま、今度は「Driver Install Program」を使って、 Dhello.sysをインストールしてください。無事インストールが完了したら、Dbgv iew.exeのウィンドウを開いてください。以下のように表示されます。 http://ruffnex.oc.to/kenji/windriver/dbview2.png  これでとりあえずDbgPrintを使ってデバイスドライバからの出力が受けられる ようになりました。もっと大きなプログラムを作成するのならSoftICEのような有 用なデバッガを用いて、本格的に処理を追っていかなければなりませんが、個人 で作るような小さなプログラムならば、DbgPrintとDbgview.exeで十分でしょう。 今後は「DbgPrint」と「Dbgview.exe」そして「サービス制御マネージャー」を利 用して作成した「Driver Install Program」を使って、デバイスドライバ作成講 座を進めていくことにします。  今回のサンプルプログラムである「hello」と「Dhello」は、ZIP圧縮して以下 のアドレスにアップしました。参考にしてください。 http://ruffnex.oc.to/kenji/windriver/driver1.zip ■0x06.) さいごに  さて、いかがだったでしょうか。今回は「Windows Device Driver Programmin g Part 1」と題してお送りしましたが、「Part 2」があるかどうかは定かではあ りません。「デバイスドライバ作成講座を進めていくことにします」と言ってい るにも関わらず(笑)。というのも、こんなマニアックなことを書いてると「本 当に誰も読んでくれないのでは?」という不安がよぎるからです。さすがにモチ ベーションが保てません(^^;。なので、こういう読者層が極度に狭いネタは自分 のHPでこっそり公開しようかなぁと考えていますが、そんな時間もないですし「 そもそもお前はたくさんの人に読んでもらえるようなモノを書けるのか?」とい われると、書けないです(^^;。なのでこのまま突き進んでいくことにします(笑)。 ただ、せっかくデバドラ関連の記事を書いたので、今後はMACフレームレベルでの パケット取得方法や、カーネルモードプログラムのAPIフック方法などを解説して いけたらなと思います。さて、最後になりましたが、ここまで読んでくれて本当 にありがとうございます。  では、また会う日まで... ■0x07.) 参考サイト ・Driver Development Part 1: Introduction to Drivers http://www.codeproject.com/system/driverdev.asp ・Driver Development Part 2: Introduction to Implementing IOCTLs http://www.codeproject.com/system/driverdev2.asp ・Driver Development Part 3: Introduction to driver contexts http://www.codeproject.com/win32/driverdev3.asp ・Driver Development Part 4: Introduction to device stacks http://www.codeproject.com/system/driverdev4asp.asp ・Driver Development Part 5: Introduction to the Transport Device Interface http://www.codeproject.com/useritems/driverdev5asp.asp x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第15章: カード審査の実態 --- 著者:Aluminumovercast x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) 概要  クレジットカードの審査方法について実際どのように行われているのか疑問に 思った方も少なくないと思います。試しに知り合い何人かに尋ねたところ審査担 当者が申し込み表をチェックして何かの基準で決めているのではないかという意 見が多く聞かれました。  また、こんな経験のある方もいるかもしれません。例えばA社とB社にほぼ同時 期に申し込んだらA社だけ発行されてB社は断られてしまった、複数回に渡るカー ドの延滞をしたらカード会社から与信額(カード限度額)を引き下げられた、ま たはカード停止(返却)された経験のいる方もいるかもしれません。同じ回数を 延滞してもA社は今まで通り使えるのにB社はすぐに停止されてしまったという話 も聞くことがあります。  現在のクレジットカードの審査は人手による判断は極限まで排除され、多くの 場合「審査モデル」(呼称は各社異なります)と呼ばれる、いわゆる数理方程式 によってジャッジされています。  今回は現在行われているカードの審査について、実際の審査方法を紹介しなが ら説明していきたいと思います。 ■0x02.) 免責 ・本資料はクレジットカードの審査方法について説明するものです。無担保ロー ンや住宅ローン、自動車ローンなどについてはまったく考え方の異なる方法がと られていることがありますのでご注意ください。 ・今回紹介するカード審査方法は実際にある銀行系の企業が、データ分析ソフト ウェア用にシュミレーション用として公開したもので、実際の審査で運用される ものはクレジットカード会社独自の基準によってそれぞれ異なります。 ・資料で使用する審査モデルは初期審査で使用されるものであり、初期審査で「 承認」が出ても本審査と呼ばれる、照会された個人信用情報を利用した審査では 「拝辞」となるケースが十分ありえます。本資料の内容は個人の与信状況からカ ード審査の承認を保証するものではなく、その損害については明示・黙示を問わ ず一切の責任を負いません。  また、「資料の通りの属性なのに断られた」などのクレーム等も一切受け付け られません。 ・本資料で登場する審査モデルテンプレートの著作権は株式会社浜銀総合研究所 に属すものであり、その使用に関しては著作者の許諾用件に基づき公開していま す。 ・本資料で登場する審査用与信データは、審査モデルのテスト用に作成されたも のであり、実際のデータの抽出サンプル等ではありません。 ・本資料で登場する審査モデルのテンプレートは、特殊な業務用ソフトでしか使 用できないこと、また一般公開されていないという性質上、再配布の許諾はされ ておりますが、本資料では不適切と判断し配布はいたしません。 ■0x03.) はじめに  今回は初期与信にはどのようなデータが使用されるのか、またどのような審査 方法が行われるのかに重点をおいて説明しますので、「どうしたらカードの審査 に通るのか」という類のテクニック(?)的な内容ではありませんので、最初に お断りしておきます。  また、カードの審査承認基準はカード会社が独自に定めるものであり、こうす れば通りますという概論的なセオリーは現実には存在しません。  そして、本文中で詳しく紹介しますが、カードの審査は最新の数理技術、統計 理論を使用して、極めて客観的に、標準化されたスキームで行われており、審査 を人が行うときのような「紛れ」の要素はほとんどないといって過言ではありま せん。  従って前述のような内容の個別の質問にもお答えしようがありませんのでご了 承ください。 ■0x04.) 初期審査とは  皆さんがカードに申し込まれる場合、最初は当然ですが申し込み表に記入する ことになります。最近ではインターネットでの受付もできる企業がほとんどです ので、インターネットで入会される方も多いと思いますが、入力する内容は手書 きの場合とまったく同じですので、両者の違いについては本資料では特に言及し たとき以外は同じだと思っていただいて結構です。ただし、カード会社によって は若干異なることもあります。最近では、「ネットで10分で審査!」などを売り 物にしているクレジットカード会社や信販会社も存在しますが、そこで行われて いるのがすなわち「初期審査」と呼ばれるものです。初期審査はあくまでも申し 込み表の内容から審査を行うものであり、意図するかしないかに関わらず虚偽の 事実が記入されていたり、空白だったりとその信用度にはやはり疑問が残ります。 従って初期審査を通過してから、(場合によっては申込者の意思を確認した後) 「本審査」に移行します。本審査では先ほどの内容に加えて「個人信用情報」を 利用します。個人信用情報とは銀行が加盟する全国銀行個人信用情報センターや 信販系が加盟するCICなど、個人の信用情報、すなわち、他社借金の件数や過去の 延滞履歴