绕过杀毒软件之一

精选_基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块_源码打包 基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块 立即下载
杀毒软件的实时监控分为两个部分
  一:Notify部分
  二:Attach到文件系统部分

一:Notify对与杀毒软件致关重要(有些流氓软件也用的),主要用到的是
   PsSetLoadImageNotifyRoutine和
   PsSetCreateProcessNotifyRoutine这两个函数

1 PsSetLoadImageNotifyRoutine(
  IN PLOAD_IMAGE_NOTIFY_ROUTINE  NotifyRoutine
  );
  通过字面意思大家也知道,就是文件被加载的时侯会调用这个
NotifyRoutine ;最简单的是一个Exe在Run的过程中,PE加载器检查它所depend的dll,然后由PE加载器LoadLibaray这些dll,此时 NotifyRoutine 就被调用起来了。
(PS:这个NotifyRoutine就是一个callback)

part1: 2k下的分析 
kd> u PsSetLoadImageNotifyRoutine L10
nt!PsSetLoadImageNotifyRoutine:
804e31d4 b89a0000c0       mov     eax,0xc000009a
804e31d9 33c9             xor     ecx,ecx
804e31db ba20324880       mov     edx,0x80483220
804e31e0 833a00           cmp     dword ptr [edx],0x0
804e31e3 740e             jz      nt!PsSetLoadImageNotifyRoutine+0x1f (804e31f3)
804e31e5 83c204           add     edx,0x4
804e31e8 41               inc     ecx
804e31e9 81fa40324880     cmp     edx,0x80483240
804e31ef 72ef             jb      nt!PsSetLoadImageNotifyRoutine+0xc (804e31e0)
804e31f1 eb1a             jmp     nt!PsSetLoadImageNotifyRoutine+0x39 (804e320d)
804e31f3 8b442404         mov     eax,[esp+0x4]
804e31f7 ff0504324880 inc dword ptr [nt!PspLoadImageNotifyRoutineCount (80483204
)]
804e31fd 89048d20324880 mov [nt!PspLoadImageNotifyRoutine (80483220)+ecx*4],eax
804e3204 33c0             xor     eax,eax
804e3206 c6051031488001 mov byte ptr [nt!PsImageNotifyEnabled (80483110)],0x1
804e320d c20400           ret     0x4

对应c代码:
ULONG i;
NTSTATUS Status;
Status = STATUS_INSUFFICIENT_RESOURCES;
for (i=0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++) 
{
   if (PspLoadImageNotifyRoutine[i] == NULL)
   {
       PspLoadImageNotifyRoutine[i] = NotifyRoutine;
       PspLoadImageNotifyRoutineCount+= 1;
       Status = STATUS_SUCCESS;
       PsImageNotifyEnable= TRUE;
       break;
   }
}

我们如果不想让某个
NotifyRoutine 监控,就把它在PspLoadImageNotifyRoutine数组中对应项清空,可是PspLoadImageNotifyRoutine并没有导出,我们不能直接调用,有什么方法呢?

1)  我们自己写个MyNotifyRoutine.
    VOID MyNotifyRoutine(
    IN PUNICODE_STRING  FullImageName,
    IN HANDLE  ProcessId, 
    IN PIMAGE_INFO  ImageInfo)
{
    return;
}

2) PsSetLoadImageNotifyRoutine(MyNotifyRoutine);

3) 直接在PsSetLoadImageNotifyRoutine函数里找有效地址,然后访问这个地址,看有没有MyNotifyRoutine的地址,没有的话再找下一个;

4) 直到找到为止,那么此时这个有效地址就是PspLoadImageNotifyRoutine的地址了

5) 遍历PspLoadImageNotifyRoutine数组中的地址,检查这些地址是否落在某个驱动程序的地址范围,如果是的话,清了这一项,现在再LoadLibrary这个驱动程序就不会收到任何通知了。
如果你闲麻烦就直接把PspLoadImageNotifyRoutine所有项都清理掉。


