关于DELPHI中的API HOOK(1)

【控件功能】我来做练习-第57课-Hook Windows API ,Hook COM,Hook Method Hook Windows API ,Hook COM,Hook Method 阅读详情

关于DELPHI中的API HOOK(1)


创建时间:2002-05-17
文章属性:原创
文章来源:angliu
文章提交: angliu (aixihuan_at_21cn.com)

关于API HOOK,我相信大家比我知道的多,大家应该记得在DOS中编程,经常都要用截取中断向量的技术,这样我们可以设置新的中断服务程序,因此当一个新的程序调用这个中断向量的时候,它就会先调用我们自己设置的中断程序,然后调用原来的中断程序,这样我们就能够非凡的控制权,许多的病毒程序都是这样的。在WINDOWS中,也可以采用类似的技术,当系统调用某个API函数时,就会先进入我们设置的函数,其工作原理和DOS的中断差不多,这种技术也有很多的名称,像"陷阱技术","重入技术"。可我认为API HOOK好一些吧!这些技术再很多的软件中也有应用的,像"金山词霸"就是的了。呵呵~~~不是故意拿金山公司的产品说的啊!这个软件就运用了这个技术,像当你把鼠标指向一个单词,这时就会弹出一个窗口翻译单词了。这也就是用了钩子的原理。说了这么多废话,说正题了,要使自己的代码正确运行,函数必须和要改写的API函数有相同形式的参数。我在程序中,拦截了MessageBoxA和MessageBoxW这两个函数。如:
fuction MyBoxA(hwn:hwnd;Iptext:pcter;Ipcapion:pchar;utype:cardinal):interger;stdcall;
fuction MyBoxW(hwn:hwnd;Iptext:pchter;Ipcapiom:pchar;utype:cardinal):interger;stdcall;
这里我使用了stdcall关键字,这个我上面已经说了,函数的形参的进出栈顺序要和拦截的函数一样,在WIN32中并不允许直接修改内存中的代码,但可以调用一个函数来运用:WriteProcessMemory。当然有的人问这个不能改写,可我用着很好!也许用它会有些bug,可我不知道,知道的人请给我来信。
在PE文件中,当你呼叫另一模块中的函数列如:USER32.DLL中的GetMessage),编译出来的CALL指令并不会吧控制权直接传给DLL里的函数,而是传给了JMP DWORD PTR [XXXXXXXXX]指令,[XXXXXXXXXX]里有该函数的真正地址(进入点),要得到API函数,可以这样写:Address:=@MessageBoxA。像上面说的那样,这里只得到了一个跳转的指令,后面的MessageBoxA才是代码开始的地方。下面的程序我自己定义了一个结构(使用了packed关键字)
TlmportCode =packed record
    Jumplnstruction: Word; //是$25FF,JUMP指令
AddressOfPointer ToFunction: PPointer;//真正开始的地址
end;
PlmportCode = ^TlportCode;
这里,Ppointer =^pointer ;用下面函数返回函数的真正地址:
function TrueFunctionAddress(func: Pointer): Pointer;
var
  Code: PlmportCode;
Begin
  Result:= func;
  if func = nil then exit;
  try
   Code := func;
   if (Code.jumplnstruction = $25FF) then begin
     Result := Code.AddressOfPointer ToFunction^;
   end;
   except
     Result :=nil;
  end;
end;
这样,只要用自己的函数的地址代替它就可以了。替换函数:
Procedure PermuteFunction(OldFunc:Ppointer; NewFunc:Poiner);
var
  written: DWORD;
begin
  WriteProcessMemory(GetCurrentProcess,OldFunc,@NewFunc,4,written);
end;
新建一个API HOOK,把上面的保存就可以了。
新建一个Application Try1,主FORM的单元名称就用TRYUNIT1。把上面的HOOK加进来,再新建一个UNIT MESS,添加下面的代码:
unit mess

interface
uses
   Windows,Message,SysUtils,Classes,APIHook;

procedure API_Hookup;
procedure Un_API_Hook;

var
   FuncMessageboxA,FuncMessagew;PlmportCode;

implementation

type
   TmessageA = function(hwn: hwnd; Iptext: pchar; Ipcapion:pchar; utype: cardinal): interger;stdcall;
   TmessageW = function(hwn: hwnd; Iptext: pchar; Ipcapion:pchar; utype: cardinal): interger;stdcall;

var
   OldMessageBoxA: TmessageA;
   OldMessageBoxW: TmessageW;


functionj MyBoxA (hwn: hwnd; Iptext: pchar; Ipcapion:pchar; utype: cardinal): interger;stdcall;
begin
result :=OldMessageBoxA(hwn,'Succes Hook A!', Ipcapion,utype);
end;

