inline hook未导出函数PspTerminateProcess

进程强杀探究 前言 我们知道在windows操作系统里面有ring0跟ring3的概念(ring1、ring2在windows中并未使用),因为ring0的特权级别是比ring3高的,那么我们肯定不能在ring3调用windows提供的api杀死ring0特权级别的进程,那么这时候我们就需要使用的ring0的函数来强行结束一些处于ring0级别的进程。 测试 我们首先打开PCHunter32.exe看一下,应用层是不能够访问的,我们知道可以在cmd里面使用taskkill命令来结束进程,但这种方式对ring0特权级别的程 阅读详情
之前inline Hook SSDT中的一些函数学,感觉比较容易,可是想hook一些未导出的函数时,

却发现还有点难,开始是蓝了N次屏,最后HOOK成功了,用一些anti-rootkit的工具却查不出

来,以为没成功.郁闷了好久,最后用windbg看,原来是成功,于是写下这篇文章,很多东西应该讲的不太好,还请矫正

今天就是要inline hook PspTerminateProcess,这是一个没有被导出的函数,这个会了,基本什么函数都会hook,呵呵,先看下它的

定义吧
NTSTATUS
PspTerminateProcess(
    PEPROCESS Process,
    NTSTATUS ExitStatus
    )
由于没有被导出的函数,那只能内存搜索定位了,先用windbg看(本机的情况,后面的图是虚拟机的)
lkd> u PspTerminateProcess
nt!PspTerminateProcess:
805d23a0 8bff            mov     edi,edi
805d23a2 55              push    ebp
805d23a3 8bec            mov     ebp,esp
805d23a5 56              push    esi
805d23a6 64a124010000    mov     eax,dword ptr fs:[00000124h]
805d23ac 8b7508          mov     esi,dword ptr [ebp+8]
805d23af 3b7044          cmp     esi,dword ptr [eax+44h]
805d23b2 7507            jne     nt!PspTerminateProcess+0x1b (805d23bb)

再用dd命令
lkd> dd PspTerminateProcess
805d23a0  8b55ff8b a16456ec 00000124 3b08758b
805d23b0  07754470 00000db8 575aebc0 0248be8d
805d23c0  47f60000 12742001 0174868d 56500000
805d23d0  5d237268 ef50e880 086affff 0709f058
805d23e0  e856006a 00004f78 ff85f88b 75ff1e74
805d23f0  07e8570c 57fffffd 4f62e856 f88b0000
805d2400  ea75ff85 00bc8639 06740000 ff04e856
805d2410  c033fffe c25d5e5f cccc0008 cccccccc

那它的特征码是8b55ff8b a16456ec 00000124 3b08758b,内存搜索吧,找到地址之后我们

就重写其开头的5个字节,也就是修改
mov     edi,edi
push    ebp
mov     ebp,esp
(现在一般的函数学编译之后都是这样子,个别例外)
为一条jmp指令,这条指令将跳到我们自己的函数学里执行,这就是inline hook
好了,搜索地址吧,怎么搜索,当然是用一种通用的方法来定位,在<<学习笔记之钩住驱动程

序导入表>>中修改一下GetDriverBaseAdress这个函数就可以了,,用

ZwQuerySystemInformation枚举内核模块,第一个模块就是我们要

的,PspTerminateThreadByPointer就是在里面

#include "ntddk.h"
#include "InlineHook.h"  

