应用背景是收集指定进程运行中产生的API调用情况,不需要很具体,只要收集到调用序列即可,用于对进程异常检测。然而现在流行的资料大部分是关于对单个API函数的Hooking,无法用到本情况中。原来也找到一个Yariv Kaplan编写的软件APISpy32,满足本应用,可惜不知道它具体是如何实现的。不知哪位大侠能够提供相关资料,或指点迷津说明具体实现方法。
我的一个想法是既然NTdll.dll是从用户态到内核态的统一入口,能否在此处对特定进程的API进行截获。但我不知道如何实现之。望赐教。
我的一个想法是既然NTdll.dll是从用户态到内核态的统一入口,能否在此处对特定进程的API进行截获。但我不知道如何实现之。望赐教。
解决方案 »
- Link错误,请大家帮忙 SOP_SendSocks5Req(unsigned int,unsigned char,unsigned char,char con
- 链接错误
- 一个通过串口实现多设备远程同时控制的想法希望大家指点,讨论
- 数据度取问题
- 请问是否能强行关闭其他进程打开淂端口! 如果能如何实现
- 怎样用编辑控件显示一个数组
- 关于CDC::SelectObject位图
- 98下的串口访问方法,在2000下怎么不能用了???请教高手和各路英雄
- 毕业一年一直在用C最近牛刀小试做了个功能颇全面的鼠标点击器给大家献丑了
- CSocket里Accept()报"unhandled exception“错
- mysqlpp::Row给string类型的变量赋值时出错
- 急!!!大家帮我看看我写的动态加载dll的文件有什么问题?
http://topic.csdn.net/t/20050228/09/3810963.html
一种方法是hook所有的NT开头的函数;
一种是hook INT 2e 指令,patch INT 2e指令地址的内容,让程序执行到INT 2e时先jmp到自己的hook函数,在自己的hook函数中得到eax中的值(也就是SSDT中服务索引号),再根据索引号和系统服务的对应关系就可以找到函数名。
第一种方法好像是不可完成的任务,而且貌似除了NT开头的,还有其他开头的吧。
第二种方法的话,看起来可以。
只是我对hook的具体实现还不是很明白,一般都是Hook一个API函数吧,难道还可以只hook一条指令么。
另外我想寻觅还有没有更简单的方法,我觉得能不能从NTDll.dll的入口就进行截获,
在用户态处理起来更容易一些吧,那么得到的就应该只是尚未执行的函数名吧。
宇宙骑士,我觉得你的方法已经进入到内核态了,并且似乎饶了一下弯。
我用过APISpy32,它就能截获全局的API调用,并且能显示出用户态API的函数名和参数,挺好的。
网址是http://www.internals.com ,大家可以试试看。
不知道还有没有其他的实现方法么?
如果只考虑NT函数,这种方法就是可以的。我在网上碰见过NtSpy,就是采用相似的方法http://cmp.phys.msu.su:8000/ntclub/pub/ntspy.html
entry_1: CALL bridge_entry
entry_2: CALL bridge_entry
entry_3: CALL bridge_entry
....
entry_n: CALL bridge_entry
bridge_entry: CALL bridge_entry_2
bridge_entry_2: CALL c_hook_function其中:entry1...entryn对应替换IAT中各个api的入口函数,c_hook_function可以是用c/c++写的实现你目的的函数,声明可以是这样:void __stdcall c_hook_function( unsigned long offset1, unsigned long offset2);
(offset1 - offset2) / sizeof(unsigned long) 就是原始IAT中第几个API产生的调用(从尾部算起), 原始参数在(&offset2)[2]位置开始处, 如果你存储了各api相关参数描述的话你也可以通过查表实现列出所有被调用api的函数名,所在dll(这个import table里就有), 甚至参数列表。
注意一点,当你处理完后, 不能直接return退出c_hook_function, 必须用一小段汇编代码将原始API入口(可以从保存的原始IAT表中根据刚才算出的下标获得)作为c_hook_function的返回地址压入堆栈相应位置,这样当c_hook_function返回时就相当于直接调用了原始api。如果想截获目标程序所有api调用的话,除了上面所说的,对loadlibrary和getprocaddress要进行单独的hook处理,这样就可以通过它们hook并跟踪目标程序动态加载调用的api了。
调试API的方法可能不适用本情况,因为效率太低,况且我看资料上说debugger关闭后会将被调试程序也关闭。
12楼的哥们,我还真看过你说的那本书,而且就是通过它才找到APISpy32这个软件的。挺好的一本书,可惜讲
的什么都忘了。
PE结构还不是很懂,正在饿补当中。
基本上我打算从截获INT 2EH中断和修改IAT两者中选取一种来实行。
同时我还有一些问题。一个是修改IAT方法对系统进程诸如lsass.exe、svchost.exe等有效么。还有就是IAT是
只读的么,能否修改呢,并且修改后的代码放在何处呢,如何保证进程执行时能够自动动态加载。
Ivo Ivanov. 《API Hooking Revealed》http://www.codeproject.com/KB/system/hooksys.aspx 修改IAT方法讲的还算清楚。
高 岩, 蒋若江. 《主机防护系统中系统调用截获机制的实现》截获INT 2EH中断讲的很清楚。
梁肇新的《编程高手箴言》,不仅讲如何成为好的程序员,PE文件结构也讲的相当详细。
最后谢谢大家给的这么多建议!