part2: xp/2003下的分析
lkd> u  PsSetLoadImageNotifyRoutine  L25
nt!PsSetLoadImageNotifyRoutine:
8062d4f7 8bff             mov     edi,edi
8062d4f9 55               push    ebp
8062d4fa 8bec             mov     ebp,esp
8062d4fc 53               push    ebx
8062d4fd 57               push    edi
8062d4fe 33ff             xor     edi,edi
8062d500 57               push    edi
8062d501 ff7508           push    dword ptr [ebp+0x8]
8062d504 e833790100       call    nt!ExAllocateCallBack (80644e3c)
8062d509 8bd8             mov     ebx,eax
8062d50b 3bdf             cmp     ebx,edi
8062d50d 7507             jnz     nt!PsSetLoadImageNotifyRoutine+0x1f (8062d516)
8062d50f b89a0000c0       mov     eax,0xc000009a
8062d514 eb2a             jmp     nt!PsSetLoadImageNotifyRoutine+0x49 (8062d540)
8062d516 56               push    esi
8062d517 be001d5680       mov     esi,0x80561d00
8062d51c 6a00             push    0x0
8062d51e 53               push    ebx
8062d51f 56               push    esi
8062d520 e84e790100       call    nt!ExCompareExchangeCallBack (80644e73)
8062d525 84c0             test    al,al
8062d527 751d             jnz     nt!PsSetLoadImageNotifyRoutine+0x4f (8062d546)
8062d529 83c704           add     edi,0x4
8062d52c 83c604           add     esi,0x4
8062d52f 83ff20           cmp     edi,0x20
8062d532 72e8             jb      nt!PsSetLoadImageNotifyRoutine+0x25 (8062d51c)
8062d534 53               push    ebx
8062d535 e89134f4ff       call    nt!RtlpSysVolFree (805709cb)
8062d53a b89a0000c0       mov     eax,0xc000009a
8062d53f 5e               pop     esi
8062d540 5f               pop     edi
8062d541 5b               pop     ebx
8062d542 5d               pop     ebp
8062d543 c20400           ret     0x4