functionj MyBoxW (hwn: hwnd; Iptext: pchar; Ipcapion:pchar; utype: cardinal): interger;stdcall;
result :=OldMessageBoxW(hwn,'成功挂上W!'Ipcapion,utype);
end;

procedure API_Hookup;
begin
   if @OldMessageBoxA = nil then
@OleMessageBoxA = TrueFunctionAddress(@messageboxA);
   if @OldMessageBoxW = nil then
@OleMessageBoxW = TrueFunctionAddress(@messageboxW);

PermuteFunction(FuncMessageboxA,AddressOfPointerToFunction,@MyBoxA);
PermuteFunction(FuncMessageboxW,AddressOfPointerToFunction,@MyBoxW);
end;

procedure Un_API_Hook;
begin
  if @OldMessageBoxA <> nil then begin
         PermuteFunction(FuncMessageboxA,AddressOfPointer ToFunction,@OldMessageboxA);
         PermuteFunction(FuncMessageboxW,AddressOfPointer ToFunction,@OldMessageboxW);
  end;
end;

initialization
   FundMessageboxA := @MeesageboxA;
   FundMessageboxW := @MeesageboxW;
end;
在主窗体中添加三按钮,添加Onclick事件的代码,如下:
procedure TForm1.Button1Click( Sender: TObject);
begin
   API_Hook;
end;

procedure TForm1.Button3Click( Sender: TObject);
   Un_API_Hook;
end;

procedure TForm1.Button2Click( Sender: TObject);
begin
  MessageBoxA(Form1.Handle,'NO HOOK UP A','MessageBoxA',MB_OK);
  MessageBoxW(Form1.Handle,'NO HOOK UP W','MessageBoxW',MB_OK);
  MessageBox (Form1.Handle,'NO HOOK UP BOX','MessageBox',MB_OK);
end;
先运行TRY1,再运行TestTry。看看结果,APIHook仅仅再TRY1中挂上了,并没有在所以的系统进程中挂上,这个时想想鼠标钩子的时候做法,用SetWindowsHookEx挂上鼠标钩子,当其它的进程发出鼠标消息的时候,我们的程序就会拦截到并做出响应,还可以用UpHooklWindowsHookEx解除鼠标钩子,这样,我们就知道了,应该为我们的函数挂上钩子,当然你要知道鼠标钩子有各种的消息响应其它进程。有两种方法,一种是模仿SetWindowsHookEx,编制自己的MySetWindowsHookEx。还有一种也是WINDOWS所提供的另一个函数:GetMsgProc。这个函数在DELPHI帮助里说的很清楚得了。我们的目的也就是在动态链接库中挂上WH_GETMESSAGE消息钩子。当其它进程发出这个函数的时候,就会加载我们的动态链接库,如果我们的DLL加载时自动运行API_Hook,就可以让其它进程挂上我们的API Hook了。
第二个程序我会在下次写出来。以上的程序可能有些不足,大家可以来信指点。(angliu@hackermail.com)
陷阱式API HOOK及重入问题的解决  小弟最近研究API Hook,参考了许多资料,阅读了很多高手的文章之后终于做好了,颇有心得,写出来以免自己以后忘记API HOOK主要由陷阱式和改引入表式,二者各有局限,改引入表式则复杂,需要一定的PE知识,他要遍历当前所有的模块,然后还要遍历模块中的IAT(引入地址表),看是否有对于某个函数的调用,而且还有两个问题:就是当前进程建立一个新的线程的时候,我们必须重新这个工作,而且,如果 阅读详情

相关推荐

Delphi编程实现Windows键盘消息Hook技术

本文还有配套的精品资源,点击获取 简介:Hook技术在IT领域用于监控和控制系统或应用程序中的特定事件,如键盘输入。在Delphi 7.0环境下,可以通过Windows API实现键盘Hook。本文深入探讨了如何设置Hook,定义回调函数,安装和卸载Hook,以及处理多线程环境下的问题。这允许开发者在Delphi中拦截和处理键盘消息,以实现系统监控、安全软件或游戏外挂等功能...

weixin_42620563的博客 1360

Delphi - 关于钩子函数HOOK (一)

基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗...

a572893208的博客 502

Delphi DLL Hook框架的设计与应用

DLL(Dynamic Link Library,动态链接库)是一种在Windows操作系统下实现共享函数库概念的技术。DLL文件通常包含可由多个程序同时调用的代码和数据。其工作原理是,在程序运行时,而非编译或链接时,将库中的代码和数据映射到进程的地址空间中。这种动态链接方式与静态链接形成对比,静态链接在程序编译时就已经将库文件中的代码和数据直接复制到可执行文件中。DLL文件实现了代码的模块化,这样,当某个模块更新时,只有该模块需要重新编译,其他依赖该模块的程序不必重新编译。

