首页
社区
课程
招聘
6
[旧帖] [原创]API HOOK 0.00雪花
发表于: 2011-9-25 19:28 4501

[旧帖] [原创]API HOOK 0.00雪花

2011-9-25 19:28
4501

第一次写文章,希望各位大侠,牛人体谅,呵。


API HOOK 是个好古老的话题了,但作为一个不懂算入门没有的新手,也只能从这些基本的学起。HOOK API的作用主要是在原程序调用API是首先进入自己的处理过程,对调用结果进程一定处理后再按自己意愿返回。如比较经典的封包助手,就是HOOK了系统的SOCKET的recv函数,把包显示出来再调用返回给应用处理。



OK,下面我要HOOK的是EnumProcesses ,钩API有几种方式:



1.API实现函数内钩,起作用范围广,对进程内所有位置内包括远程注入线程调用均有效。但钩的位置要比较猥琐才行,一般的会选择头几字节来钩,但说实在的,做一个简单的内存校验就可以发现被钩了。一般是选择中间位置来钩,或钩更下层的API,如GetProcAddress这个,它会调用LdrGetProcedureAddress这个API,所以可以选择钩这个,但要注意处理堆栈。当然,原应用做内存检测的话,还是逃不过被检测的命运的。



2.可以在API调用位置上下钩,作用范围仅在于当前调用处有效,假如程序在另一地方有调用API则是钩不到的。严格来说这不算是钩API了,和一般的内联hook差不多。但在某些场合还是比较有用的。



3.可以修改IAT表,作用范围仅在当前模块,这种方式比较常用,当然要小心原程序调用GetProcAddress来检查:



if [IATBase] != GetProcAddress(APIName)



{



    cout<<" 你的钩子被发现了   你的计算机即在10s内发生'砰'......................";



}



下面说下HOOK  EnumProcesses过程,选用IAT HOOK,操作系统为win server03.先查MSDN,实现语言是Delphi。先看函数的原型:



BOOL WINAPI EnumProcesses(


  __out         DWORD* pProcessIds,


  __in          DWORD cb,


  __out         DWORD* pBytesReturned


);看解释可以知道,第一个参数是一个进程ID数组指针,即返回当前系统的所有进程的ID,第二个参数是这个数组的长度,注意它是按字节算的,这个参数一般可以用SizeOf(array)来传入,因为SizeOf获取的是数组的字节长度。第三个参数是返回的数据长度,也是按字节计算,即获取的进程个数实际上是(pBytesReturned*)/SizeOf(DWORD);好了,下面再看看实际调用的汇编代码:



压栈顺序是从右至左,然后跟进这个CALL:



这个就是它的输入表的位置了,看看它的基址是:0x00B2C700 .这个地址下面的值就是EnumProcesses的真正地址了:



为什么要有IAT表呢?因为DLL载入内存需要重定位的,会把真正的API地址放入这个基址下面。嗯,接下来的工作就简单了,我们把0x00B2C700这个地址下一值改成我们自己的处理函数就行了。我们要先写一个函数过程,注意参数要和原API一致。至于类型,一般来说WIN下的API都是指针操作,所以一般用DWORD就可以了,你自己的函数内使用时要记住它是指针就行。先复制代码:


///


/// EnumProcesses的过滤处理过程


/// 可以修改输出的结果


///


/// 输出参数:进程ID数组指针


/// 进程ID数组的初始化长度,以byte为单位


/// 输出参数:返回的数据大小,以byte为单位


/// 原API的处理结果,也压入,通过这个过程返回给原应用调用者


///


function MYEnumProcessesFilter(pProcessIds: DWORD; cb: DWORD; pBytesReturned: DWORD; res: DWORD): DWORD; stdcall;


begin   


        Result:=res;       


end;



///


/// 自己的EnumProcesses处理过程


///


/// 输出参数:进程ID数组指针


/// 进程ID数组的初始化长度,以byte为单位


/// 输出参数:返回的数据大小,以byte为单位


///


function MyEnumProcesses(pProcessIds: DWORD; cb: DWORD; pBytesReturned: DWORD): Integer; stdcall;


asm


    push pBytesReturned


    push cb


    push pProcessIds


    mov eax,EnumProcesseApiAddr


    call eax


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

上传的附件:
  • 1.jpg (24.14kb,361次下载)
  • 2.jpg (37.40kb,361次下载)
  • 3.jpg (56.28kb,360次下载)
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 02:23
心游尘世外
为你点赞~
2024-3-7 04:47
飘零丶
为你点赞~
2024-2-28 00:33
QinBeast
为你点赞~
2024-2-6 00:21
shinratensei
为你点赞~
2024-1-24 00:43
PLEBFE
为你点赞~
2023-3-7 00:51
最新回复 (6)
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
2
WIN764位HOOK很不好处理,烦!
2011-9-25 20:27
0
雪    币: 136
活跃值: (220)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
c#a

强大
2011-9-25 21:13
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢LZ了,LZ写的很中肯哈
其实个人觉得还是inline的hook比较保险~~
不过LZ这也说过了,只要一检查就~~
2011-9-25 23:08
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haw
5
菜鸟学习了!
2011-9-26 08:29
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
来学习了,谢谢楼主
2011-9-26 09:49
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
菜鸟学习了!
2011-9-27 15:36
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册