HOOK SwapContext 枚举隐藏进程(学习笔记4)

Windows驱动加载工具---DriverLoader 近日在学习Windows驱动开发,由于经常需要动态的加载、卸载驱动,所以就使用Qt写了一个辅助工具,可以方便的安装、加载和卸载Windows驱动。下面详细的介绍一下该工具的使用方法: 1. 从http://download.youkuaiyun.com/detail/kecise/3883204下载DriverLoader的最新版本后解压到任意目录,双击DriverLoder.exe即可。     说明: 阅读详情
  作 者: bzhkl
时 间: 2008-12-11,12:01
链 接: http://bbs.pediy.com/showthread.php?t=78464

以前想检测一个被隐藏的进程 后来用暴力枚举的方法解决了 但是HOOK SwapContext没有看到有完整的代码 所以搜集了点网上有用的模块 自己整合实现了下 确定支持XP3, XP2没测试 应该也能支持 
附完整工程代码

难点:是得到SwapContext地址 还有一些细节问题~
原理:KiSwapContext调用SwapContext时候 ESI存放的是要换进线程的上下文 EDI存放的是要换出线程的上下文 然后截获ESI 即换进的ETHREAD 得到相应的EPROCESS 然后搜集
缺点:对系统性能影响非常大,因为系统线程调度很频繁, wrk的KiSwapContext用汇编写的就能体现出来对效率的要求高~.

另外有个有趣的问题 
KiSwapContext 是fastcall调用方式  就是通过ECX EDX传 多出的按STDCALL传
WRK 是这样注释的 
; BOOLEAN
; KiSwapContext (
;    IN PKTHREAD OldThread
;    IN PKTHREAD NewThread
;    )
但是看下 WRK中的代码 
        mov     edi, ecx                ; set old thread address
        mov     esi, edx                ; set next thread address
        movzx   ecx, byte ptr [edi].ThWaitirql ; set APC interrupt bypass disable
        call    SwapContext             ; swap context
 发现的确是两个参数

用WINDBG看 
80545975 8bf1            mov     esi,ecx
80545977 8bbb24010000    mov     edi,dword ptr [ebx+124h]
8054597d 89b324010000    mov     dword ptr [ebx+124h],esi
80545983 8a4f58          mov     cl,byte ptr [edi+58h]
80545986 e8f5000000      call    nt!SwapContext (80545a80)
发现KiSwapContext 是一个参数, esi是要换进的线程上下文 是通过ECX (第一个参数得到)  edi 则不是
所以结论 KiSwapContext的参数现在是一个了,也许我WRK没更新 老版本。。



WRK KiSwapContext 代码
cPublicFastCall KiSwapContext, 2
.fpo (0, 0, 0, 4, 1, 0)

;
; N.B. The following registers MUST be saved such that ebp is saved last.
;      This is done so the debugger can find the saved ebp for a thread
;      that is not currently in the running state.
;

        sub     esp, 4*4
        mov     [esp+12], ebx           ; save registers
        mov     [esp+8], esi            ;
        mov     [esp+4], edi            ;
        mov     [esp+0], ebp            ;
        mov     ebx, PCR[PcSelfPcr]     ; set address of PCR
        mov     edi, ecx                ; set old thread address
        mov     esi, edx                ; set next thread address
        movzx   ecx, byte ptr [edi].ThWaitirql ; set APC interrupt bypass disable

        call    SwapContext             ; swap context
        mov     ebp, [esp+0]            ; restore registers
        mov     edi, [esp+4]            ;
        mov     esi, [esp+8]            ;
        mov     ebx, [esp+12]           ;
        add     esp, 4*4                ;
        fstRET  KiSwapContext           ;

fstENDP KiSwapContext




