易语言HookAPI 技巧
详解易语言的钩子(钩子HOOK与APIHOOK区别)
详解易语⾔的钩⼦(钩⼦HOOK与APIHOOK区别)在本篇内容⾥我们给⼤家详细分析了易语⾔中间的钩⼦概念以及HOOK与APIHOOK区别钩⼦原英⽂名称 Hook ,钩⼦的意思是指拦截或截获。
作⽤就是拦截程序中交互的数据,先经过我们预定的钩⼦处理接⼝程序,处理过后,再交还给原处理程序,或者⼲脆阻⽌,吃掉这些数据,让原处理程序什么也得不到。
钩⼦原来是Windows操作系统常⽤来检查系统与程序间通信的⼀些数据是否到达⽬标时⽤的,为不传之密,后来随着⼀些⾼⼿们的研究,逐渐的发现了这些秘密的技术并且公布了出来。
同时还有更多的⼈在掌握了这些技术后,⽤在⾃已的软件开发中,实现出奇招⽽超过其它同类软件的功能⽽赢得市场。
钩⼦技术的种类上很多.HOOK API和HOOK技术完全不同。
尽管它们都是钩⼦。
HOOK钩的是消息,它在系统将消息传递给应⽤程序之前截获它,然后进⾏操作、或修改消息、或停⽌消息的传递;⽽HOOK API截获的是应⽤程序对系统API的调⽤,它在应⽤程序对系统API的调⽤之前截获此调⽤动作,让其转⽽调⽤我们所定义的函数(内容可能是进⾏⼀些操作后再调⽤原系统API)。
关于HOOK技术,微软为我们提供了现成的API,有固定的使⽤步骤。
⽽对于HOOK API技术,微软并没有向我们提供类似的API,没有那么简洁的步骤可供我们参考,也许是因为微软并不希望我们⽤这样的⼿段编程,所以相对要⿇烦⼀些。
WINDOWS的钩⼦函数可以认为是WINDOWS的主要特性之⼀。
利⽤它们,您可以捕捉您⾃⼰进程或其它进程发⽣的事件。
通过“钩挂”,您可以给WINDOWS⼀个处理或过滤事件的回调函数,该函数也叫做“钩⼦函数”,当每次发⽣您感兴趣的事件时,WINDOWS都将调⽤该函数。
⼀共有两种类型的钩⼦:局部的和远程的。
局部钩⼦仅钩挂您⾃⼰进程的事件。
远程的钩⼦还可以将钩挂其它进程发⽣的事件。
远程的钩⼦⼜有两种:基于线程的它将捕获其它进程中某⼀特定线程的事件。
利用HOOKAPI拦截文件操作
利⽤HOOKAPI拦截⽂件操作先读下HookAPI 使⽤⽂档:功能简介HookAPI 是⼀个截获Windows 32位API函数的开发包,它可以在Windows调⽤某个API函数的时候,先调⽤⾃⼰编写的函数,从⽽实现特殊的功能。
HookAPI同样也适⽤于截获⽤户⾃⼰编写的DLL⽂件中的输出函数。
1.5系统特点:1)⾃⼰编写的替代函数的参数形式和原API函数完全⼀样,⽅便了Delphi和VB⽤户的使⽤。
2)实时截获所有新建⽴的进程,即进程建⽴后马上安装钩⼦,⽽不是采⽤定时扫描进程的⽅法3)由于不采⽤定时扫描进程的⽅法,所以系统资源消耗少,基本上看不到消耗CPU资源。
4)新建⽴的InstDLL动态库,减少了⽤户调⽤HookAPI的代码。
运⾏和开发平台为Windows NT/2000/9x/XP包含的⽂件列表:【EXE⽬录】:调⽤InstHook.dll来安装HookAPI的执⾏程序【InstHook⽬录】:安装HookAPI的DLL程序【dll⽬录】:NT/2000/XP/XP下截获32位API函数的DLL程序【HOOKAPI9x.dll】:Win9x下截获32位API函数的DLL程序【EXE⽬录】:HookAPI.exe的源码【HOOKSOCKET⽬录】:截获Socket函数的mydll例⼦【HOOKREG⽬录】:截获注册表函数的mydll例⼦【HOOKFILE⽬录】:截获⽂件存取的mydll例⼦【HOOKFILE9x⽬录】:win9x下的截获⽂件存取的mydll_9x例⼦【HookFile_Delphi⽬录】:截获⽂件存取的Delphi下的mydll的例⼦【HookSocket_Delphi⽬录】:截取Socket函数的Delphi下的mydll的例⼦使⽤:⽤户编写要截获的API函数相对应的⾃⼰的实现函数,编译成mydll.dll,同时在⾃⼰的程序中调⽤InstHook.dll中的安装/卸载函数就可以实现⾃⼰的截获过程。
07授人以鱼不如授人以渔●(HOOK API的概念及应用 HOOK篇一)
07授人以鱼不如授人以渔●(HOOK API的概念及应用HOOK篇一)前言:让程序按照自己的代码来走,这是个很有意思的事情。
HOOK 其实是一个很有意思的东西,他能让你在枯燥的外挂学习中感受到一丝乐趣HOOK的原理:修改函数的首地址跳转到你想执行的代码然后返回。
这就好比正常的程序就像一个汽车在公路上行驶(代码正常运行),而这个时候警察在半路设下了一个路障(修改原始地址JMP 我们的代码地址),要求汽车靠边停靠(修改原始程序代码,JMP 地址跳转到我们的代码区),这个时候汽车过来了,看到路障并且停靠在右边(跳转到我们的代码区了)并且接受检查(执行我们的代码),恢复路面(将修改的代码复原),检查完毕后(比如说代码执行了数据拷贝,或者一些特殊功能比如说send 恢复代码后可以直接执行,也可以拦截不发也可以修改数据在发送。
),汽车继续行驶。
HOOK的方法有很多,修改CALL的代码跳转到我们的程序执行完我们的代码后,复原CALL 然后在调用。
或者直接在函数头跳转。
HOOK的方法有很多种,但万变不离其中~封包助手是一款类似于WPE 截包的软件,今天我们来看看他是如何HOOK send 封包函数的.此次的目标还是前几天我们用到的模拟器我们先来看一下正常的send 函数头部 . 按下CTRL+G 输入send 回车(打开OD第一次需要找2次应该是OD BUG)好了跳转到如下地址然后我们来看下用封包助手加载程序后代码的变化mov edi,edipush ebppush ebp,esp这三句话修改成了JMP PACKASSI.13148F88这句汇编指令的意思就是强行跳转到13148f88 这个地址去(开始设置路障)好了我们下bp send 然后按模拟器进入或加血让程序断下然后按F8 单步运行, 这个时候强行跳转到了封包助手设置的位置.(汽车靠边了)这里就是我们跳转的地方了.也就是说封包助手处理数据的地方.这里有3个CALL 我们来看看都有什么功能.我们进入第一个CALL里面看到OD 分析出几个CALL的函数getsockname() 获取一个套接口的IP和端口ntoa() 将网络IP地址转换"."格式的字符串形式ntohs() 将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
易语言DNF召唤、无敌、技能HOOK源码教程。
易语言DNF召唤、无敌、技能HOOK源码教程。
学习各种外挂制作技术,马上去百度搜索"魔鬼作坊" 点击第一个站去那里学习喽。
F1=十字改轮子F2=吸头改分针F3=银光改喷毒F4=裂波改紫风F5=加血F6=加蓝.版本2007CDCFC 20050007D2066 20016007CD571 200280064A0E6 21001006494F8 22208.程序集窗口程序集1.程序集变量十字改召唤野猪魔剑, 整数型.程序集变量十字改分针, 整数型.程序集变量银光改地火, 整数型.程序集变量银光改爆炎, 整数型.程序集变量SSS, 整数型.程序集变量霸体, 整数型.子程序_窗口1_创建完毕鼠标显示()内存操作.提升权限()内存操作.打开进程()十字改召唤野猪魔剑=热键.注册(窗口1.取窗口句柄(), 0, #F1键, &十字改召唤野猪魔剑) 十字改分针=热键.注册(窗口1.取窗口句柄(), 0, #F2键, &十字改分针)银光改地火=热键.注册(窗口1.取窗口句柄(), 0, #F3键, &银光改地火)银光改爆炎=热键.注册(窗口1.取窗口句柄(), 0, #F4键, &银光改爆炎)SSS =热键.注册(窗口1.取窗口句柄(), 0, #F5键, &SSS)霸体=热键.注册(窗口1.取窗口句柄(), 0, #F6键, &霸体).子程序十字改召唤野猪魔剑写内存整数型(取窗口进程ID (窗口1.取窗口句柄()), 十六到十(“0079556D”), 860615) ' 十字改召唤野猪魔剑.子程序十字改分针写内存整数型(取窗口进程ID (窗口1.取窗口句柄()), 十六到十(“0079556D”), 860622) ' 十字改分针.子程序银光改地火写内存整数型(取窗口进程ID (窗口1.取窗口句柄()), 十六到十(“00799F38”), 20044) ' 银光改地火.子程序银光改爆炎写内存整数型(取窗口进程ID (窗口1.取窗口句柄()), 十六到十(“00799F38”), 860330) ' 银光改爆炎.子程序霸体内存操作.写代码(“010CF69C+4F0=1”) ' 霸体.子程序SSS内存操作.写代码(“0169EEA9={144,144,144}”) ' 3S.子程序_按钮1_被单击内存操作.写代码(“01080FD4+1CA8=5”) ' 远程卖.子程序_按钮2_被单击内存操作.写代码(“01080FD4+1CA8=6”) ' 远程修版本2.子程序dnf进程ID, , 公开.子程序VMP保护标记结尾, , 公开.子程序VMP保护标记开始, , 公开.子程序倍功, , 公开.参数人物基址, 文本型.参数物攻偏移, 文本型.参数攻击伤害, 整数型.参数魔攻偏移, 文本型.子程序超级瞬移CALL, , 公开.参数区域id, 整数型, , 3-塔.参数位置id, 整数型, , 7-塔.参数X轴参数, 文本型.参数y轴参数, 文本型.参数z轴参数, 文本型.参数头部参数, 文本型.子程序打开DNF进程, , 公开.子程序动作CALL, , 公开, 0.收放1.蹲下2.打坐5.死亡7.跳打9.被打12.出击15冲击打16拾取.参数基址, 整数型.参数动作ID, 整数型.参数动作CALL, 文本型.子程序返回BOSS地址, 整数型, 公开.参数类型, 整数型, , 529是怪物273是APC 1057是普通建筑33是特殊建筑.参数阵营, 整数型, 可空, 默认为队友,-1为不限100为敌人200为建筑0为队友.参数人物基址, 文本型.子程序恢复血蓝, , 公开.参数人物基址, 文本型.子程序加密, , 公开.参数地址357, 整数型.参数加密参数1, 文本型.参数加密参数2, 文本型.参数数值, 整数型.子程序解除禁闭, , 公开.子程序解除虚弱, , 公开.参数人物基址, 文本型.参数虚弱偏移, 文本型.子程序解密, 整数型, 公开.参数加密参数1, 文本型.参数加密参数2, 文本型.参数地址159, 整数型.子程序全屏捡物, , 公开.参数人物基址, 文本型.子程序人物假死, , 公开.参数人物基址, 文本型.子程序是否指定怪物, 整数型, 公开.参数地址, 整数型.参数阵营, 整数型.参数类型, 整数型.参数人物基址, 文本型.子程序鼠标显示, , 公开.子程序提升权限, , 公开.子程序无限负重, , 公开.参数人物基址, 文本型.子程序物品CALL, , 公开.参数物品基址, 整数型.参数物品代码, 整数型.参数物品CALL偏移, 文本型.子程序异界秒怪, , 公开.参数人物基址, 文本型.子程序远程出售, , 公开.参数商店基址, 文本型.子程序远程修理, , 公开.参数商店基址, 文本型学习各种外挂制作技术,马上去百度搜索"魔鬼作坊" 点击第一个站去那里学习喽。
hook api几种方法
:71A21B72 8B4508 mov eax, dword ptr [ebp+08]
:71A21B75 5F pop edi
:71A21B76 5E pop esi
:71A21B77 C9 leave
:71A21B78 C21000 ret 0010
下面用4种方法来HOOK这个API:
:71A21B62 8BD8 mov ebx, eax
:71A21B64 E8C7F6FFFF call 71A21230 //将被HOOK的机器码(第3种方法)
:71A21B69 3BDF cmp ebx, edi
:71A21B6B 5B pop ebx
:71A21B6C 0F855F940000 jne 71A2AFD1
假设我们的HOOK代码在71A20400处,那么我们把71A21B64处的CALL指令改为CALL 71A20400(原指令是这样的:CALL 71A21230)
而71A20400处的HOOK代码是这样的:
71A20400:
pushad
//在这里做你想做的事情
:71A21B42 57 push edi
:71A21B43 57 push edi
:71A21B44 FF7514 push [ebp+14]
:71A21B47 8945F0 mov dword ptr [ebp-10], eax
:71A21B4A 8B450C mov eax, dword ptr [ebp+0C]
4,上下文的问题,有些HOOK代码不能执行某些操作,否则会破坏原API的上下文,原API就失效了;
5,同步问题,在HOOK代码里尽量不使用全局变量,而使用局部变量,这样也是模块化程序的需要;
Windows中Hook API技术
Windows下Hook API技术 inline hook分类: WINDOWS什么叫Hook API?所谓Hook就是钩子的意思,而API是指 Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能, Hook API的意思就是在这些应用程序调用真正的系统API前可以先被截获,从而进行一些处理再调用真正的API来完成功能。
在讲Hook API之前先来看一下如何Hook消息,例如Hook全局键盘消息,从而可以知道用户按了哪些键,这种Hook消息的功能可以由以下函数来完成,该函数将一个新的 Hook加入到原来的Hook链中,当某一消息到达后会依次经过它的Hook链再交给应用程序。
HHOOK SetWindowsHookEx(int idHook, //Hook类型,例如WH_KEYBOARD,WH_MOUSEHOOKPROC lpfn, //Hook处理过程函数的地址HINSTANCE hMod, //包含Hook处理过程函数的dll句柄(若在本进程可以为NULL)DWORD dwThreadId, //要Hook的线程ID,若为0,表示全局Hook所有);这里需要提一下的就是如果是Hook全局的而不是某个特定的进程则需要将Hook过程编写为一个DLL,以便让任何程序都可以加载它来获取Hook过程函数。
而对于Hook API微软并没有提供直接的接口函数,也许它并不想让我们这样做,不过有2种方法可以完成该功能。
第一种,修改可执行文件的IAT表(即输入表),因为在该表中记录了所有调用API的函数地址,则只需将这些地址改为自己函数的地址即可,但是这样有一个局限,因为有的程序会加壳,这样会隐藏真实的IAT表,从而使该方法失效。
第二种方法是直接跳转,改变API函数的头几个字节,使程序跳转到自己的函数,然后恢复API开头的几个字节,在调用AP完成功能后再改回来又能继续Hook了,但是这种方法也有一个问题就是同步的问题,当然这是可以克服的,并且该方法不受程序加壳的限制。
HOOKAPI(一)——HOOK基础+一个鼠标钩子实例
HOOKAPI(⼀)——HOOK基础+⼀个⿏标钩⼦实例HOOK API (⼀)——HOOK基础+⼀个⿏标钩⼦实例code: https:///hfl15/windows_kernel_development/tree/master/demo_source_code/MouseHook0x00 起因最近在做毕业设计,有⼀个功能是需要实现对剪切板的监控和进程的防终⽌保护。
原本想从内核层实现,但没有头绪。
最后决定从调⽤层⼊⼿,即采⽤HOOK API的技术来挂钩相应的API,从⽽实现预期的功能。
在这样的需求下,就开始学习了HOOK API。
0x01什么是HOOK APIHOOK(钩⼦,挂钩)是⼀种实现Windows平台下类似于中断的机制。
HOOK机制允许应⽤程序拦截并处理Windows消息或指定事件,当指定的消息发出后,HOOK程序就可以在消息到达⽬标窗⼝之前将其捕获,从⽽得到对消息的控制权,进⽽可以对该消息进⾏处理或修改,加⼊我们所需的功能。
钩⼦按使⽤范围分,可分为线程钩⼦和系统钩⼦,其中,系统钩⼦具有相当⼤的功能,⼏乎可以实现对所有Windows消息的拦截、处理和监控。
这项技术涉及到两个重要的API,⼀个是SetWindowsHookEx,安装钩⼦;另⼀个是UnHookWindowsHookEx,卸载钩⼦。
本⽂使⽤的HOOK API技术,是指截获系统或进程对某个API函数的调⽤,使得API的执⾏流程转向我们指定的代码段,从⽽实现我们所需的功能。
Windows下的每个进程均拥有⾃⼰的地址空间,并且进程只能调⽤其地址空间内的函数,因此HOOK API尤为关键的⼀步是,设法将⾃⼰的代码段注⼊到⽬标进程中,才能进⼀步实现对该进程调⽤的API进⾏拦截。
然⽽微软并没有提供HOOK API的调⽤接⼝,这就需要开发者⾃⼰编程实现,⼤家所熟知的防毒软件、防⽕墙软件等均采⽤HOOK API实现。
⼀般来说,HOOK API由两个组成部分,即实现HOOK API的DLL⽂件,和启动注⼊的主调程序。
易语言 勾子
易语言勾子<一>勾子基本概念本期导读:什么叫勾子,勾子又起什么作用,它有那些类别,怎么使用,等等这些问题将在本期找到答案=========================================================== 基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
运行机制1、钩子链表和钩子子程:每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。
这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。
当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。
一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。
最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。
每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。
如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。
用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
汇编--HookAPI(MessageBoxW)
汇编--HookAPI(MessageBoxW)说到HOOK。
我看了⾮常多的资料和教程。
⽆奈就是学不会HOOK。
不懂是我的理解能⼒差。
还是你们说的不够明确,直到我看了下⾯这篇⽂章,最终学会了HOOK:----------------------------------------------------------------------------------------------------------------------------------------------既然窝已经⼊门了HOOK,窝会写⼏篇关于HOOK的⽂章,让相同想⼊门HOOK,却难以⼊门的童鞋有个參考。
这篇是第⼀篇,希望帮助到有此须要的盆友,我測试的环境都是:Win7+VS2008+MFC--------------------------------------------------------------------------------------------------------------------------------------------------第⼀篇说的是HOOK⾃⼰程序的MessageBoxW。
诚然HOOK⾃⼰程序⽤到的API在实际应⽤中没有什么⼤的⽤处,只是我觉得对于我们理解HOOK却有莫⼤的帮助,因此我的HOOK⽂章就从HOOK⾃⼰的程序開始。
⽂章后⾯附有本样例程序的VS2008源代码下载地址。
---------------------------------------------------------------------------------------------------------------------------------------------------//先看下我写的样例程序及执⾏效果截图,后⾯再对其进⾏分析//未钩MessageBoxW前//钩MessageBoxW后---------------------------------------------------------------------------------------------------------------------依据我的理解,先说⼀下HOOK API的⼀般思路和步骤。
HOOK API 函数跳转详解
什么是HOOK API:Windows下暴露的对开发人员的接口叫做应用程序编程接口,就是我们常说的API。
我们在写应用层应用程序软件的时候都是通过调用各种API来实现的。
有些时候,我们需要监控其他程序调用的API,也就是,当其他应用程序调用我们感兴趣的API的时候,我们在他调用前有一个机会做自己的处理,这就是HOOK API的涵义。
思路:我们知道Windows系统API函数都是被封装到DLL中,在某个应用程序要调用一个API函数的时候,如果这个函数所在的DLL没有被加载到本进程中则加载它,然后保存当前环境(各个寄存器和函数调用完后的返回地址等)。
接着程序会跳转到这个API函数的入口地址去执行此处的指令。
由此看来,我们想在调用真正的API之前先调用我们的函数,那么可以修改这个API函数的入口处的代码,使他先跳转到我们的函数地址,然后在我们的函数最后再调用原来的API函数。
下面以拦截WS2_32.dll中的recv函数为例说明拦截的主要过程。
首先把自己编写的DLL挂接到系统当前运行的所有进程中(要排除一些Windows 系统自身的进程,否则会出现问题,影响系统正常工作),挂接的意思是,要我们的DLL运行在目标进程的地址空间中。
可以使用列举系统进程然后用远程线程注入的方法,但是这种方法只适用于Win2000以上的操作系统。
当我们的DLL被所有目标进程加载后,我们就可以进行真正的工作了。
首先使用Tool Help库的相关函数列举目标进程加载的所有模块,看看是否有ws2_32.dll,如果没有,说明这个进程没有使用Winsock提供的函数,那么我们就不用再给这个进程添乱了。
如果找到ws2_32.dll模块,那么OK,我们可以开工了。
先是用GetProcAddress函数获得进程中ws2_32.dll模块的recv函数的入口地址,也就是函数的起始地址。
刚才说过,我们想把recv 函数起始位置加入一条跳转指令,让它先跳转到我们的函数中运行。
setwindowshookex函数易语言用法 -回复
setwindowshookex函数易语言用法-回复setwindowshookex函数是Windows操作系统提供的一个功能强大的函数,用于安装钩子(hook)。
钩子是一种特殊的机制,它允许一个函数拦截并处理特定事件或消息。
通过使用setwindowshookex函数,我们可以监视并干预应用程序的行为。
在本文中,我们将一步一步解释setwindowshookex函数在易语言中的用法。
第一步:了解setwindowshookex函数的功能和参数setwindowshookex函数是包含在user32.dll库中的一个API函数。
该函数的作用是向全局的钩子链中添加一个钩子过程,并指定钩子过程要监视的事件类型。
setwindowshookex函数的参数包括:- idHook:指定钩子类型,常用的钩子类型有WH_KEYBOARD(键盘钩子)和WH_MOUSE(鼠标钩子)。
- lpfn:指向钩子过程的指针,当特定事件发生时,系统将调用此函数。
- hmod:指定包含实现钩子过程的DLL的句柄,通常为NULL。
- dwThreadId:指定要监视的线程的标识符,为0时表示监视所有线程。
第二步:在易语言中声明setwindowshookex函数的原型在易语言中,可以使用extern关键字来声明一个外部函数的原型,以便在程序中使用这个函数。
因此,我们可以在代码中添加如下语句来声明setwindowshookex函数的原型:extern "user32.dll" int SetWindowsHookExA(int idHook, int lpfn, int hmod, int dwThreadId);第三步:编写一个钩子过程钩子过程是一个回调函数,用于处理特定事件。
在易语言中,可以通过定义一个标签函数来实现钩子过程。
以键盘钩子为例,我们可以编写如下的钩子过程函数:Label HookProcCallback(Label nCode, Label wParam, Label lParam) {if (nCode == HC_ACTION && wParam == WM_KEYDOWN){在这里处理键盘按键事件}如果返回值为0,则继续进行钩子链中的下一个钩子过程return 0;}第四步:安装钩子在易语言中,安装钩子需要调用setwindowshookex函数,并将钩子过程的地址作为参数传递给该函数。
易语言API助手使用方法
易语⾔API助⼿使⽤⽅法
易语⾔API助⼿它的唯⼀功能就是⽅便查询API函数命令,能够⾃动在程序中加⼊指定dll命令声明的向导程序。
1、先了解⼀下API,Application Programming Interface,应⽤程序编程接⼝,编程⼈员通过这个接⼝,可以调⽤系统某些软件或者硬件的功能!
2、易语⾔的API助⼿对API进⾏了分类,可以以英⽂或中⽂的形式查看,同时提供了中英⽂索引查找和⼀些例程!
3、我们可以通过易语⾔的⼯具---执⾏易向导,来导⼊需要的API助⼿中的函数!
4、选中API助⼿,然后就会⾃动打开API助⼿,选择⾃⼰的需要的API,并在⽬录中双击,选择代码的形式,勾选选中的函数,点击导放即可!
5、这样就可以直接在易语⾔导⼊了由API助⼿选中的函数,⽤于相当的⽅便!。
易语言d3dhook方框透视透明窗口外部绘制方法原理
易语言D3DHook方框透视透明窗口外部绘制方法的原理主要包括以下几个步骤:1. 创建窗口:首先需要使用易语言创建一个窗口。
这个窗口将作为透明的绘制窗口。
2. 获取Direct3D接口:使用D3DHook技术,通过DLL注入或者API拦截的方式,获取到被注入程序(通常是游戏)的Direct3D接口。
这通常涉及到对Direct3D函数的Hook,如CreateDevice、Reset等。
3. 禁用Z轴缓冲(透视):为了实现透视效果,需要禁用或修改Direct3D的Z轴缓冲。
这可以通过调用相关的Direct3D接口函数来实现。
4. 创建和设置渲染目标:创建一个新的渲染目标(RenderTarget),并将其设置为当前的渲染目标。
这样,所有的图形绘制都会在这个新的渲染目标上进行,而不是直接在游戏画面中。
5. 外部绘制:在新的渲染目标上进行外部绘制,包括方框透视等效果。
这可能涉及到使用Direct3D的绘图函数,如DrawPrimitive、DrawIndexedPrimitive等。
6. 混合透明窗口:将绘制好的透视方框与透明窗口进行混合。
这通常涉及到将渲染目标的内容复制到窗口表面,并设置适当的透明度。
7. 恢复原状:在完成绘制后,需要恢复Direct3D的原始状态,包括重置渲染目标、恢复Z轴缓冲等,以确保游戏的正常运行。
8. 资源释放:在完成所有操作后,需要正确地释放所使用的Direct3D资源和接口,以避免内存泄漏和其他问题。
需要注意的是,D3DHook和透视绘制涉及到复杂的Direct3D编程和API 操作,且可能违反某些游戏的服务条款,因此在实际应用时需要谨慎对待。
此外,由于Direct3D版本和游戏的差异,具体的实现细节可能会有所不同。
HookAPI
替换IAT中的导入函数地址实现Hook API详细说明《Windows 核心编程》中有。
贴段代码,我写得比他写得简洁多了。
自己会查找 Image Import descriptor 的地址,而不像书中所用的调用 ImageHlp.dll 或者 DbgHelp.dll 中的函数 ImageDirectoryToData 来实现。
为了使用一些 PE 结构类型,请#include (不会导入他的函数)。
使用方法:HookAPI((PBYTE) GetModuleHandle(NULL), "User32.dll", MessageBox, MyMessageBox);取消Hook:HookAPI((PBYTE) GetModuleHandle(NULL), "User32.dll", MyMessageBox, MessageBox);原本以为用这种方法能Hook User32.dll 中的 SetScrollInfo 实现 ClassXP 自绘 Scroll 的。
因为需要HookAPI((PBYTE) GetModuleHandle("User32.dll"), "User32.dll", SetScrollInfo, MySetScrollInfo) ,后来发现 User32.dll 根本不是导入自己的函数,而是直接调用——早该想到了,晕死!所以替换IAT方法Hook,还是有限制的,没办法在ClassXP中使用:(只好替换SetScrollInfo的入口点代码了:(PVOID HookAPI(PBYTE pbModule, PCSTR pszName, PVOID pvOrg, PVOID pvNew){PIMAGE_THUNK_DATA r;PIMAGE_NT_HEADERS p;PIMAGE_IMPORT_DESCRIPTOR q;p = (PIMAGE_NT_HEADERS) (pbModule + ((PIMAGE_DOS_HEADER) pbModule)->e_lfanew);q = (PIMAGE_IMPORT_DESCRIPTOR) (pbModule +p->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);for (; q->Name; q++){if (lstrcmpiA(pszName, (PCSTR) (pbModule + q->Name)) == 0){for (r = (PIMAGE_THUNK_DATA) (pbModule + q->FirstThunk); r->u1.Function; r++){if ((PVOID) r->u1.Function == pvOrg){WriteProcessMemory(GetCurrentProcess(), &r->u1.Function, &pvNew, sizeof(PVOID), NULL); return pvOrg;}}}}return NULL;}下面是替换函数入口的方法,只能用于X86的平台中,尚不完善。
Windows_Hook_易核心编程(3)_API_Hook_续_拦截API
上一期,我们讲了用HOOK技术实现远程线程插入,相信大家还记忆犹新.这一期我们来谈谈 API HOOKAPI Hook技术应用广泛,常用于屏幕取词,网络防火墙,病毒木马,加壳软件,串口红外通讯,游戏外挂,internet通信等领域API HOOK的中文意思就是钩住API,对API进行预处理,先执行我们的函数,例如我们用API Hook技术挂接ExitWindowsEx API函数,使关机失效,挂接ZwOpenProcess函数,隐藏进程等等......总的来说,常用的挂钩API方法有以下两种: <一>改写IAT导入表法我们知道,Windows下的可执行文档的文件格式是一种叫PE(“portable executable”,可移植的可执行文件)的文件格式,这种文件格式是由微软设计的,接下来这张图描述了PE文件的结构:+-------------------------------+ - offset 0| MS DOS标志("MZ") 和 DOS块 |+-------------------------------+| PE 标志 ("PE") |+-------------------------------+| .text | - 模块代码| 程序代码 || |+-------------------------------+| .data | - 已初始化的(全局静态)数据| 已初始化的数据 || |+-------------------------------+| .idata | - 导入函数的信息和数据| 导入表 || |+-------------------------------+| .edata | - 导出函数的信息和数据| 导出表 || |+-------------------------------+| 调试符号 |+-------------------------------+这里对我们比较重要的是.idata部分的导入地址表(IAT)。
易语言API高级技巧教学
易语⾔API⾼级技巧教学⾸先声明,本⽂的读者该卖是:具有相当的易⾔语基础的、能较熟练地把常⽤的的API从VB/C声明转换到易⾔语DLL命令的易⾔语喜欢者。
1,使⽤指针易⾔语中出于安定、⽅便考虑,没有直接提供指针,这正在进⾏⼀些⾼级纵时不是很⽅便,固然有⼀些第三⽅⽀撑库可以取出变量指针(⽐如我的eLib++ 注:该⽀撑库系Delphi开发,本⼈已开放源代,你可以到易⾔语下载区瞧瞧)但是仅仅为了这个纵就带上⼀个⽀撑库不太值得。
实在⽤⼀个API,加上⼀些技术就可以欺骗Windows和易⾔语,让它们报告你⼀个变量的指针。
这个API是lstrcpyn。
⽤过C开发Windows下的步骤的朋友可能对这个API相⽐熟识,就是字符串拷贝。
正在windows下取代C 准则库函数strncpy的。
字符串拷贝怎样能获得变量指针呢?秘密就正在这个API的返回值:瞧瞧MSDN:“If the function succeeds, the return value is a pointer to the buffer”该函数把第⼆个参数指定的字符串双制到第⼀个参数指定的字符串,第三个参数指定双制的长度。
假如双制成功,返回第⼀个参数(缓冲区buffer)的地点。
瞧到了吗?它返回第⼀个参数的地点!!那么我们把需求取地点的变量给它的第⼀个参数,然后想要领让它双制成功,它不就返回了那个变量的地点了吗?界说⼀个DLL命令如下:Dll命令:取⽂本指针返回值类型:整数型正在Dll库中的命令名:lstrcpyn参数:欲取其指针的⽂本数据类型:⽂本型 <传址>参数:欲取其指针的⽂本数据类型:⽂本型 <传址>参数:保存数据类型:整数型备注:0这样挪⽤:⽂本1 = “abcdefg”指针1 =取⽂本指针 (⽂本1, ⽂本1, 0)把⽂本1双制到⾃⼰,双制长度为0字节(也就是什么都不双制),然后返回⽂本1的指针。
就这么简略。
HOOKAPI——Windows核心编程第22章插入DLL和挂接API学习笔记
HOOKAPI——Windows核心编程第22章插入DLL和挂接API学习笔记HOOK API——Windows核心编程第22章插入DLL和挂接API 学习笔记介绍:HOOK API是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码。
Windows下的应用程序都建立在API函数至上,所以截获API是一项相当有用的技术,它使得用户有机会干预其它应用程序的程序流程。
最常用的一种挂钩API的方法是改变目标进程中调用API函数的代码,使得它们对API的调用变为对用户自定义函数的调用。
HOOK API和HOOK技术完全不同。
尽管它们都是钩子。
HOOK 钩的是消息,它在系统将消息传递给应用程序之前截获它,然后进行操作、或修改消息、或停止消息的传递;而HOOK API截获的是应用程序对系统API的调用,它在应用程序对系统API的调用之前截获此调用动作,让其转而调用我们所定义的函数(内容可能是进行一些操作后再调用原系统API)。
关于HOOK技术,微软为我们提供了现成的API,有固定的使用步骤。
而对于HOOK API技术,微软并没有向我们提供类似的API,没有那么简洁的步骤可供我们参考,也许是因为微软并不希望我们用这样的手段编程,所以相对要麻烦一些。
以下为《windows核心编程》学习笔记:windows编程中,有些时候必须要打破进程的界限。
访问另一个进程的地址空间。
这些情况包括:1.当你想要为另一个进程创建的窗口建立子类时,即为此窗口指定新的窗口过程函数。
2.当你需要调试帮助时。
3.当你想要挂接其它进程时(HOOK API?)。
一旦你的DLL插入到另一个进程的地址空间,就可以对另一个进程为所欲为。
一、为另一个进程创建的窗口建立一个子类。
建立子类就能改变窗口的行为特性。
若要建立子类,只需要调用SetWindowLongPtr函数,改变窗口的内存块中的窗口过程地址,指向一个新的(你自己的)WndProc。
Hook API之修改指令方法
Hook API之修改指令方法和修改IAT的方法有点不同^_^#include "stdafx.h"#include "process.h" //_beginthread使用#define HookModName "user32.dll" //HOOK的模块和API#define HookApiName "MessageBoxA"//本dll的handleHANDLE g_hInstance = NULL;//修改API入口为mov eax, 00400000;jmp eax是程序能跳转到自己的函数BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };//保存原API入口的8个字节DWORD g_dwOldBytes[8] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };//API地址void * m_AddrAPI;//定义自己的API,参数表和原函数一致,MyHookAPI中调用的也一样int WINAPI MyHookAPI(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){if(ul_reason_for_call==DLL_PROCESS_ATTACH){//获取本dll句柄g_hInstance = hModule;//找到API地址HMODULE hWsock = LoadLibrary(HookModName);m_AddrAPI = (void *)GetProcAddress( hWsock,HookApiName);//保存原始字节ReadProcessMemory(INVALID_HANDLE_VALUE,m_AddrAPI, ( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );//将00400000替换为我们函数的地址*( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )MyHookAPI;//改写API跳向MyHookAPIWriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );}return TRUE;}int _stdcall MyHookAPI(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType) {//lpText = strcat("HOOK_",lpText);//((pOldAPI)pOldAPIAddr)(NULL, "HOOK函数显示", "NND", 0); //参数表别忘了//((pOldAPI)pOldAPIAddr)(hWnd,lpText,"HOOK",uType);//恢复指令WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );//调用::MessageBox(hWnd,lpText,"HOOK",uType);//重新改写,为下次调用WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );return 0;}HOOKAPI之修改IAT法则HOOK是一种WINDOWS下存在很久的技术了。
HOOK API
Dll源代码:
#include <Windows.h>
#include <stdio.h>
typedef DWORD SYSTEM_INFORMATION_CLASS;
typedef int (WINAPI *pNtQuerySystemInformationFun)(
SYSTEM_INFORMATION_CLASS SystemInformationClass,
PVOID SystemInformation,
{
wcout<<L"hWnd:"<<(int)hWnd<<endl;
wcout<<L"lpText:"<<lpText<<endl;
wcout<<L"lpCaption:"<<lpCaption<<endl;
wcout<<L"uType:"<<uType<<endl<<endl;
WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);//写入我们处理后的5个字节
MessageBoxW(GetForegroundWindow(), L"Inline Hook:MessageBox", L"HOOK API", MB_OK);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
易语言HookAPI 技巧
易语言Hook的代码有很多,Hook的跳转代码也很简单,不多说,主要注意的有:
1.可以保存原API函数的API头到自己申请的地址,Hook跳转的地址仍然是自己的子程序,
但如果保存了API头,就可以call addr 实现不恢复Hook调用原函数。
.版本2
.如果真(FuncAddress =0 或HookFuncAddr =0)
返回(0)
.如果真结束
hHook =VirtualAlloc (0, 14, 位或(#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE)
.如果真(hHook =0)
返回(0)
.如果真结束
RtlMoveMemory_1 (hHook, 到字节集(FuncAddress), 4)
JmpCode =hHook +4
RtlMoveMemory (JmpCode, FuncAddress, 5)
RtlMoveMemory_1 (JmpCode +5, { 233 } +到字节集(到整数(FuncAddress + 5 -JmpCode -10)), 5)
VirtualProtect (FuncAddress, 5, #PAGE_EXECUTE_READWRITE, OldProtect)
RtlMoveMemory_1 (FuncAddress, { 233 } +到字节集(到整数(HookFuncAddr -FuncAddress -5)), 5)
VirtualProtect (FuncAddress, 5, OldProtect, 0)
返回(JmpCode)
2.Hook recv函数等的技巧,这类函数的特点是,某个参数是具有缓冲区性质的,并在函数
调用完成后参数会直接传递数据,所以结合上面的代码,就可以这样了:
ret=Call(jmpcode,para1,para2.etc)
这时候,再对参数para1等进行处理,才可以获得数据
3.Anti-Hook的躲避技巧,部分程序会有检测API头5字节,所以我们只需要在Hookaddr
上面加上一段偏移(大于5)即可躲避。
更深入地,如果检测的是整个API头,我们就需要深入API的调用过程,Hook核心函数或其他流程来躲避。
由于校验所有API头hash 值需要大量的CPU占用及时间,所以一般也只会对重点函数进行检测。