weixin_42143092的博客 662

delphi apihook

关于API HOOK,我相信大家比我知道的多,大家应该记得在DOS中编程,经常都要用截取中断向量的技术,这样我们可以设置新的中断服务程序,因此当一个新的程序调用这个中断向量的时候,它就会先调用我们自己设置的中断程序,然后调用原来的中断程序,这样我们就能够非凡的控制权,许多的病毒程序都是这样的。在WINDOWS中,也可以采用类似的技术,当系统调用某个API函数时,就会先进入我们设置的函数,其工作原理

老鬼的专栏 2423

Delphi实现各种HOOK钩子源码实例.rar

Delphi的9个钩子实例源码:CopyHook+利用Hook在Explorer进程插入一个线程+全局快捷键HOOK+消息HOOK+鼠标HOOK+IO HOOK+鼠标键盘记录HOOK

CPU核心、die和package的区别:从硬件小白到高手的进阶指南

本文深入浅出地解析了CPU核心、Die与Package的核心概念与区别,是硬件爱好者从入门到精通的实用指南。文章从硅晶圆制造讲起,阐述了物理核心与逻辑线程(如超线程技术)的工作原理,并详细介绍了封装(Package)的作用与多Die模块化设计。最后,结合实际应用场景,提供了选购、性能解读与优化调优的实用建议。

pz89012345的博客 203

[转] Delphi API HOOK 完全说明

// 本文转自网络, 原始出处不明确. // 转载目的: 学习 + 分享 一、关于 API Hook 1. 什么是 API Hook 不知道大家是否还记得,在 DOS 系统中编程,经常会采取截取中断向量的技术:我们可以设置新的中断服务程序,当系统其他的程序调用这个中断时,就让它先调用我们自己设置的新的中断服务程序,然后再调用原来的中断服务程序,这样就能够获得非凡的控制权。许多优秀的

Ψ星泪(JPEXE) 3175

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

DelphiHookApi(经典)

论坛里有关于HOOK API的贴子, 但其实现在方式显示得麻烦, 其实现在拦截API一般不用那种方式, 大都采用inline Hook API方式。其实也就是直接修改了要拦截的API源码的头部,让它无条件跳转到我们自己的处理过程。    不多说别的了,开始我们自己的Hook API吧。    我们今天要拦截的API如下:    MessageBoxA、MessageBoxW、MessageB...

weixin_33979363的博客 352

期货缠论实战:文华财经笔中枢指标公式解析与博易大师应用指南

本文深入解析期货缠论实战中的文华财经笔中枢指标公式及其在博易大师平台的应用技巧。详细介绍了笔中枢指标的核心逻辑、公式拆解、参数设置及多周期联合作战策略,帮助交易者提升市场分析能力与交易胜率。特别适合期货交易者学习缠论指标的实际应用。

weixin_42522552的博客 358

osgearth添加经纬度网格,并显示鼠标所指经纬高度信息

一、代码 osgearth官方例子 #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> #

ljjjjjjjjjjj的博客 3564

HOOK API Lib 0.1 For Delphi

 周未一个朋友要求用Delphi做了一个东西,用到了API HOOK,于是写了个简单的SetOnBefore把函数安装到API之前,可在真正的api执行之前先执行我们的函数SetOnAfter把函数安装到API之后,可在真正的api执行之后再执行我们的函数代码写得比较急,还有很多地方可以优化,功能上也有些地方可以于改进一下,如:替换api,能改变api的返回值等。。。以后有

不得闲.闲忆居 1310

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1130

关于HOOK API Lib 0.1 For Delphi

标 题: HOOK API Lib 0.1 For Delphi 作 者:xIkUg my周未一个朋友要求用Delphi做了一个东西,用到了API HOOK,于是写了个简单的 SetOnBefore把函数安装到API之前,可在真正的api执行之前先执行我们的函数 SetOnAfter把函数安装到API之后,可在真正的api执行之后再执行我们的函数 代码写得比较急,还有很多地方可以优化,功能上也有...

weixin_30535913的博客 97

【React】1、React入门与概览(JSX语法)