windbg得到的 KiSwapContext 代码
lkd> uf KiSwapContext
nt!KiSwapContext:
8054595c 83ec10          sub     esp,10h
8054595f 895c240c        mov     dword ptr [esp+0Ch],ebx
80545963 89742408        mov     dword ptr [esp+8],esi
80545967 897c2404        mov     dword ptr [esp+4],edi
8054596b 892c24          mov     dword ptr [esp],ebp
8054596e 648b1d1c000000  mov     ebx,dword ptr fs:[1Ch]
80545975 8bf1            mov     esi,ecx
80545977 8bbb24010000    mov     edi,dword ptr [ebx+124h]
8054597d 89b324010000    mov     dword ptr [ebx+124h],esi
80545983 8a4f58          mov     cl,byte ptr [edi+58h]
80545986 e8f5000000      call    nt!SwapContext (80545a80)
8054598b 8b2c24          mov     ebp,dword ptr [esp]
8054598e 8b7c2404        mov     edi,dword ptr [esp+4]
80545992 8b742408        mov     esi,dword ptr [esp+8]
80545996 8b5c240c        mov     ebx,dword ptr [esp+0Ch]
8054599a 83c410          add     esp,10h
8054599d c3              ret


驱动运行后的效果是:   

搜集到的进程是
0x81FE7768   svchost.exe 
0x81EC6478   alg.exe 
0x81F5E990   svchost.exe 
0x81FE83E0   DrvLoader.exe 
0x81CA7020   taskmgr.exe 
0x81595D70   VMwareService.e 
0x815C6608   VMwareTray.exe 
0x815D9C08   svchost.exe 
0x8159C528   ctfmon.exe 
0x8158EB60   VisualTaskTips. 
0x815E5DA0   winlogon.exe 
0x81E96418   DrvLoader.exe 
0x815F8BD8   lsass.exe 
0x81FE5020   MSDEV.EXE 
0x81EC0B28   mdm.exe 
0x81EE0500   explorer.exe 
0x81F13020   MSDEV.EXE 
0x815523A8   DBGVIEW.EXE 
0x81F74020   csrss.exe 
0x821507C0   System 
0x82009830   VMwareUser.exe 
0x81F66DA0   services.exe 
0x81F07B88   svchost.exe 


搜集到的进程肯定是不全的 因为有的进程在休息 没有线程调度发生 也就没有搜集到= = 


下面是主要代码


DWORD gThreadsProcessOffset =0x220;    // ETHREAD 在 EPROCESS偏移
/*

+0x218 TopLevelIrp      : Uint4B
+0x21c DeviceToVerify   : Ptr32 _DEVICE_OBJECT
+0x220 ThreadsProcess   : Ptr32 _EPROCESS
*/

ULONG ProcessNameOffset = 0x174;      // 进程对应的文件名 在 EPROCESS偏移
/*
+0x170 Session          : Ptr32 Void
+0x174 ImageFileName    : [16] UChar
+0x184 JobLinks         : _LIST_ENTRY
*/

PProcessList wLastItem = NULL;        
int BeTerminate = 0;                  //1 表示线程必须要停止  3表示线程不是PENDING状态  0表示线程可以正常运行

void _stdcall CollectProcess(PEPROCESS pEPROCESS)  // 搜集EPROCESS
{
  if (!IsAdded(wLastItem, pEPROCESS)) AddItem(&wLastItem, pEPROCESS);
  return;
}

void __stdcall ThreadCollect(PUCHAR pEthread)   //根据ETHREAD得到EPROCESS 并调用CollectProcess来搜集
{
  PEPROCESS pEprocess = *(PEPROCESS *)(pEthread + gThreadsProcessOffset);
  if (pEprocess) CollectProcess(pEprocess);
  return;
}