对应c代码:
     ULONG i;
     PEX_CALLBACK_ROUTINE_BLOCK CallBack;

     CallBack = ExAllocateCallBack((PEX_CALLBACK_FUNCTION) NotifyRoutine, NULL);
     if (CallBack == NULL) {
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
     for (i = 0; i < PSP_MAX_LOAD_IMAGE_NOTIFY; i++) {

         if (ExCompareExchangeCallBack(&PspLoadImageNotifyRoutine[i],
                                        CallBack,
                                        NULL)) {
             InterlockedIncrement ((PLONG)&PspLoadImageNotifyRoutineCount);
             PsImageNotifyEnable = TRUE;
             return STATUS_SUCCESS;
         }
     }
     ExFreeCallBack(CallBack);

    return STATUS_INSUFFICIENT_RESOURCES;


 
2 PsSetCreateProcessNotifyRoutine

二 Attach到文件系统部分

 
href="http://blog.youkuaiyun.com/pll621/Services/Pingback.aspx" rel="pingback" />
 
帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 帆软 finereport FCRA 考试 题库+答案,共收录561题,大部分有答案 入门基础 11.多选题 以下方式中属于FineReport中预览模式的有( ) 分页预览、填报预览、新填报预览、数据分析、移动端预览 16.判断题 FineReport报表工具必须购买激活码后才能使用。 错误,可以免费获取激活码。 29.单选题 FineReport是一款利用( )语言开发的报表工具。java 41.多选题 访问帮助文档的方式有哪些?设计器中社区菜单下-帮助文档;直接访问http://help.finere 阅读详情

相关推荐

手势控制 Python !Leap Motion Python 开发教程 (二)

手势控制 Python !Leap Motion Python 开发教程 (二) 现在进入正题,我来给大家总结一下我在使用 Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官方给出的注释,为了让这些注释更加通俗易懂,让大家更好理解。 回顾 在上一篇文章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参...

成畅的博客 3192

绕过杀毒软件之一(实时监控篇)

杀毒软件的实时监控分为两个部分  一:Notify部分  二:Attach到文件系统部分一:Notify对与杀毒软件致关重要(有些流氓软件也用的),主要用到的是   PsSetLoadImageNotifyRoutine和   PsSetCreateProcessNotifyRoutine这两个函数1 PsSetLoadImageNotifyRoutine(  IN PLOAD_IMAGE_NOT

老裴 6938

STM32 ES8266上阿里云IOT MQTT实践【第七章】:ESP8266+MQTT上阿里云物联网平台实践

本篇文章讲述了如何使用stm32接入阿里云IOT,WiFi模块为ESP8266,可以实现发布以及订阅。

超级大洋葱的博客 2万+

基于PsSetLoadImageNotifyRoutine实现监控模块加载并卸载已加载模块(卸载DLL、EXE和sys等加载)

背景 对于内核层实现监控模块的加载,包括加载DLL模块、内核模块等。你也许会想到 HOOK 各种内核函数来实现。确定,在内核层中的 HOOK 已经给人留下太多深刻的印象了,有 SSDT HOOK、Inline HOOK、IRP HOOK、过滤驱动等等。 但是,Windows 其实给我们提供现成的内核函数接口,方便我们在内核下监控用户层上模块加载的情况,即 PsSetLoadImageNotifyRoutine 内核函数,可以设置一个回调函数,来监控监控模块加载。 现在,本文就使用 PsSetLoadI

苞米地里捉小鸡的博客 4602

解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题

解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题

y_u_yu_yu_的博客 1万+

C300 | 5680t | 新格林| AN5516 | 远程ONU升级指导

ONU的远程管理升级 1、ZTE C300 OLT : 1.1 环境拓扑: PC1(filezilla server)------(uplink_default-vlanID)OLT---------ONU | | mng1 1.2 配置部署: 1):PC1(filezilla server): IP:192.168.88.252 255.255.255.0 配置FTP-Server的用户名:gp...

Shelly的博客 3770

绕过杀毒软件之一(实时监控篇)续

上次说的绕过杀毒软件之一(实时监控篇)中,提供了解决方法这是对应代码:(至于如何清理具体驱动的NotfiyRoutine,就是找到驱动所加载的地址,用PsLoadedModuleList或ZwQuerySystemInformation,然后判断PspLoadImageNotifyRoutine中的项是否落在此驱动范围,我在这就不罗嗦了,自己动手去)//FixNotify.h//Its for

老裴 2234

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

在Minifilter中使用PsSetCreateProcessNotifyRoutine之后监控到的一些进程信息

一个进程总是被另一个进程创建的,追根求源,所有进程的“父”进程都是0进程 以双击桌面上的1.txt为例: 默认方式1.txt会被notepad.exe打开,在回调 VOID (*PCREATE_PROCESS_NOTIFY_ROUTINE) (     IN HANDLE  ParentId,     IN HANDLE  ProcessId,     IN BOOLEAN

fengkuangfj的专栏 1660

机器学习实战5-天气预测系列:利用数据集可视化分析数据,并预测某个城市的天气情况

大家好,我是微学AI,最近天气真的是多变啊,忽冷忽热,今天再次给大家带来天气的话题,机器学习实战5-天气预测系列,我们将探讨一个城市的气象数据集,并利用机器学习来预测该城市的天气状况。该数据集包含年平均温度和湿度等信息。

微学AI的博客 1万+

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1291

java字符串转日期比较大小_Java字符串转换为日期和时间比较大小

Java字符串转换为日期和时间比较大小Posted on 2010-12-07 15:55 chinaifne阅读(36130) 评论(1) 编辑收藏方法一:DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");String dateBegin=fmt.format(carrierCommand.getDateBegin());String dat...

weixin_35756373的博客 1124

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2571

java时间字符串比较大小_Java字符串转换为日期和时间比较大小

方法一:DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");String dateBegin=fmt.format(carrierCommand.getDateBegin());String dateEnd=fmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是'2008-05-22',就必须要...

weixin_39722375的博客 1007

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java字符串转换为日期和时间比较大小

字符串转换为时间: String data = "2014/7/11"; SimpleDateFormat dfs = new SimpleDateFormat("yyyy/MM/dd"); java.util.Date begin=dfs.parse(data); System.out.println(begin); 结果: Fri Jul 11 00:0...

weixin_30764137的博客 111

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[转]Java字符串转换为日期和时间比较大小

方法一: DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); String dateBegin=fmt.format(carrierCommand.getDateBegin()); String dateEnd=fmt.format(carrierCommand.getDateEnd()); //如果获得的日期格式不是'2008-05-...

colddemon的博客 993

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java日期字符串比较大小_【转】Java字符串转换为日期和时间比较大小

方法一:DateFormat fmt = newSimpleDateFormat("yyyy-MM-dd");StringdateBegin=fmt.format(carrierCommand.getDateBegin());StringdateEnd=fmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是'2008-05-22',就必须要...

weixin_39712969的博客 552

java获取时间的字符串大小_Java字符串转换为日期和时间比较大小

方法一:DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");String dateBegin=fmt.format(carrierCommand.getDateBegin());String dateEnd=fmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是'2008-05-22',就必须要...

weixin_33911375的博客 134

java字符串转日期_Java字符串转换为日期和时间比较大小

方法一:DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");String dateBegin=fmt.format(carrierCommand.getDateBegin());String dateEnd=fmt.format(carrierCommand.getDateEnd());//如果获得的日期格式不是'2008-05-22',就必须要...

weixin_42419508的博客 218
上一篇: 实用级反主动防御rootkit设计思路
下一篇: 绕过杀毒软件之一续
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值