React入门 文章目录React入门一、React全家桶1. React是什么?2. 谁开发的?3. 为什么要学?4. React的特点5. 学习React之前要掌握的JavaScript基础知识二、React 概览组件JSXVirtual DOM关于虚拟DOM:Data Flow三、React基本使用相关js库四、React JSXJSX 语法规则五、模块与组件、模块化与组件化的理解5.1 模块5.2 组件5.4 模块化5.5 组件化 一、React全家桶 React基础 React-Router(R

Coding and studying 1379

uniapp(全端兼容) - 最新详细实现支付键盘功能组件,从底部弹出数字键盘输入支付密码进行付款交互效果,自定义支付密码键盘仿微信、支付宝支付键盘,1~9密码数字键盘,电商支付(详细示例代码复制运行

uniapp,微信小程序,自定义数字键盘,输入支付密码的键盘组件,uniapp小程序如何实现从底部弹出输入支付密码自定义键盘功能,uniapp小程序密码支付键盘组件插件,自定义数字键盘输入页面,怎么封装底部弹窗自定义数字键盘用于输入支付密码,uniapp小程序仿类似电商支付密码输入模态框,uniapp微信小程序平台实现自定义支付密码键盘,uniapp 密码支付,数字键盘,安全键盘,交易键盘,交易密码,交易密码输入框,uniapp自定义支付键盘: uniapp自定义支付键盘,uniapp小程序端实现键盘输入支

✅ 精选推荐文章 2906

HOOK 超级问题

HOOK 超级问题 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061111145304252.html 求一个最简单的键盘HOOK例子; 谢谢各位大爷了! http://community.youkuaiyun.com/Expert/topic/5066/5066823...

aibi9196的博客 183

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1392

Delphi Hook API 已疯狂

作者: yangyxd   转载请注明出处 http://hi.baidu.com/yangyxd   2009-3-12     论坛里有关于HOOK API的贴子, 但其实现在方式显示得麻烦, 其实现在拦截API一般不用那种方式, 大都采用inline Hook API方式。其实也就是直接修改了要拦截的API源码的头部,让它无条件跳转到我们自己的处理过程。   不多说别的了,开始我们自己的Ho

hack_wg的专栏 3123

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

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

Delphi API HOOK 完全说明

一、关于 API Hook1. 什么是 API Hook不知道大家是否还记得,在 DOS 系统中编程,经常会采取截取中断向量的技术:我们可以设置新的中断服务程序,当系统其他的程序调用这个中断时,就让它先调用我们自己设置的新的中断服务程序,然后再调用原来的中断服务程序,这样就能够获得非凡的控制权。许多优秀的软件和大多数 DOS 病毒程序都采用了这个方法。

qiume的专栏 6698

Camera2Demo

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

vc hook send烦请转delphi

在DELPHI中如实HOOK send,我看不懂C代码,请哪位高手指点只要写出DELPHI中实现hook send就行了(包括可以修改HOOK到的封包,发送自己的封包)模拟WSockExpert,使用APIHOOK 不知道大家用过WSockExpert没有, 它可以用来截获指定进程网络数据的传输.前面我还以为它是通过实时远程注入DLL来更改IAT. 不过后来发现在程序一运行时,它就已经将DLL插入

web518的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Delphi API HOOK完全说明

Delphi API HOOK完全说明  一、关于API Hook1.什么是API Hook不知道大家是否还记得,在DOS 系统中编程,经常会采取截取中断向量的技术:我们可以设置新的中断服务程序,当系统其他的程序调用这个中断时,就让它先调用我们自己设置的新的中断服务程序,然后再调用原来的中断服务程序,这样就能够获得非凡的控制权。许多优秀的软件和大多数DOS 病毒程序都采用了这个方法。在Window

hack_wg的专栏 787

delphi - api hook 例子,截获封包(转载)

有时候我们需要对其它应用程序发送和接收的网络数据进行拦截,比如要对IE发送的HTTP头进行分析,得到请求的地址等.这次我们可以用一些例如WPE, Sniffer之类的工具来达到目的.但是工具功能有限,要想实现更强大的功能,还是我们自己动手来DIY吧.      拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,

hack_wg的专栏 4496

DELPHI HOOK随手笔记

在 DOS 系统中编程,经常会采取截取中断向量的技术:我们可以设置新的中断服务程序,当系统其他的程序调用这个中断时,就让它先调用我们自己设置的新的中断服务程序,然后再调用原来的中断服务程序,这样就能够获得非凡的控制权。许多优秀的软件和大多数 DOS 病毒程序都采用了这个方法。 在 Windows 中,我们也可以采取类似技术。当系统调用某个 API 函数时,就会先进入我们自己的函数,然后再调用原...

kinvsn的博客 1360
上一篇: 关于OD万能断点设置 - [转贴]
下一篇: Delphi深度之旅——网络游戏外挂制作
yesloo
博客等级 码龄21年 3粉丝 3原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值