DLL逆向学习

前言

为了分析一个DLL注入的病毒(TinyTurla-NG),学习的关于DLL的逆向,只是资料总结,参考链接都会贴在最后面。

svchost.exe 进程

  网上有很多关于svchost.exe是什么进程,svchost.exe是什么病毒,svchost.exe占用cpu100%或占用大量内存,svchost.exe有十几个,svchost.exe偷偷连网很象木马的问题,本文提供关于svchost.exe进程的所有信息和用各种专业软件进行查杀的方法。

0x01 svchost.exe是什么进程

  Svchost.exe是微软视窗操作系统里的一个系统进程,管理通过Dll文件启动服务的其它进程,一些病毒木马伪装成系统dll文件通过Svchost调用它,试图隐藏自己。每个svchost可以同时调用多个dll文件,启动多个服务。

0x02 svchost.exe文件的位置

  svchost.exe位于C:\WINDOWS\system32文件夹下面(假如你的系统安装在C:\WINDOWS目录),同时在C:\WINDOWS\system32\dllcache下面有一个备份。

0x03 svchost.exe进程应该有几个

  Windows 2000有2个以上svchost进程,Windows XP有4个以上,Windows Vista系统svchost进程有12个以上。因此在任务管理器里看到多个svchost.exe并不代表他们就是病毒。

0x04 什么样的svchost.exe是病毒

  C:\WINDOWS\system32文件夹下面的svchost.exe文件,病毒一般是无法替换的,除了这个目录和C:\WINDOWS\system32\dllcache目录,其它目录下面都不应该存在svchost.exe文件,如果有不是病毒就是木马,可放心删除。如果无法删除,请用unlocker等软件强行删除。

​ 此外由于svchost.exe中间的o容易被0(零)冒充,所以有不少蠕虫,病毒冒充,它们的名字有:svch0st.exe、schvost.exe、scvhost.exe,要注意仔细辨别,防止漏网之鱼。

0x05 查看通过svchost.exe启动的病毒

查看通过svchost.exe启动的服务有多种方法,在Windows 2000中,可以运行cmd,然后输入tlist -s命令来查看,在Windows XP和Vista中,可以通过tasklist /svc命令查阅。

我们还可以通过Process Explorer软件来侦察服务,启动Process Explorer后,主窗口会列出所有运行的进程,鼠标移动上去会显示进程对应的文件的完整路径,和它启动的服务(如果有的话)

image-20240301151001736

  我们选中服务最多的那个svchost.exe进程,右键菜单查看属性(Properties),单击Services(服务)标签,、

image-20240301151036707

大部分服务的dll文件都位于c:\windows\system32目录,如果在什么C:\Program Files甚至是D盘E盘的,就要小心了,十有八九是个木马!如果我们怀疑一个dll不正常,可以通过Google或者百度搜索。

0x06 强行关闭svchost进程

如果你怀疑某个svchost进程是冒充的病毒,或者占用了90%以上CPU,可以强制杀死它。

运行CMD后在dos窗口输入ntsd -c q -p 800即可杀掉Svchost进程(假设svchost.exe进程的PID是800)。

(要查看PID,在windows任务管理器里单击菜单【查看】->【选择列】,勾选PID (进程标识符)确定即可)

ntsd命令可以杀掉任何一个System/SMSS.EXE/CSRSS.EXE以外的进程,即使你用任务管理器杀不死。

DLL注入

什么是DLL注入?

dll注入是一种将Windows动态链接库注入到目标进程中的技术,具体的说,就是将dll文件加载到一个进程的虚拟地址空间中。对某个进程进行dll注入,也就意味着dll模块与该进程共用一个进程空间,则这个dll文件就有了操纵这个进程空间的能力,以达到执行dll模块中的代码修改进程数据的能力。dll注入技术在逆向工程,病毒,外挂,调试等技术领域都有广泛的应用,它也是Windows API hook技术的基础。

改善功能与修复Bug改善功能与修复Bug

DLL注入技术可用于改善功能与修复Bug。没有程序对应的源码,或直接修改程序比较困难 时,就可以使用DLL注入技术为程序添加新功能(类似于插件),或者修改有问题的代码、数据。

消息钩取

Windows OS默认提供的消息钩取功能应用的就是一种DLL注入技术。与常规的DLL注入唯 一的区别是,OS会直接将已注册的钩取DLL注入目标进程。

API 钩取

API钩取广泛应用于实际的项目开发,而进行API钩取时经常使用DLL注入技术。先创建好 DLL形态的钩取函数,再将其轻松注入要钩取的目标进程,这样就完成了API钩取。这灵活运用 了 “被注入的DLL拥有目标进程内存访问权限”这一特性。

其他应用程序