DWORD outPEthread = 0;
void __stdcall ProcessData(DWORD pInEthread, DWORD pOutEthread)
{
  DWORD pid, eprocess;
  char * pname;
  if (MmIsAddressValid(PVOID(pInEthread+0x220)) )    // 这里以及下面要判断是不是一个真正 的 Ethread 结构体 有时好像调用SwapContext传进来的不是 Ethread 结构体 然后就蓝屏 具体没有深究 加个判断就不蓝了~
  {
    eprocess = *(DWORD*)(pInEthread+0x220);
    
    if (MmIsAddressValid(PVOID(eprocess) ) )
    {
      ThreadCollect((PUCHAR)pInEthread);
    }
    
  }
}



PBYTE GoBackAddr = NULL;
PBYTE ChangAddr = NULL;

DWORD CallContextOffset = 0;

__declspec(naked) VOID HookSwap()
{ 

  _asm 
  {
    pushad
      pushfd
      cli
  }

  _asm
  {
       // EDI 是换出的线程上下文
         push edi
      //ESI 是换入的线程上下文
      push esi
      call ProcessData   //搜集进程
  }
  
  _asm 
  {  
    sti
      popfd
      popad
  }
  _asm jmp DWORD PTR[GoBackAddr]
}

/*
得到SwapContext地址的原理是
用PsLookupThreadByThreadId得到Idle System的KTHREAD
res=(PCHAR)(Thread->Tcb.KernelStack);
SwapAddr=*(DWORD *)(res+0x08);
*/
PCHAR GetSwapAddr()
{
  PCHAR res = 0;
  NTSTATUS  Status;
  PETHREAD Thread;
  
  if (*NtBuildNumber <= 2195)
    Status = PsLookupThreadByThreadId((PVOID)4, &(PETHREAD)Thread);
  else
    Status = PsLookupThreadByThreadId((PVOID)8, &(PETHREAD)Thread);
  
  if (NT_SUCCESS(Status))
  {
    if (MmIsAddressValid(Thread))
    {
      res = (PCHAR)(Thread->Tcb.KernelStack);

    }
    if (MmIsAddressValid(res+8))
    {
      _asm
      {
        mov eax,res
          add eax,8
          mov eax,[eax]
          mov res,eax
      }
    }
    else
    {
      res = 0;
      return NULL;
    }
  }
  _asm
  {
    mov eax,res
      sub eax,5
      mov ChangAddr,eax
      mov edx,[eax+1]
      mov CallContextOffset,edx
      add eax,edx
      add eax,5
      mov GoBackAddr,eax
      mov res,eax
  }
  return res;
}



BOOL  HookSwapFunction(BOOL flag)
{  
  if (flag == TRUE)
  { 
    KIRQL OldIrql=0;
    DWORD NewOffset;//HookSwap-ChangAddr-5;
    _asm
    {
      mov eax,HookSwap
        mov edx,ChangAddr
        sub eax,edx
        sub eax,5
        mov NewOffset,eax
    }

    PAGED_CODE()
      ASSERT(KeGetCurrentIrql()<=DISPATCH_LEVEL);
    KeRaiseIrql(2,&OldIrql);//HIGH_LEVEL
    __asm
    {
      CLI
        MOV   EAX, CR0
        AND   EAX, NOT 10000H  //disable WP bit
        MOV   CR0, EAX
    }
    _asm
    {
      mov eax,ChangAddr
        push NewOffset
        pop dword ptr[eax+1]
        
    }
    
    __asm
    {
      MOV   EAX, CR0
        OR    EAX, 10000H  //enable WP bit
        MOV   CR0, EAX
        STI
    }
    
    
    KeLowerIrql(OldIrql);
    
  }
  //Bug Check 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL
  
  else
  { 
    KIRQL OldIrql=0;
    KeRaiseIrql(2,&OldIrql);///HIGH_LEVEL
    __asm
    {
      CLI
        MOV   EAX, CR0
        AND   EAX, NOT 10000H  //disable WP bit
        MOV   CR0, EAX
    }
    
    _asm
    {
      mov eax,ChangAddr
        push CallContextOffset
        pop dword ptr[eax+1]
    }
    
    
    __asm
    {
      MOV   EAX, CR0
        OR    EAX, 10000H  //enable WP bit
        MOV   CR0, EAX
        STI
    }
    KeLowerIrql(OldIrql);
    //    DbgPrint("HookSwapFunctionFALSE");//jution
  }
  
}

