Win 32下ウイルス設計入門
Win 32下ウイルス設計入門 本文はdosの下のウィルスと386 PMについて一定の理解があると仮定します。 1、どのウイルスに感染するにもホストが必要で、ウイルスコードをホストプログラムに加える(パートナーウイルスを除く)。 ウイルスコードをPEファイルに埋め込む方法を説明します。PEファイルに関する構造は以前の記事をご覧ください。 PEファイルの典型的な構成: MZ。 ヘッド DOS STUB コード PE HEADER OPTIOAL HEADER SECTION TABLE SECTION 1 SECTION 2 ... IMPORT TABLE EXPORT TABLE DOSの実行可能ファイルと同様に、PEのコード映像はいくつかのSECTIONに分けられ、ファイルに配置されます。 ページ境界(4 K)一般的には、ファイルは40000 hから始まる空間にロードされますが、最初のSECTIONは401000 hのところにあります。同時に入り口の住所も401000 hです。高級言語によって作成されたプログラムは、各SECTIO-Nの長さがちょうど4 Kの倍数であるはずがないので、SECTIONの末尾には未使用の空間があるはずです。 , サイズはセレクションのPHYSICALからできます。 SIZE-VIRTUALSIZEで得られ、ファイル内の先頭位置は PHYSICAL この空間はウイルスコードを保存するために使用できる。また、一般的には、 MZ。 Header+DOS STUD+PE HEADER+OPTTIONEAL HEADER+SECTION TABLEは1 Kぐらいしかないです。 SECTION 1は4 Kから始まります。空いているところにはデザインの良いウイルスが十分保存されています。CIHは将です コードはこれらの空きスペースに保存されます。 2、常駐に必要なメモリを割り当てる 常駐型のウイルスには、必要なメモリを割り当てる必要があります。DOSで使うのはすべてのためです。 アプリケーションは同じ線形アドレス空間にマッピングされています。一般的なメモリ割り当てを使って呼び出しても十分です。WIN 32では、それぞれのアプリケーションは線形アドレス空間があり、2 GB以上のシステムアドレスを特別な関数で割り当てる必要があります。典型的な例:VXDサービス_PageAllocateとケネル32の VxDCALL _PageReseve。_PageAllocateはwin 98 ddkの説明を参照してください。VxDCall _PageReseve HPSソースのコメントを参照してください。 3、保留FILE I/O操作 常駐型のウイルスは、FILEを切断します。 I/Oをアクティブにして、VXDサービスを利用することができます。 IFRSMgr_Install-File System API Hook(CIHなど)またはVxDCallのDOSを切り取ります。 Services calback(HPSなど)。 Win 32でウイルスを作成するのは難しいことではない。注意すべきことはいくつかあります。 一、Win 32におけるシステム機能呼び出しは、中断によって実現されるのではなく、DLLによって導出される。 (直接VxDサービスを使用する場合を除く)。直接ウィルスの中でAPIの入り口を得るのは簡単なことではありません。 同じバージョンのWindowsでは、同じコア関数の入口は常に固定されています。したがって、関数の入り口は以下の方法で得られます。 .386 p .モデル flat、stdcal extrn Get ModuleHandleA:proc extrn Get ProckAddress:proc extrn ExitProcess:proc .ダタ szKernel db 'KERNEL 32.DLL'は、0 szFindFirst db 'FindFirst FileA'0 szFindNext db 'FindNext FileA',0 szFindClose db 'FindClose,0 szGet CurrenentDir db 'Get Currennt DirectoryA'は、0 szGet WinDir db 'Get Windows DirectoryA'は、0 szGet SysDir db 'Get System DirectoryA'は、0 szGet FileAttrib db 'Get FileAttributes A'は、0 szSet FileAttrib db 'Set FileAttributes A',0 szlopen db '_lopen',0 szlread db '_l read',0 szlwrite db '_lwrite',0 szl close db '_l close',0 szllseek db '_llseek,0 hKernel dd。 0 .コード ;Initialize コード start: プッシュする szKernel コール Get Module HandleA mov hKernel、eax プッシュする szFindFirst プッシュする hKernel コール Get ProcAddres mov FindFirst File,eax .... jmp Virus Start Init Exit: プッシュする 0 コール ExitProcess Virus Start: jmp Entry HostEntry dd。 Init Exit FindFirst File dd。 0 FindNext File dd。 0 ... Entry: ... end start Intializeで コードは使用する関数を入り口に入れてウイルスに記入し、ウイルスが実行される時に直接使用することができます。二:主にファイルI/Oを切り取ります。 Windowsの下でファイルI/Oを切り取る操作にはいくつかの方法がありますが、ウイルスには主に2つの方法があります。 1、VxDCallIFSMgr_を使用するInstall FileSystem Hook 2、差し止めKernel 32.dllから導出した最初の関数VxDCallはDOSに対して INT 21の呼び出し(EAX=2 A 0010)。 VxDCallのコードは以下の通りです。 mov eax,dword ptr [esp+04] ポップ dword. ptr [esp コール fword ptr cs:[xxxxxxx] ^^^^^^^^このアドレスが指すアドレスを自分のプロセスの入り口に変更するだけで、すべてのVxDCallがキャプチャされます。 このプロセスに入る時: eax=service number、DOSなら INT 21は2 A 0010になります esp[2 c]dはIntを呼び出します 21時eaxの値 ~~~~ pushardを計算漏れました。10 hです。 esp[30] コールポイント 21時ecxの値 ~~~~14 h 他のレジスタは呼び出し時に必要な値です。セグメントレジスタ不要) あとはDOSでウイルスを書くのと同じです。 WINDOWSの下でウィルスを書いて、どのようにAPIの入り口を得るのは1件の面倒な事です。 直接使用できるAPIはDLLの中にあります。VXDCALLはRING 0の時に使えます。 使う、DOSのINT 21サービスも直接に呼び出すことができません。 DLL中のAPI入り口を得るためには、2つの方法がある。 1.読み込み時に取得し、作成します。 IMPORT TABLEは、ロード時にWINDOWSはIMPORTによります。 TABLE位置付けAPIの これは一般的なアプリケーションの使い方ですが、ウイルスにはあまり適していません。 2.実行時に入手したGetModuleHandleとGetProcAddresはAPIの入り口を得るが、前提としてGetModuleHandleとGetProcAddresの情報を知る必要がある。 入り口の住所:< これは明らかに不可能です。GetModuleHandleとGetProcAddresのコードを私たちのウイルスにコピーする以外は、暴力を使用しています。 2 GBの空間内でAPIの入り口を見つけました。 まず、WINDOWSのメモリマップを説明します。0000から一段は 無効なアドレス(どれぐらい忘れましたか?)は、アプリケーションのエラーをキャプチャするための指針です。 0 x 7 FFFFFFFまではアプリケーションの空間です。0 X 800万以降はシステムです。 DLLとVXDはここに写ります。私たちが作るべきのはこの2 GBの空間からKrnl 32.dllを見つけます。 一般的にWindows下のプログラムは64 kの境界に配置されています。まずMZです。 ファイルヘッダ、MZに続く HEADERの情報はPEを得ることができます。 HEADERの入り口 このマークからすべてのDLLを探し出すことができます。PEから HEADERはDLLのを得ることができます。 EXPORT TABLEの入り口です。中にNAMEがあります。 PTR TABLEの第一項はDLLの名です。 これにより、Krnl 32.dllを探し出し、ADDRESSから TABLEの中でどれを得ますか? APIの入り口 注意すべきなのは、この2 GBでは、すべてではなく、アドレスが有効であることです。 一般的なプログラムでは、IsXXXTRでアドレスが有効かどうかを判断できますが、ウイルス 中はだめです。ホクしかできません Exceptionは、アクセス無効のアドレスによるExceptionを無視します。 Windows中のException Charinの構造は以下の通りです。 fs:[0] dword. exceptionが発生した時のespの新しい値は次の通りです。 の構造 [esp dword. fs:[0]の新しい値 [esp+4] dword. exception ハンドルの入り口 [esp+8] dword. exception ハンドルが使用するデータヘッダアドレス [esp+12] dword. -1詳細なアセンブリコードはCで_u u_uを書くことができます。try…_.exceptのコードは、その後 アセンブリに変換する 私たちのexceptionだけが必要です。 handlerは直接ウィルスの中に移動します。Krnl 32.dllを探しています。 のコードがあれば、GPを起こさなくてもいいです。 Errは任意のアドレスにアクセスしました。 例はHPSのソースコード、PEを参照することができます。 HEADER、EXPORT TABLEはPEを参照してください FOREMAT. 1、WindowsでダウンロードしたDLLは、異なるprocessで同じアドレスにマッピングされます。 2、DLLで導出した関数はexportにあります。 テーブルに相対DLLを記録する。 Image ベース このオフセットを変更するとGetProcAddresを使って得られたアドレスが変わります。 (想像してみてください。CreateProcessアドレスを自分のDLLの関数に向けるか、またはGetDlgItemTextを切り取ってPasswordを記録します。 3、Kernel 32.DLLでSection テーブルは0 x 300の前に終わりました。本当のコードは0 x 1000から始まります。その間に3 Kの未使用空間があります。コードを保存するために使えます。 Kernel 32.DLLのImage BaseはGet ModuleHandleAによって得られます。 4、どのバージョンのWindowsでも、3つの基本的なDLLは常にローディングされています(Kernel 32.DLL、User 32.DLL、GDI 32.DLL)、そして同じバージョンのWindowsについては、それらのImageがあります。 ベース、およびエクスポート関数のアドレスは常に固定されています。得られたアドレスはウイルスに直接使用できます。 ( NTでウイルスを書いてもいいです。またシステムを変えます。 )