PVOID GetUndocumentFunctionAdress()
{
  
  ULONG size,index;
  PULONG buf;
                ULONG i;
  PSYSTEM_MODULE_INFORMATION module;
  PVOID driverAddress=0;
                ULONG ntosknlBase;
  ULONG ntosknlEndAddr;
  ULONG curAddr;
  NTSTATUS status;
                ULONG retAddr;
  ULONG  code1_sp2=0x8b55ff8b,code2_sp2=0xa16456ec,code3_sp2=0x00000124,code4_sp2=0x3b08758b;

    ZwQuerySystemInformation(SystemModuleInformation,&size, 0, &size);
                 if(NULL==(buf = (PULONG)ExAllocatePool(PagedPool, size)))
  {
    DbgPrint("failed alloc memory failed  /n");
    return 0;
  }
     
  status=ZwQuerySystemInformation(SystemModuleInformation,buf, size , 0);
  if(!NT_SUCCESS( status ))
  {
       DbgPrint("failed  query/n");
     return 0;
  }

  module = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);
  ntosknlEndAddr=(ULONG)module->Base+(ULONG)module->Size;
  ntosknlBase=(ULONG)module->Base;
  curAddr=ntosknlBase;
  ExFreePool(buf);

  for (i=curAddr;i<=ntosknlEndAddr;i++)
    {
      if ((*((ULONG *)i)==code1_sp2)&&(*((ULONG *)(i+4))==code2_sp2)&&(*((ULONG *)(i+8))==code3_sp2)&&(((ULONG*)(i+12))==code4_sp2)) 
       
      {
            
  retAddr=i;
                DbgPrint("adress is:%x",retAddr);  
  return retAddr;
              
      }
  }
}

VOID Unload(PDRIVER_OBJECT  DriverObject)
{    
    DbgPrint("Unload Called /r/n");
    
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING str)
{
  
    DriverObject->DriverUnload = Unload;
   PspTerminateProcess = GetUndocumentFunctionAdress();
    return STATUS_SUCCESS;
}

编译一下,加载运行,嗯,DebugView输出了:adress is:805c8620
那就是我们的函数地址找到了,找到地址当然是引用拉
只需这样声明一下:
typedef NTSTATUS (*PSPTERMINATETPROCESS)(
    PEPROCESS Process,
    NTSTATUS ExitStatus
    );
PSPTERMINATETPROCESS PspTerminateProcess;
PspTerminateProcess=(PSPTERMINATETPROCESS)PspTerminateThreadByPointerAdrr;
好了,至此我们就获得了PspTerminateThreadByPointer在内存中的地址,也做了一些工作,

现在PspTerminateThreadByPointer就可以像正常的导出函数一样直接使用了,不过我们是

要它的地址就可以,如果你想用PspTerminateProcess就可以按上面的声明,就可以用.
好了,解决了地址问题,接着就是修改这个地址开始的5个字节
805d23a0 8bff            mov     edi,edi
805d23a2 55              push    ebp
805d23a3 8bec            mov     ebp,esp
在修改之前应该做一下检查,看我们要HOOK的函数有没有被别人先HOOK了,这是必要的,否

则有可能导致系统崩溃
检查只需要添加一个函数就可以
NTSTATUS CheckPspTerminateProcessIsHook()
{
  int i=0;
  char *addr = (char *)PspTerminateProcess;
   
  char code[] = { 0x8b, 0xff, 0x55, 0x8b, 0xec};

  while(i<5)
  {
    DbgPrint(" - 0x%02X ", (unsigned char)addr[i]);
    if(addr[i] != code[i])
    {
      return STATUS_UNSUCCESSFUL; 
    }
    i++;
  }
  return STATUS_SUCCESS;
}

嗯,DriverEntry添加
if(STATUS_SUCCESS != CheckPspTerminateProcessIsHook())
  {
    DbgPrint("PspTerminateProcess Match Failed !");
    return STATUS_UNSUCCESSFUL;
  }
编译测试一下,嗯正常没问题,既然没什么问题,那下面我们就开始对这个函数进行inline 

hook了,
接着开始核心部分
添加函数
_declspec(naked) T_PspTerminateProcess(
    PEPROCESS Process,
    NTSTATUS ExitStatus
    )
{

  
_asm
{
   mov   edi, edi
   push ebp
   mov   ebp ,esp
   push   [ebp+0ch]
   push   [ebp+8]
   call   MyPspTerminateProcess   
   cmp   eax,1   
   jz     end           
   mov   eax,PspTerminateProcess     
   add   eax,5           
   jmp   eax             

   end:  
   pop   ebp
   retn 8
}
   }
}

我们就是要修改PspTerminateProcess的前5个字节,代替为一条近jmp指令,跳转到

我们的这个函数里来,在T_PspTerminateProcess里call   MyPspTerminateProcess ,MyPspTerminateProcess 是我们的功能函数,就是你hook后想做什么事情,这里我们简单的输出点字符就好

