欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

一马调试分析之下篇(马说)

一马调试分析之下篇(马说)

第一部分:猥缩的驱动
技术亮点:
1、得到“处女之身”,(在女人心中第1个男人永远会记得),主要目的是为了使自己挂钩原始的东西,sub_148a8()获取ntoskrnl的文件地址(ZwQuerySystemInformation),sub_11c78将ntoskrnl文件映身入内存,sub_136b6()找到原始SSDT偏移,sub_11338()手动重定位从而找到原始地址。具体实现可以看一下。原始的SSDT的函数地址。
2、大玩“躲猫猫”,创建服务,实施“乾坤大挪移”修改文件名,躲猫猫之对象HOOK \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES的ParseProcedure CmParseKey实现注册表隐藏。
   IoDeviceObjctType的IopParseDevice,实现文件保护。(ObRefernceObjectByHandle)。
DriverEntry ===>
主要流程:
    1、通过与"System"比较,确定进程名在PEB中的偏移(因为加载驱动时进程是System,这样做实际上是因为不同操作系统偏移位置不同)
    2、解密字符串
    3、获取所需的函数的地址
    4、调用DriverReinitializationRoutine,开始猥缩的操作
流程4:DriverReinitializationRoutine ===>
    1、测试打开"\SystemRoot"(这个应该是测试文件系统是否初始化完毕)
      1-1、打开失败,使用IoRegisterDriverReinitialization从而转到1.
      1-2、打开成功,进入sub_16BFE()。
流程4 ==> 流程1-2:sub_16BFE() ===>
     1、解密字符串
     2、获得原始SSDT,以获取原始函数的地址(内核本就是兵家必争之地,极可能不是“处女之身”了,可见作者也明白这道理)
        2-1、获取失败,还是用别人搞了的函数,避免操作失败
     3、sub_1132A(),调用PsSetCreateProcessNotifyRoutine注册进程回调,在回调中进行各种XX操作,回调例程为sub_108B8
     4、sub_16BD2(),调用sub_1575C(),查找NtSetValueKey及NtDeleteKey中对ObReferenceObjectByHandle的调用。
         4-1、如果找到则对NtSetValueKey及NtDeleteKey中对ObReferenceObjectByHandle的调用进行Inlie HOOK,Inline后分别对应调用sub_157F0()及sub_15824()
         4-2、如果没找到则直接SSDT HOOK NtDeleteKey
     5、sub_16AF2(),创建服务,实施“乾坤大挪移”修改文件名,对键HOOK \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES CmParseKey,以实现对服务的隐藏。
     6、sub_10DE4(),HOOK IoDeviceObjctType的IopParseDevice,实现文件保护.
(PS,获取原始SSDT中,原始函数的地址,主要是通过读取ntoskrnl文件中原始SSDT的值)
流程4 ==> 流程1-2 ==> 流程3:回调流程sub_108B8() ===>
     这个例程分别对userinit.exe、explorer.exe、rundll32.exe、iexplorer.exe进行不同的处理,实际上都是一些注册表的操作,主要是实现应用层的DLL起动,注册为IE的加载项,以便随同IE一起加载
     1、case userinit:   写入\registry\machine\software\microsoft\windows\currentversion\runonce的键unfd,
                         对应的值为%systemroot%\system32\rundll32.exe %systemroot%\system32\zuefhm.dll,DllRegisterServer"
     2、case explorer:   一些注册表查询设置操作,这里注册表操作较多,有兴趣自己可以跟一下,小弟简单列一下,有下面的这些键
                         \REGISTRY\MACHINE\SOFTWARE\Classes\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\OpenHomePage\Command
       \REGISTRY\MACHINE\SOFTWARE\Classes\CLSID\{0DDF3C19-E692-22D2-AB05-11AA44BDD685}\Shell\Open\Command
       \REGISTRY\MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu
       \REGISTRY\MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel
       \REGISTRY\MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\REGISTRY\USER\S-1-5-21-823518204-1336601894-1417001333-       500\Software\Microsoft\Internet Explorer\Main
       \REGISTRY\USER\S-1-5-21-823518204-1336601894-1417001333-500\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons            \ClassicStartMenu\REGISTRY\USER\S-1-5-21-823518204-1336601894-1417001333-500\Software\Microsoft\Windows\CurrentVersion\Explorer       \HideDesktopIcons\NewStartPanel
       \REGISTRY\USER\S-1-5-21-823518204-1336601894-1417001333-500\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer \REGISTRY\USER\S-1-5-         21-823518204-1336601894-1417001333-500\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
     3、case rundll32:   判断其父进程是否是ExpLorer.exe
     4、case iexplorer:  进行一些计时操作
看一下对应几次解密后分别对应如下几图:



我们再来看一下HOOK NtDeleteValueKey中对ObReferenceObjectByHandle的调用前如下图:

HOOK前查找NtSetValueKey中对ObReferenceObjectByHandle的调用前如下图:

再来看一下HOOK NtDeleteValueKey、NtSetValueKey后如下图:

看一下\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES的ParseProcedure CmParseKey被HOOK前:

对比下\REGISTRY\MACHINE\SYSTEM\CONTROLSET001\SERVICES的ParseProcedure CmParseKey被HOOK后:

再来看下代码:
看一下DriverEntry

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功