• dll劫持破坏360


    0x01 前言

    说起DLL劫持技术,相信大家都不会陌生,因为这种技术的应用比较广泛,比如木马后门的启动破解程序的内存补丁外挂插件的注入以及加密狗的模拟等。之所以DLL劫持技术深受黑客们的喜爱,主要是因为该技术可以有效的躲过大部分杀软,并且实现起来技术难度不大。DLL劫持技术也不是什么新技术,记得在《Windows核心编程》中也有提及相关技术。可是对我们广大初学者来说,DLL劫持技术就显得很神秘了,本系列教程将向大家详细讲解什么是DLL劫持、DLL劫持的形成原因及原理、最后还会以实例向大家讲解如何通过编程实现DLL劫持。

    首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows的资源共享机制。为了尽可能多得安排资源共享,微软建议多个应用程序共享的任何模块应该放在Windows的系统目录中,如kernel32.dll,这样能够方便找到。但是随着时间的推移,安装程序会用旧文件或者未向后兼容的新文件来替换系统目录下的文件,这样会使一些其他的应用程序无法正确执行,因此,微软改变了策略,建议应用程序将所有文件放到自己的目录中去,而不要去碰系统目录下的任何东西。
    为了提供这样的功能,Window2000开始,微软加了一个特性,强制操作系统的加载程序首先从应用程序目录中加载模块,只有当加载程序无法在应用程序目录中找到文件,才搜索其他目录。利用系统的这个特性,就可以使应用程序强制加载我们指定的DLL做一些特殊的工作。
    举个例子来说吧,Windows的系统目录下有一个名为LPK.DLL的系统文件,程序运行时会在c:Windowssystem32文件夹下找到这个DLL文件并加载它。

    我们也可以在cmd中使用tasklist /m |more查看运行的程序调用的dll文件

     

     

     

    0x02 什么是dll劫持

     

    根据前面说的Windows资源共享机制,操作系统加载程序首先从应用程序目录中加载模块。这一特性在注册表中也有体现:HKLMSystemCurrentControlSetControlSession ManagerSafeDllSearchMode,如果为1,搜索的顺序为:应用程序所在目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->运行程序的当前目录->PATH环境变量,如果为0,搜索顺序为:应用程序所在目录->运行程序的当前目录->系统目录(用GetSystemDirectory获取)->16位系统目录->Windows目录(用GetWindowsDirectory获取)->PATH环境变量。Windows Server 2003默认值为1Windows XP/2000默认值为0或者没有这个键值。

     

    但是不管是哪种情况,第一个搜索的肯定是应用程序的所在目录,这样就有机会让应用程序去加载我们的DLL。如果这个DLL和系统目录下的某个DLL同名,导出表也相同,功能就是加载系统目录下的那个DLL,并且将导出表转发到那个真实的DLL。这时DLL劫持就发生了。可以看出,构造一个符合上面要求的DLL,再将其放在可执行文件的目录即可轻松实现DLL劫持了。

    0x03 dll劫持破坏360复现

    实验环境:windows7
    360版本:360安全卫士11

    首先生成一个dll

    msfvenom -p windows/exec CMD="calc.exe" -f dll > lbw.dll

    这里生成的恶意dll会调用cmd执行calc.exe(计算器),当然执行的程序也可以是木马程序。

     

     

    我们使用Procmon来观察360缺少的dll(Procmon是微软出品用于监视Windows系统里程序的运行情况,监视内容包括该程序对注册表的读写对文件的读写网络的连接进程和线程的调用情况,procmon 是一款超强的系统监视软件。)

     

    Procmon配置规则如下

     

    添加以上规则,注意规则的类型。

     

    运行360,可以看到调用的dll以及dll具体路径

    可以看到调用了系统的dll

    修改msf生成的dll名为api-ms-win-core-synch-l1-2-0,扔进C:Windowssystem32文件夹里

     结果:

    重新执行360

     

     

     

  • 相关阅读:
    多线程学习纪要
    字符编码ASCII、Unicode、UTF-8以及验证
    C# 自定义特性Attribute要点
    Java --- 流操作
    数据库 --- 索引
    Java -- 枚举
    mybatis --- 使用通用mapper或者mybatis-plus进行映射时,当数据库中有大写字母,自定义映射的字段名。
    后端 --- 快速创建一个sb项目 (使用spring官网的https://start.spring.io)
    数据库 --- decimal类型测试
    Java --- 线上故障调优01 打印堆栈信息
  • 原文地址:https://www.cnblogs.com/-qing-/p/10707416.html
Copyright © 2020-2023  润新知