PEPROCESS processObject (PETHREAD ethread) {
  return  (PEPROCESS)(ethread->Tcb.ApcState.Process);
}



void  klisterUnload(IN PDRIVER_OBJECT pDriverObject)
{
  BeTerminate = 1;
  while(BeTerminate != 3)    // = 3时说明创建的线程不是pending状态且马上会结束 这时候可以UNLOAD   否则线程在PENDING状态UNLOADE 会直接蓝
  {
      
  }
  
  if (GoBackAddr)//PBYTE GoBackAddr = NULL;
    HookSwapFunction(FALSE);  
}

void showProcess()
{

  PProcessList temp;
  DWORD count = 0;
  PUCHAR pFileName;
   temp = wLastItem;


  while (temp)     //遍历链表
  {  
      if (temp->pEPROCESS)
    {
        count++;
        pFileName = (PUCHAR)((unsigned int)(temp->pEPROCESS) + 0x174);
        DbgPrint("0x%08X   %s /n",(unsigned int)(temp->pEPROCESS), pFileName);
    }
    temp = PProcessList(temp->NextItem);
  }

  DbgPrint("共有%d个进程", count); 
}


void WorkThread(IN PVOID pContext)
{
  LARGE_INTEGER timeout;
  
  while(true)
  {
    if (MmIsAddressValid(&BeTerminate) )    // 因为BeTerminate是在UNLOAD中设置的 可能驱动卸载后 这个变量不能访问 所以用MmIsAddressValid判断下 
    {
      if(BeTerminate == 0)
      {
        
        //等待单位是 100ns         //-10作用是转换成微秒  //2000000微秒=2秒
        timeout = RtlConvertLongToLargeInteger(-10              *    2000000);   
        
        KeDelayExecutionThread(KernelMode, FALSE, &timeout);
        DbgPrint("搜集到的进程是");        
        showProcess();
      }
      else
      {
          BeTerminate = 3;
        PsTerminateSystemThread(STATUS_SUCCESS);
        goto __end;
      }
    }
    else
    {
        BeTerminate = 3;
      PsTerminateSystemThread(STATUS_SUCCESS);
      goto __end;  
    }
  }
__end:;
}