那怎样改PspTerminateProcess的前5个字节,代替为一条jmp

指令,跳到T_PspTerminateProcess里面来呢????????带着问题开始吧

VOID InlineHookPspTerminateProcess()
{ 
    
  
     int JmpOffSet;
     unsigned char JmpCode[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 };
     KIRQL  oldIrql;

    if (PspTerminateProcess == 0) 
  {
        DbgPrint("PspTerminateProcess NOT FOUND/n");
        return;
    }

  DbgPrint( "PspTerminateProcess is found at:0x%08x/n", (ULONG)PspTerminateProcess );
 
    DbgPrint("T_PspTerminateProcess is:%x/n",T_PspTerminateProcess);
    JmpOffSet= (char*)T_PspTerminateProcess - (char*)PspTerminateProcess - 5;
  DbgPrint("JmpOffSet is:%x/n",JmpOffSet);
    RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
    
    _asm
  {
    CLI          
    MOV  EAX, CR0    
    AND EAX, NOT 10000H 
    MOV  CR0, EAX    
  }
    oldIrql = KeRaiseIrqlToDpcLevel();
    RtlCopyMemory ( PspTerminateProcess, JmpCode, 5 );
    DbgPrint("PspTerminateProcess is hook now /n");
   KeLowerIrql(oldIrql);
  
 _asm 
  {
    MOV  EAX, CR0    
    OR  EAX, 10000H    
    MOV  CR0, EAX      
    STI          
  }

}
好了,测试一下,只需要在DriverEntry添加
InlineHookPspTerminateThreadByPointer();嗯,运行正常,没有蓝屏,呵呵,那就继续
既然在T_PspTerminateProcess里面调用了MyPspTerminateProcess ,那就写这个函数吧,这里只是简单的输出PspTerminateProcess hello,你可以根据需要重写这个函数
int MyPspTerminateProcess(
    PEPROCESS Process,
    NTSTATUS ExitStatus
  )
{
  DbgPrint("PspTerminateProcess hello/n");

  return 1;
}
返回了1,那cmp   eax,1 ,呵呵放行原来的函数执行
好了,现在基本工作都完成了,就写卸载驱动部分
VOID Unload(PDRIVER_OBJECT  DriverObject)
{    
    
  unsigned char Code[5]={0x8b,0xff,0x55,0x8b,0xec};

_asm
{
   CLI             
   MOV   eax, CR0     
   AND eax, NOT 10000H 
   MOV   CR0, eax

   pushad
   mov edi, PspTerminateProcess
   mov eax, dword ptr Code[0]
   mov [edi], eax
   mov al, byte ptr Code[4]
   mov [edi+4], al
   popad

   MOV   eax, CR0
   OR   eax, 10000H
   MOV   CR0, eax
   STI
}

DbgPrint("Unload Called /r/n");
    
}
到此,我们的工作基本完成了,不过这只是一个测试的,还有待加强,运行后就是下面这样
此图已经缩小,点击察看原图。
 
定位未导出的函数地址(SHCreateProcess) 定位未导出的函数地址(SHCreateProcess) 搬运自我的百度空间,文章基于windows7 64位   我们要Hook shell32.dll的SHCreateProcess这个函数,苦于他没有被导出,也无从知道地址。 其实我们还是有办法的。windbg有功能叫做栈回朔技术,可以看到函数的调用者,函数的调用者的调用者,函数的调用 阅读详情

相关推荐

Python实战:3步搞定DICOM转JPG/PNG(附批量处理脚本)

本文详细介绍了如何使用Python在3步内将DICOM医学影像转换为JPG/PNG格式,并提供了批量处理脚本。通过Pydicom、Pillow和NumPy库的组合,解决了像素值处理、批量转换效率和医学图像特性保留等关键问题,适合医疗AI开发者和放射科医生快速集成到工作流中。

numpy6sculptor的博客 590

终于完成了Ring3下Call PspTerminateProcess

出差到现在都即将两个月了,无聊郁闷中,好在昨天晚上成功在Ring3下Call PspTerminateProcess总算是有一份值得高兴得事情了,目前还只支持XP,关于搜索PspTerminateProcess的特征码定位是参考了网络上的一篇文章.目前工作正在移植到DLL中封装成标准函数供VB等语言调用.现在冰刃也可以轻易被结束了^_^. 

