Ring0 inline hook For Delphi.

深入解析Ring3环境下Inline Hook绕过技术与Delphi实战 htmltable {th, td {th {pre {简介:在Windows系统中,Ring3即用户模式,是应用程序运行的常规环境,而Inline Hook作为一种常见的调试与监控手段,通过修改函数入口指令实现控制流劫持,广泛应用于恶意软件分析、逆向工程等领域。本文深入探讨在Ring3下如何有效绕过Inline Hook机制,并结合提供的Delphi源码进行技术剖析。 阅读详情
内嵌钩子呀内嵌钩子呀...
一般两种方法...
[1]jmp
0.获取一个足够的长度...Copy原来的数据保存到一个地方
1.jmp 长跳转到HookProc部分
2.处理完毕后跳转到...会原来抽取的代码...
3.执行完毕后再jmp回到原有指令
[2]返回地址...push xxx+ret
[3]这个是为了bypass某些检测工具---小跳一下...然后大跳一下(抱歉不是CS)
[4]其他跳转法...你喜欢玩EPO吗?呵呵

这里用第二种方法---抱歉我不想别人说我抄袭Ms-Rem的代码...
Copy code
{
  Hook Api Library 0.2 [Ring0] By Anskya
  Email:Anskya@Gmail.com
  ring3 inline hook For Api

Thank:
  前29A高手也一直都是我的偶像...z0mbie大牛...这里膜拜一下
  使用的LDE32引擎是翻译他老人家的...C->Delphi...

说明:
  1.利用堆栈跳转
  没有使用传统的jmp xxxx 长跳转,使用容易理解的push xxxx+ret
  仔细看代码容易理解...封装完好.

  2.内存补丁结构:
  补丁1:|push xxx--钩子处理过程|ret|
  补丁2:|保存原始补丁地址|保存原始地址代码长度|原始地址的代码|push xxxxxx|ret|

更新说明:
  0.2:
    支持Ring0 Inline Hook
  0.1:
    Ring3 Inline Hook
}
unit HookApiLib;

interface

{$DEFINE Ring0}

uses
  LDE32,
{$IFDEF Ring0}
  ntddk,
  macros
{$ELSE}
  Windows
{$ENDIF}
  ;

function HookCode(OldProc, NewProc: Pointer): Pointer;
function UnHookCode(TargetProc: Pointer): Boolean;

implementation

type
  LPfar_jmp = ^_far_jmp;
  _far_jmp = packed record
    PushOpCode: BYTE;
    PushArg: Pointer;
    RetOpCode: BYTE;
  end;
  Tfar_jmp = _far_jmp;

function HookCode(OldProc, NewProc: Pointer): Pointer;
var
  lpFuncProc, lpInlineProc: Pointer;
  InlineLen, OpcodeLen: ULONG;
  stfar_jmp_hook: Tfar_jmp;
{$IFNDEF Ring0}
  OldProtect: ULONG;
{$ENDIF}
begin
  Result := nil;
  if ((OldProc = nil) or (NewProc = nil)) then Exit;

  InlineLen := 0;
  lpFuncProc := OldProc;

  while (InlineLen < SizeOf(Tfar_jmp)) do
  begin
    GetInstLenght(lpFuncProc, @OpcodeLen);
    lpFuncProc := Pointer(ULONG(lpFuncProc) + OpcodeLen);
    InlineLen := InlineLen + OpcodeLen;
  end;

  stfar_jmp_hook.PushOpCode := $68;
  stfar_jmp_hook.PushArg := NewProc;
  stfar_jmp_hook.RetOpCode := $C3;

{$IFDEF Ring0}
  lpInlineProc := ExAllocatePoolWithTag(NonPagedPool, 8 + InlineLen  + SizeOf(Tfar_jmp), PoolWithTag);
{$ELSE}
  lpInlineProc := Pointer(GlobalAlloc(GMEM_FIXED, SizeOf(Pointer) + SizeOf(ULONG) + InlineLen  + SizeOf(Tfar_jmp)));
{$ENDIF}

  if (lpInlineProc = nil) then Exit;
 
  PPointer(lpInlineProc)^ := OldProc;
  Inc(PBYTE(lpInlineProc), SizeOf(Pointer));

  PULONG(lpInlineProc)^ := InlineLen;
  Inc(PBYTE(lpInlineProc), SizeOf(ULONG));

{$IFDEF Ring0}
  memcpy(lpInlineProc, OldProc, InlineLen);
{$ELSE}
  CopyMemory(lpInlineProc, OldProc, InlineLen);
{$ENDIF}
  Inc(PBYTE(lpInlineProc), InlineLen);
  //  改写跳转代码
  with LPfar_jmp(lpInlineProc)^ do
  begin
    PushOpCode := $68;
    PushArg := Pointer(ULONG(OldProc) + InlineLen);
    RetOpCode := $C3;
  end;

{$IFDEF Ring0}
  //  开始嵌入Hook
  if NT_SUCCESS(WriteReadOnlyMemoryMark(OldProc, @stfar_jmp_hook, SizeOf(Tfar_jmp))) then
  begin
    Result := Pointer(ULONG(lpInlineProc) - InlineLen);
  end else
  begin
    ExFreePoolWithTag(lpInlineProc, PoolWithTag);
    Result := nil;
  end; 
{$ELSE}
  //  使内存可写
  VirtualProtect(OldProc, SizeOf(Tfar_jmp), PAGE_EXECUTE_READWRITE, OldProtect);
  //  写入跳转代码
  CopyMemory(OldProc, @stfar_jmp_hook, SizeOf(Tfar_jmp));
  Result := Pointer(ULONG(lpInlineProc) - InlineLen);
  //  写回原属性
  VirtualProtect(OldProc, SizeOf(Tfar_jmp), OldProtect, OldProtect);
{$ENDIF}
end;

function UnHookCode(TargetProc: Pointer): Boolean;
var
  lpFuncProc, lpInlineProc: Pointer;
  InlineLen: ULONG;
{$IFNDEF Ring0}
  OldProtect: ULONG;
{$ENDIF}
begin
  Result := False;
  if (TargetProc = nil) then Exit;
  lpInlineProc := TargetProc;
  Dec(PBYTE(lpInlineProc), SizeOf(Pointer) + SizeOf(ULONG));

  lpFuncProc := PPointer(lpInlineProc)^;
  Inc(PBYTE(lpInlineProc), SizeOf(Pointer));

  InlineLen := PULONG(lpInlineProc)^;
  Inc(PBYTE(lpInlineProc), SizeOf(ULONG));

{$IFDEF Ring0}
  //  开始解除Hook
  if NT_SUCCESS(WriteReadOnlyMemoryMark(lpFuncProc, TargetProc, InlineLen)) then
  begin
    Dec(PBYTE(lpInlineProc), SizeOf(Pointer) + SizeOf(ULONG));
    ExFreePoolWithTag(lpInlineProc, PoolWithTag);
    Result := True;
  end; 
{$ELSE}
  //  使内存可写
  VirtualProtect(lpFuncProc, InlineLen, PAGE_EXECUTE_READWRITE, OldProtect);
  //  写回原有数据
  CopyMemory(lpFuncProc, TargetProc, InlineLen);
  Dec(PBYTE(lpInlineProc), SizeOf(Pointer) + SizeOf(ULONG));

  GlobalFree(ULONG(lpInlineProc));
  Result := True;
  //  写回原属性
  VirtualProtect(lpFuncProc, InlineLen, OldProtect, OldProtect);
{$ENDIF}
end;

end.


下面的Hook情况就完全和...Ring3下一模一样了。。。
Copy code
{
  NtOpenProcess[Inline Hook] By Anskya
  Email: Anskya[at]Gmail.com
}
unit Driver;

interface

uses
  Windows, macros, ntddk, HookApiLib, LDE32;

function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;

implementation

type
  LPfar_jmp = ^_far_jmp;
  _far_jmp = packed record
    PushOpCode: BYTE;
    PushArg: Pointer;
    RetOpCode: BYTE;
  end;
  Tfar_jmp = _far_jmp;

type
  TZwOpenProcess = function(ProcessHandle:PHandle; DesiredAccess:TAccessMask; ObjectAttributes:PObjectAttributes; ClientId:PClientId): NTSTATUS; stdcall;

var
  HookActive: Boolean;
  ZwOpenProcessNextHook: TZwOpenProcess;

//  钩子过程
function ZwOpenProcessHookProc(ProcessHandle:PHandle; DesiredAccess:TAccessMask; ObjectAttributes:PObjectAttributes; ClientId:PClientId): NTSTATUS; stdcall;
begin
  DbgPrint('ZwOpenProcess HookProc: NewZwOpenProcess(ProcessHandle:0x%.8X,DesiredAccess:0x%.8X,ObjectAttributes:0x%.8X,ClientId:0x%.8X)',
        ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);

  Result := ZwOpenProcessNextHook(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
  DbgPrint('ZwOpenProcess HookProc: NewZwOpenProcess(-):0x%.8X', Result);
end;


//  驱动卸载过程
procedure DriverUnload(DriverObject: PDriverObject); stdcall;
begin
  UnHookCode(@ZwOpenProcessNextHook);
  DbgPrint('DriverUnload(-)');
end;

//  驱动入口点
function _DriverEntry(DriverObject: PDriverObject; RegistryPath: PUnicodeString): NTSTATUS; stdcall;
var
  lpFuncProc: Pointer;
  lpInlineProc: Pointer;
  InlineLen: ULONG;
begin
  DriverObject^.DriverUnload := @DriverUnload;
  Result := STATUS_SUCCESS;
  DbgPrint('DriverEntry(-):0x%.8X', Result);

  HookActive := False;

  if (Not HookActive) then
  begin
    DbgPrint('ZwOpenProcess Ord Address: 0x%.8X', SystemServiceOrd($7A)^);    //  XP Ord!
    DbgPrint('ZwOpenProcess Name Address: 0x%.8X', SystemServiceName(GetImportFunAddr(@ZwOpenProcess))^);
    DbgPrint('ZwOpenProcess HookProc Address: 0x%.8X', @ZwOpenProcessHookProc);

    lpFuncProc := PPointer(SystemServiceOrd($7A))^;
    DbgPrint('ZwOpenProcess New Address: 0x%.8X', lpFuncProc);

    lpFuncProc := PPointer(SystemServiceName(GetImportFunAddr(@ZwOpenProcess)))^;
    DbgPrint('ZwOpenProcess New Address: 0x%.8X', lpFuncProc);

    @ZwOpenProcessNextHook := HookCode(lpFuncProc, @ZwOpenProcessHookProc);

    lpInlineProc := @ZwOpenProcessNextHook;
    Dec(PBYTE(lpInlineProc), SizeOf(Pointer) + SizeOf(ULONG));

    lpFuncProc := PPointer(lpInlineProc)^;
    DbgPrint('OldProc : 0x%.8X', lpFuncProc);
    Inc(PBYTE(lpInlineProc), SizeOf(Pointer));

    InlineLen := PULONG(lpInlineProc)^;
    DbgPrint('OldProc Inline Code Len : %d', InlineLen);
    Inc(PBYTE(lpInlineProc), SizeOf(ULONG));

    DbgPrint('ZwOpenProcess Target Address: 0x%.8X', @ZwOpenProcessNextHook);
  end else
  begin
    DbgPrint('ZwOpenProcess Hooked!!! By Anskya');
  end;
end;

end.


这么写代码纯属娱乐好孩子不好学我哦...非程序员的代码写的就是难看...大家多担待...
完全源代码见附件
Copy code
{
  Hook Api Library 0.2 [Ring0] By Anskya
  Email:Anskya@Gmail.com
  ring3 inline hook For Api

Thank:
  前29A高手也一直都是我的偶像...z0mbie大牛...这里膜拜一下
  使用的LDE32引擎是翻译他老人家的...C->Delphi...

说明:
  1.利用堆栈跳转
  没有使用传统的jmp xxxx 长跳转,使用容易理解的push xxxx+ret
  仔细看代码容易理解...封装完好.

  2.内存补丁结构:
  补丁1:|push xxx--钩子处理过程|ret|
  补丁2:|保存原始补丁地址|保存原始地址代码长度|原始地址的代码|push xxxxxx|ret|

更新说明:
  0.2:
    支持Ring0 Inline Hook
  0.1:
    Ring3 Inline Hook
}


Copy code
{
  LDE32.pas: Z0MBiE DISASM ENGINE[LDE32]
  LDE32 Delphi Coded By Anskya
  Email: [email]Anskya@Gmail.com[/email]

更新说明:
  procedure GetInstLenght(myiptr0: Pointer; osizeptr: PULONG);
  function GetProcLength(myiptr0: Pointer): ULONG;

0.2:
  增加 GetProcLength函数.用于获取一个函数过程的长度.

0.1:
  翻译

  Thank: z0mbie
}
ntOpenProcess(delphi) 含有inlinehook的处理打开进程的源代码。用delphi编写。 立即下载

相关推荐

delphi 超级hook inlinehook 类

delphi的超级hook类 纯原创,找了很久没找到 自己琢磨很久 注入yx。然后就可以愉快的hook了 处理方法暂不支持类方法 可以用了 有问题或建议可以联系我qq。

Delphi实现SSDT Hook

 这里使用DDDK---有点自己修改过的痕迹不过区别不大...自己可以看代码1.KeServiceDescriptorTable是一个很特殊的函数...如果直接使用implib来进行创建库的话你会发现这个函数是被忽略的...因为偏移为0所以这个函数基本上只能起到标志作用没有任何实用价值....一些代码中出现了代码:function SystemService(AFunc:Poi

编程资料收集与共享交流 809

Delphi hook 监视窗口创建

Delphi 使用Hook监视所有窗口创建,目前监视成功,但在卸载时,可能会导致资源管理器和任务管理器出现错误。

Delphi 能不能从Ring 3进入Ring 0

Delphi 能不能从Ring 3进入Ring 0?楼主skyworld_xm(skyworld)2004-11-19 09:58:55 在 Delphi / Windows SDK/API 提问Delphi   能不能从Ring   3进入Ring   0?     有例子吗?     多谢. 问题点数:100、回复次数:20Top 1 楼jinjazz(近身剪)回复于 2004

diligentcat的专栏 1142

DELPHI HOOK 钩子 DLL+调用

DELPHI HOOK 钩子 通过调用API 通过MessageBoxA,MessageBoxW,MessageBoxW,OpenProcess 函数的截取。

X64 inline hook CreateProcessInternalW

X64 inline hook explorer.exe-->CreateProcessInternalW监视进程创建. vc2008+WIN7 64测试通过.

SSDT Hook的妙用-对抗ring0 inline hook

 转载】SSDT Hook的妙用-对抗ring0 inline hook作 者: 堕落天才时 间: 2007-03-10,15:18链 接: http://bbs.pediy.com/showthread.php?threadid=40832********************************************************标题:【转载】SSDT Hook的妙用-对抗r

1958

完美支持64&32位InlineHook,C语言,C++类 都有

Windows 64位和32位Inline Hook的例子。包括C语言代码,和封装好的C++类,绝对超值,超简单实用的例子,可以直接运行,用了绝对说好!

Ring 0 Inline Hook

本文讲 用inline hook的方式修改NtOpenKey函数的一个例子 hook 计算机里面一般是指 挂钩某函数,也可以是替换掉原来的函数。 inline hook 是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。 这是相对普通的hook来说,因为普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。一般来说 普通的hook比较稳定使用。 inli...

weixin_30785593的博客 231

VSCode 1.85便携版安装与配置:解决远程服务器glibc版本过低报错的保姆级指南

本文详细介绍了如何通过VSCode 1.85便携版解决远程服务器glibc版本过低导致的兼容性问题。通过环境隔离和版本固化的方法,开发者可以在老旧服务器上稳定运行Remote-SSH插件,同时保留主力VSCode的配置。文章提供了从下载安装到深度配置的完整指南,帮助用户快速搭建稳定的开发环境。

weixin_30279315的博客 578

k-Wave仿真例程:创建超声换能器并绘制声场分布

k-Wave软件是为了模拟超声波在1D、2D或3D中的传播。应用示例包括:- 均匀和非均匀介质中的传播- 模拟各种类型的传感器- 模拟多普勒效应- 衍射、折射和反射- 光声、超声成像- 波束合成、成像重建- 模拟弹性波。

weixin_38452364的博客 6330

【原创】为你的驱动挂上外挂 - 嵌入反汇编引擎

标 题: 【原创】为你的驱动挂上外挂 - 嵌入反汇编引擎 作 者: thisIs 时 间: 2011-09-25,22:11:03 链 接: http://bbs.pediy.com/showthread.php?t=140587 首先来看两段IDA中的代码 上面的图是win xp下 NtOpenProcess 中的代码片段 下面的图是win 7下 PsOp

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

ConvLSTM时空预测实战代码详解

ConvLSTM代码复现

JaysonWong的博客 1万+

【Delphi】 查找一个程序进程 关闭进程

数字签名=E5792EA0273CAFAA09999998BB9BE560。关键字=【Delphi】 查找一个程序进程 关闭进程。采集日期=2023-12-02 12:22:07。采集软件=MKM - 我的知识管理。{查找一个程序进程,关闭进程}编程工具=Delphi 7。

fogbow622的博客 667

最近爆火的 Ontology 本体是什么?一文看懂基础概念 + 落地实操

1993 Tom Gruber原版定义:本体是对领域概念化模型的显式形式化规范。1998 Studer完善通用定义:本体是共享、明确、形式化的领域概念模型规范。大白话翻译:本体就是机器能看懂的行业词典+业务规则手册。数据库只管存数据,本体只管定规则,知识图谱是规则+数据结合体。区别于普通开源本体工具,这款国产商用本体平台核心优势:业务沙盘推演、可控业务数据写回、全链路字段级数据血缘审计,适配企业生产级业务落地。

驽马不舍 368

数字图像处理基础实验(二):直方图均衡化

一、实验内容及原理 1、计算灰度图像的归一化直方图 具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在 窗口中以图形的方式显示出来 步骤: (1)初始化一个256大小的数组,存放图像中每级灰度值的像素点的个数 (2)遍历整张图像 (3)归一化数组 2、灰度图像直方图均衡处理 具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。 步骤: (1)读取该像素点的灰度值 (...

lyd1995的博客 4528

通过进程ID得到进程名

在内核中,通过进程ID,得到进程名称,有多种方法。我使用了两种方法,第一种是使用ZwOpeProcess得到句柄然后ObReferenceObjectByHandle函数得到PEPROCESS结构,然后char *ProcessName = (char*)EProcess + 0x174;第二种方法是得到PEPROCESS结构之后,使用PsGetProcessImageFileName函数得到进程名。具体代码如下:#include #include UCHAR* PsGetProcessImageF

十年磨一剑,霜刃未曾试! 1万+

绕过App某加密企业版加固Frida检测

可以发现dlsym函数加载了两次pthread_create,可以认为这两个进程(或某一个进程)是和Frida的检测有关的,于是为了绕过检测,我们可以让它加载一个虚假的pthread_create函数,得到一个空结果绕过检测。成功绕过了libnllvm1717052779924.so的检测,又到了libface_nllvm.so的检测,使用同样的方法去绕过libface_nllvm.so的检测,代码我这里就不上了,大家可以自己修改以下。dlsym()函数的作用是在已经加载的动态链接库中查找指定符号的地址。

墨痕诉清风的博客 1624

delphi学习笔记(2) 专家模式

刚学习delphi,发现delphi的自动提示太弱了,没法和易还有其他语言的一些提示插件相比   后来咨询了大牛,大牛说有个CnPack这个东西很强大,所以我也在这里做一个笔记,   给需要的童鞋吧!     http://www.cnpack.org

Safedebug的博客 696

0.1 专栏导读:为什么需要从 MM 理解 HMM

本文探讨了GPU计算框架中CPU与GPU内存管理的困境,介绍了Linux内核的HMM(Heterogeneous Memory Management)解决方案。传统显式拷贝模型存在编程复杂、指针失效等问题,而HMM通过共享虚拟地址空间、自动页面迁移等机制实现透明内存管理。文章分析了HMM依赖的Linux内存管理基础设施,包括页表遍历、MMU通知、ZONE_DEVICE等核心组件,并梳理了从经典MM到支持异构设备的进化历程。最后给出了学习HMM的8层知识体系,强调理解底层MM机制是掌握HMM的关键。

图形/计算GPU的驱动与虚拟化技术分享园地 769

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

[Delphi][FMX]史上最好用的Delphi的消息推送-D推

Delphi推送 FMX推送 离线推送 消息推送 长连接 个推 极光推送 小米推送 华为推送 百度云推送 安卓推送 IOS推送 D推

wingleo的专栏 2405

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

用Delphi写的ring3下清零结束进程

unitClear0; interface uses windows,SysUtils,TLHelp32; const STATUS_SUCCESS=$00000000; STATUS_ACCESS_VIOLATION=$C0000005; STATUS_UNSUCCESSFUL...

qq_31553911的博客 373

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

【Delphi】下如何实现32位和64位都能用的Inline Hook

介绍一个CnPack专家包里常用的较底层的技术Inline Hook(内联挂接),所实现的代码均在CnVcl组件包最新的CnMethodHook.pas中。

sensor_WU 博客 419

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: SSDT UnHook For C
下一篇: Make a Windbg By Yourself
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值