// 驱动程序加载时调用DriverEntry例程
NTSTATUS DriverEntry(
           IN PDRIVER_OBJECT  pDriverObject,
           IN PUNICODE_STRING pRegistryPath
           )
{
  NTSTATUS dwStAtus; 
  HANDLE hThread; 
  
  pDriverObject->DriverUnload=klisterUnload;
  
  dwStAtus = PsCreateSystemThread(&hThread, 
    (ACCESS_MASK)0, 
    NULL, 
    (HANDLE)0, 
    NULL, 
    WorkThread, 
    NULL 
    ); 
    
    
      GetSwapAddr();
      if (GoBackAddr){
      HookSwapFunction(TRUE);
}  
  return STATUS_SUCCESS;
}
上传的附件
文件类型: rarHookSwapContext.rar (2008-12-11 12:01, 105.1 KB, 122 次
r0下多核hook 文章首发奇安信攻防社区:https://forum.butian.net/share/1361 r0层多核下hook高并发函数存在的问题是:在使用如memcpy的时候,无法一次性拷贝5个字节的硬编码。即有可能拷贝到一半,别的线程去执行了代码导致蓝屏。 解决的办法有: 短跳中转 中断门 找一条一次性修改8字节的指令 这里将使用第三种方法实现。 SwapContext 这是线程切换核心函数,Windows几乎无时无刻在执行这个函数,所以属于是高并发函数。 本文将在多核环境下通过hook SwapCont 阅读详情

相关推荐

深入理解Win7 x64下的SwapContext函数Hook技术

在现代操作系统中,Hook技术是内核开发和安全研究的一个重要方面。它允许开发者或研究人员在系统执行关键操作之前,截获并改变其行为。Ring0层,也就是内核层,是操作系统最为核心的部分,这里运行的代码拥有最高的权限,因此Ring0层Hook技术能够实现对系统行为的深度干预。在64位系统中,由于地址空间的增加,系统调用的实现方式和数据传输机制也发生了显著变化。系统调用的次数和复杂度随着系统功能的增强而增加。

weixin_35761094的博客 845

检测隐藏进程(二)

             OB_TYPE_JOB     : begin                                  if Jobs then                                   begin                                    Size := SizeOf(JOBOBJECT_BASIC_

tcz999的专栏 1298

DriverLoader驱动加载工具.rar

驱动加载工具带源码

断链隐藏进程及恢复(附代码)

首先,我们知道,进程体EPROCESS是被系统维护在一个双向链表LIST_ENTRY中的,那么,我们只要把进程的EPROCESS从这个链表中摘除,就可以实现进程隐藏了,当然,这只能瞒过进程管理器和zwQuerySystemInformation,暴力枚举依旧可以发现断链隐藏的进程,因为进程体还在内存中,这个以后再说。 要隐藏我们指定的某个进程,我们肯定需要遍历整个EPROCESS链表, 当...

weixin_34163741的博客 1679

DriverLoader

Windows驱动加载工具,使用该工具可以方便的安装、加载和卸载Windows驱动。

【初阶】手把手教你轻松上手Denodo | 连接数据库并创建基本视图 (二)

在本教程的第二部分,我们将涵盖:连接到数据库,与创建基本视图。

Denodo的博客 1113

HOOK SwapContext 枚举隐藏进程(学习笔记4)(1)

HOOK SwapContext 枚举隐藏进程(学习笔记4) 作者:windows内核安全技术站A盾电脑防护 dump 文件接收:asm32asm@gmail.com " style="text-decoration:none; color:rgb(69,82,95)">A盾电脑防护 | 分类: 分类:进程 | 标签: | 2012-2-21 作 者: bzhkl

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1256

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

HOOK SwapContext 枚举隐藏进程(学习笔记4)(3)

190   191 void  klisterUnload(IN PDRIVER_OBJECT pDriverObject) 192 { 193   BeTerminate = 1; 194   while(B

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 684

NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯

以上内容详细介绍了,使用NRF24L01实现1对1单向通讯、1对1双向通讯、1对多双向通讯。

Joseph Wen的博客 7390

Visual Studio 2022调试Godot 4 C#项目全攻略:从环境配置到断点调试

本文详细介绍了如何配置Visual Studio 2022以高效调试Godot 4 C#项目。从环境搭建、外部编辑器设置到两种核心调试模式(附加到进程与启动配置)的实战指南,帮助开发者构建无缝的工业级工作流,解决编码乱码、断点失效等常见问题,大幅提升开发与问题排查效率。

bush的博客 391

HOOK SwapContext 枚举隐藏进程(学习笔记4)(2)

下面是主要代码   01 DWORD gThreadsProcessOffset =0x220;    // ETHREAD 在 EPROCESS偏移 02 /* 03   04 +0x218 TopLev

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 967

告别屏幕适配焦虑:用AndroidAutoSize 1.2.1搞定多尺寸设备(附AndroidX兼容方案)

本文详细介绍了AndroidAutoSize 1.2.1在屏幕适配中的应用,帮助开发者高效解决多尺寸设备适配问题。通过动态计算机制,AutoSize显著提升了UI一致性和开发效率,特别适合处理横竖屏切换、折叠屏等复杂场景。文章还提供了AndroidX兼容方案和性能优化建议,是Android开发者的实用指南。

weixin_42535461的博客 190

枚举隐藏进程hook SwapContext线程调度法

PBYTE GoBackAddr = NULL;PBYTE ChangAddr = NULL;PBYTE CallContextAddr = NULL;DWORD CallContextOffset = 0;                                                                                                

1070

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9615

ABAP RANGES及比较符号

RANGES *选项介绍: *1.SIGN 值为 I 和 E 。 I是包含, E是排除, 一般使用I。 2.OPTION 如果HIGH 为空 ,为单值选择 。有 EQ、NE、GT、LE、LT等逻辑操作 对于的 CP包含 NP是排除 如果HIGH 不为空 为区间选择 有BT,NB可选 *3.LOW 低值 *4.HIGH 高值 lt:less than 小于 le:less than or equal to 小于等于 eq:equal to 等于 ne:

Pegasus666的博客 5390

围绕SwapContext的一点代码

这次的胡乱探究原因在于看到了一个08年的帖子: · 标 题:HOOK SwapContext 枚举隐藏进程(学习笔记4) · 作 者:bzhkl · 时 间:2008-12-11 12:01 · 链 接:http://bbs.pediy.com/showthread.php?t=78464 都是很老的东西了,可惜很菜才开始关注 这篇帖子讲了HOOK SwapCo

futosky的专栏 1075

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1590

检测隐藏进程

1. 用 户 态 进 程 检 测 方 法 该 方 法 利 用 WindowsAPI检测进程。但是在实际应用中,该方法几乎无法检测到 Rootkit隐藏进程。 用户态可以通过CreateToolhelp32Snapshot,Process32First,Process32Next遍历进程。 或者通过通过psapi.dll提供的EnumProcesses来枚举进程。 也可以使用Native API 中...

liuhaidon1992的博客 3221

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

InlineHookSwapContext

作用:枚举进程, 获取隐藏进程的EPROCESS源码地址:https://github.com/haidragon/HookSwapContext #include <ntddk.h> #include <ntimage.h> #include <ntdef.h> #include "hash.h" #include "xde.h" #include "main...

weixin_34364071的博客 180

Statistics and Machine Learning Toolbox

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

驱动加载工具 DriverLoader 1.0

近日翻检硬盘时发现的,早些年写的加载驱动的小工具,相对使用较广泛的DrvInst,功能和易用性上做了些增强。  http://download.youkuaiyun.com/detail/hanzz2007/4243636

hanzz2007的专栏 1752

[C/C++]windows下实现swapcontext等函数实践

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34391445的博客 761

32位下如何HOOK高并发函数

#include<NTDDK.H> /********************************************************************* ****** “多核环境下,如何保证对一个高并发的内核函数进行HOOK而不会出错?” ****** **********************************************************************/ LONG AddressOfSwapContext = 0x8

SharenFish的博客 359

自己Swap自己,Ring0下做测试器时用的代码

作者:vxk#include "vx_main.h"#include "mem.h"#include #include void MySwapContextHook();void MySwapContextEndHook();static DWORD SwapContextPtr=0;static DWORD SwapContextCnt=0;extern HANDLE CurrentProc

1081

(24)[进程与线程] 分析SwapContext

SwapContext有几个参数? SwapContext在哪里实现了线程切换? 哪里进行了进程切换(修改CR3)? TSS存储当前的 SS0 : ESP0。 FS:[0]在3环总能正确指向当前TEB。 异常链表的切换。 完整分析代码。

qq_50332504的博客 1106

win10 x64 内核结构体

nt!_EPROCESS +0x000 Pcb : _KPROCESS +0x2d8 ProcessLock : _EX_PUSH_LOCK +0x2e0 UniqueProcessId : Ptr64 Void +0x2e8 ActiveProcessLinks : _LIST_ENTRY +0x2f8 RundownProtect : _EX_RUNDOWN_REF +0x300 Flags2 : Uint

sanqiuai的博客 1190
上一篇: Icelight驱动部分完整逆向(源代码)
下一篇: 线程调度的监视
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值