chenhui530的专栏 2905

大漠插件找图找字避坑手册:从ziku0.txt字库制作到易语言精准识别(附综合工具实操)

本文深入解析大漠插件在图像识别中的核心难点,提供从ziku0.txt字库精准制作到易语言高效调用的完整避坑指南。重点讲解如何利用大漠综合工具科学设置偏色与二值化参数,生成高质量色彩描述字符串,并分享识别失败的系统排查方法与进阶优化策略,旨在实现99%的稳定识别率。

weixin_29264201的博客 1206

03 特征码搜索PspTerminateProcess函数、隐藏驱动模块

函数地址。

qq_50242229的博客 588

上位机介绍:C# 开发者的必知基础

上位机是指在工业控制系统中,位于上层、负责人机交互和数据管理的计算机/软件,与“下位机”(PLC、传感器、变频器、单片机等硬件设备)相对应,核心是“向下通信控制设备,向上展示交互数据”。下位机:一线干活的“工人”(执行采集、控制指令);上位机:指挥管理的“办公室人员”(发指令、看数据、做报表)。C#开发者掌握上位机开发的核心是“通信+UI+稳定性基础层:搞懂WinForms/WPF基础、串口/Modbus通信,能实现核心功能;进阶层:掌握分层设计、异步编程、工业级容错(断线重连、数据校验);

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1558

HLA分型

HLA分型 一、根据WES的tumor数据进行数据分型 选用hlahd 软件安装及使用 [root@18605fd8771e ~]# wget https://jaist.dl.sourceforge.net/project/bowtie-bio/bowtie2/2.4.1/bowtie2-2.4.1-linux-x86_64.zip [root@18605fd8771e ~]# unzip bowtie2-2.4.1-linux-x86_64.zip && mv bowtie2-2.4.1

qq_23435961的博客 2487

进程强杀

应用层杀进程会调用terminateProcess,往下会调用zwterminateProcess,再往下 PsTerminateProcess->PspTerminateProcess->PspTerminateThreadByPoint->PspExitThread 所以我们想调用PspTerminateProcess(再往下就是线程函数了),但是未导出。所以只能暴力搜索...

kernweak的博客 1008

华为OD机试真题 新系统【小学英语老师批改作文】

华为OD机试 新系统真题【小学英语老师批改作文】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【小学英语老师批改作文】

qq_45776114的博客 922

PspTerminateProcess 结束冰刃进程

#include typedef  NTSTATUS  (*PSPTERPROC) ( PEPROCESS Process, NTSTATUS ExitStatus );PSPTERPROC MyPspTerminateProcess ;NTSTATUSPsLookupProcessByProcessId(                        IN HANDLE ProcessId,  

十年磨一剑,霜刃未曾试! 1963

【图像去噪】论文精读:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising

论文题目:AKDT: Adaptive Kernel Dilation Transformer for Effective Image Denoising —— AKDT:用于有效图像去噪的自适应核膨胀Transformer图像去噪是一项基本但具有挑战性的任务,特别是在处理高分辨率图像和复杂的噪声模式时。大多数现有方法依赖于标准的 Transformer 架构,该架构通常计算复杂度高,并且对不同噪声水平的适应性有限。在本文中,我们介绍了自适应核膨胀Transformer(AKDT)

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1044

【YOLOv8改进-注意力机制】BRA(bi-level routing attention ):双层路由注意力

【YOLOv8改进-注意力机制】BRA(bi-level routing attention ):双层路由注意力我们提出了一种新颖的动态稀疏注意力机制,通过双层路由实现更加灵活且具有内容感知的计算分配。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 3167

05 常规3环和0环通信、驱动注册、运行、停止、卸载

常规3环和0环通信 0环代码 #include <ntddk.h> //函数声明 typedef NTSTATUS(_stdcall *_PsTerminateProcess)(PEPROCESS pEprocess,NTSTATUS ExitCode); _PsTerminateProcess pspTerminateProcess = NULL; //操作码:0x0-0x7FF 被保留,0x800-0xFFF 可用 #define KillAPPTOOL CTL_CODE(FILE_D