DLL注入技术也应用于监视、管理PC用户的应用程序。比如,用来阻止特定程序(像游戏、 股票交易等)运行、禁止访问有害网站,以及监视PC的使用等。管理员(或者父母)主要安装 这类拦截/阻断应用程序来管理/监视。受管理/监视的一方当然千方百计地想关闭这些监视程序, 但由于这些监视程序采用DLL注入技术,它们可以隐藏在正常进程中运行,所以管理员一般不用 担心被发现或被终止(若用户强制终止Windows系统进程,也会一并关闭系统,最后也算达成了 拦截/阻断这一目标)。

恶意代码

恶意代码制作者们是不会置这么好的技术于不顾的,他们积极地把DLL注入技术运用到自己 制作的恶意代码中。这些人把自己编写的恶意代码隐藏到正常进程(winlogon.exe、services.exe、 svchost.exe, explorer.exe等),打开后门端口 ( Backdoor port),尝试从外部连接,或通过键盘偷 录(Keylogging )功能将用户的个人信息盗走。只有了解恶意代码制作者们使用的手法,才能拿 出相应对策。

DLL注入的实现方法

向某个进程注入DLL时主要使用以下三种方法:

  • 创建远程线程(CreateRemoteThread。API)
  • 使用注册表(AppInit DLLs值)
  • 消息钩取(SetWindowsHookEx。API)

ServiceMain函数

调试dll中的导出函数ServiceMain

  • ServiceMain一般是被服务进程调用执行的,创建服务,启动起来之后,被执行,可以按调试服务的方式调试

  • 直接rundll32.exe C:\1.dll ServiceMain

该方法适用于调试任何dll的任何函数。

ServiceMain是Svchost程序的默认启动函数,于是我们需要通过Svchost去启动,也就是修改注册表达到启动的目的

用svchost启动DLL

  • svchost.exe 是从动态链接库(DLL)中运行的服务的通用主机进程名称,本身只是作为服务宿主,并不实现任何服务功能,提供条件让其他服务在这里被启动,需要svchost.exe启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost.exe,启动这些服务时由svchost.exe调用相应服务的动态链接库来启动服务。
  • svchost.exe文件定位在系统的%systemroot%\system32文件夹下 **%systemroot%**是系统的环境变量 指的是系统的根目录

  • 系统的大部分服务是运行 动态链接库(dll)形式实现的。如果需要使用Svchost来启动某个DLL形式实现的服务,该DLL的载体Loader指向Svchost,在启动服务的时候由Svchost调用该服务的DLL来实现启动的目的。使用Svchost启动某个服务的DLL文件是由注册表中的参数来决定的,在需要启动服务的注册表项下都有一个“Parameters”子项,其中的“ServiceDll”键值表明该服务由哪个DLL文件负责,并且这个DLL文件必须导出一个ServiceMain()函数,为处理服务任务提供支持

首先我们来手动在注册表注册一个服务

开始->运行 输入regedit 找到如下子键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

  1. 在Services子键下新建一个子键TestSvchost。
  2. 在子键TestSvchost新建所需子键项,子键项说明如下:
    (1) Description 服务描述
    (2) DisplayName 服务显示名
    (3) ErrorControl 当该启动服务失败时产生错误的严重程度以及采取的保护措施 这里我们填 1 表示服务启动程序将把该错误记录到事件日志中并返回继续执行
    (4) ImagePath 程序的路径 我们要启动的是svchost.exe所以填入
    %systemRoot%\system32\svchost.exe -k netsvcs -k netsvcs表示这个服务是属于netsvcs服务组
    (5) ObjectName 指定服务帐号 LocalSystem表示本地登录
    (6)Start 服务启动选项
    填入2表示系统启动时由服务控制管理器自动启动该服务程序
    (7)Type 服务类型
    填入0x10表示运行于独立进程的服务程序
    image-20240305115516521
  3. 在子键TestSvchost下再建一个子键Parameters。
  4. 在子键Parameters新建子键项ServiceDll
    image-20240305115550877ServiceDll表示服务所对应dll所在的全路径

将我们在注册表写入服务加入Svchost的服务组netsvcs中

  1. 找到注册表子键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost 并打开子键项netsvcs。netsvcs里面的值就是svchost的服务组netsvcs所启动的所有服务
    image-20240305115705511
  2. 打开netsvcs键值项 添加数值数据TestSvchost(服务名)
    image-20240305115729334
  3. 将1.dll放入C:\WINDOWS\system32目录下并重启电脑。重启后,点击开始->运行 输入services.msc 可以查看到该服务处于已启动状态。
    image-20240305115853928

引用

https://blog.csdn.net/sky101010ws/article/details/17632697

https://blog.csdn.net/weixin_46601374/article/details/121097807

https://blog.csdn.net/weixin_46953583/article/details/105841908

https://blog.csdn.net/huanglong8/article/details/70666987