qq_50242229的博客 284

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

5.内核空间与内核模块

0x5内核空间与内核模块 1.内核空间 对于低2G,每个进程是独立的,而高2G是共享的 如果在一个驱动中定义一个变量,然后能够在另一个驱动中进行读取,那就说明高2G确实是所有程序共用的! #include <ntddk.h> //卸载函数 VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("驱动程序停止运行了.\r\n"); } ULONG x = 0x12345678; //入口函数,相当于main NTSTATUS Driver

Mikasys的博客 497

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

两个强制结束进程的方法

这两个函数分别用于终止进程和线程,但由于未公开导出,需要通过逆向工程获取地址。

(*/ω\*) 1407

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

浅谈驱动中强制结束进程的3种方法

一个应用程序想要结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程. OpenProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtOpenProcess.在服务函数里,系统使用SeSinglePrivilegeCheck检查调用者是否有DEBUG权

少仲 7287

【note】进程结束内幕

下午抽空看了PspTerminateProcess NTerminateProcess的实现。。。也更加理解了进程是个容器。。。线程是执行体的概念。。。。 note下流程: 在内部的调用流程 : psPTerninateProcess 1. 通过Eprocess得到 Ethread的列表 。。 2. 通过循环依次结束每个线程。。。调用PspTerminateThreadByPoin...

weixin_33742618的博客 145

Detours版HOOK 未导出的API函数CreateProcessInternalW

#include <stdio.h> //#include <tchar.h> #include <windows.h> #include "detours.h" #pragma comment(lib,"detours.lib") //以下是HOOK需要的头文件 //#include <winsock2.h> //#include <MSWSock.h> //#pragma comment(lib,"ws2_32.lib") //.

追逐光芒,追随内心 2014

详谈内核三步走Inline Hook实现

 http://www.cppblog.com/sleepwom/archive/2009/10/17/98819.html?opt=admin 详谈内核三步走Inline Hook实现(一)Inline hook原理Inline hook通俗的说就是对函数执行流程进行修改,达到控制函数过滤操作的目的。理论上我们可以在函数任何地方把原来指令替换成我们的跳转指令,也确实有些人在inline的

ivan240的专栏 1418

修改页面保护和恢复

__asm //去掉页面保护 { cli mov eax,cr0 and eax,not 10000h //and eax,0FFFEFFFFh ...

weixin_30664051的博客 136

drv experiment : 从内核API代码定位函数地址或结构指针地址

用WinDbg看已经导出的内核API代码, 如果看到需要的未导出函数调用或想直接从汇编代码中定位那个API地址, 可以定位 CALL指令中未导出函数地址. 未导出函数地址 = 已经导出的内核API首地址 + 计算出的 硬编码偏移. 得到已经导出的内核API地址 PVOID GetKernelApiAddress(wchar_t * pcApiName) { UN

博客标题不能为空 2375

widnbg中看到的dll中的函数并不一定就是导出函数

对于这种情况,我们需要针对特定的版本使用偏移量来获取到该函数的地址。这个是在windbg中查看ntdll.dll的函数的输出。命令可以看到当前进程加载的ntdll.dll的绝对路径。首先要获取到dll加载的虚拟内存的基地址。...

ma_de_hao_mei_le的博客 561

InlineHook2

00000000`8003f120 8003f120 00000000`80aaa1aa 00000000`8003f130 8003f130 00000000`8003f138 00000000`8003f140 8003f140 00000000`8003f148 00000000`8003f150 8003f150 00000000`8003f158 00000000`8003f160 目标0x8053E545 写入目标是0x8003f120 #include &lt...

寻梦&之璐 361

PsTerminateProcess结束进程

PsTerminateProcess函数用于结束一个进程,其声明如下 NTSTATUS NTAPI PsTerminateProcess(IN PEPROCESS Process, IN NTSTATUS ExitStatus) 其中第一个参数是PEPROCESS的指针,如果你只知道pid,可以通过PsLookupProcessByProcessId 获得,而第二个参数指定退出状...

weixin_30781433的博客 409
上一篇: QQ登录协议分析图
下一篇: 干掉KV 2008, Rising等大部分杀软
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值