xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2014回复:19

如何判断一个文件要执行?(2000+sp4)

楼主#
更多 发布于:2005-04-12 13:41
各位大虾:
   如何判断一个文件要执行?irpsp->parameters.create.securitycontext->desiredaccess这个值足够吗?如何与一个读文件属性的irp区分?要在完成例程中作吗?请大哥们指教!

最新喜欢:

tmx21tmx21
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-04-13 16:31
郁闷。。。。。。。。
自己顶
zhjie374
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2012-01-17
  • 粉丝2
  • 关注1
  • 积分17分
  • 威望144点
  • 贡献值1点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-14 09:13
什么叫要执行?
被任何程序打开?读写??
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-04-14 10:10
举个例子:我双击一个exe文件,这时候我的驱动收到了几个irp.
其中最关键的是一个由createprocessw操作引起的。但对文件读属性也会在驱动中收到一模一样的irp,我想问的是,有没有办法在irp中区分他们?
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地下室#
发布于:2005-04-15 03:35
I don\'t think you can get it by simply intercepting MJ_CREATE.

Double-click in Explorer means nothing to Kernel. It\'s simply explorer\'s feature.
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-15 09:24
你在www.codeproject.com上搜索一下,有篇文章就是关于这些的,关键词hook api,我前几天还看到过,很可惜,我没有记录URL,祝你好运
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
6楼#
发布于:2005-04-15 09:55
可以用psxxx函数,知道系统创建进程。然后你再想办法得到该进程的对应文件地址,剩下的就好办了

psNotifyxxx
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-04-15 16:32
楼上说的是注册一个回呼函数?我试过,当系统创建成功才会调用这个函数。唉,晚了。你们可以试一下,用filemon跟踪,创建一个文件都会收到那些irp,观察堆栈可以知道哪个irp是真正要执行的irp.
可我就是找不到他们之间在传入的irp上有什么区别?
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-15 22:51
可以HOOK ZwCreateSection实现,函数原型如下:

NTSYSAPI
NTSTATUS
NTAPI
ZwCreateSection(
    OUT PHANDLE SectionHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PLARGE_INTEGER SectionSize OPTIONAL,
    IN ULONG Protect,
    IN ULONG Attributes,
    IN HANDLE FileHandle
);

判断参数Protect,如果参数中有PAGE_EXECUTE_XXX代表要执行一个文件。
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2005-04-18 13:48
这种方法我试过,但老板不同意。而且据我所知,2003 64位的os不支持hook方法,这样只能解决一时的问题,到最后还是要头疼。我只想通过filter driver 的方式,在irp中判断,不只各位大虾有什么主意没有?
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2005-04-20 13:15
大虾们给想想办法啊!逼得我都快要撞显示器了!
有什么思路也行啊!
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2005-04-22 10:56
等待中。。。。。。。。。。。。
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-04-24 10:56
先判断irpsp->parameters.create.securitycontext->desiredaccess&FILE_EXECUTE,然后溯栈,如果发起者是CreateProcessW,就肯定是执行打开了,非常麻烦
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2005-04-25 13:47
楼上这位大侠,溯栈怎么做?能详细一点给出算法吗?
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-04-25 17:11
只是一个想法,根据EBP就能溯回去,问题在于从USER到KERNEL的跳转(INT 2E),不知道该怎么溯回去
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2005-04-25 19:18
楼上的大哥,据我跟踪,createprocessw在堆栈,而且irpsp->parameters.create.securitycontext->desiredaccess&FILE_EXECUTE为真也不能肯定是一个程序要执行啊。只是说一个程序要执行,堆栈里肯定有他,但反过来就不一定对了
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-04-26 09:40
createprocessw肯定会调用ZwCreateFile ,调用的地址在同一个操作系统中地址范围是固定,如果回溯到IRP_MJ_CREATE是ZwCreateFile 发起的,且ZwCreateFile 被调用的地址落在createprocessw地址范围内,基本就能确定是执行了.

这是我的想法
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2005-04-26 11:42
不是吧?举个例子,双击执行桌面上的一个可执行程序,softice断不到zwcreatefile,而是ntopenfile和iocreatefile在堆栈中出现?
到底执行一个文件时,都发生了什么事?
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-04-26 13:53
我搞错了,应该是CreateProcessW调用 ZwOpenFile,ZwOpenFile通过系统功能调用进去内核,调用NtOpenFile,NtOpenFile调用IoCreateFile

如果做一个文件系统filter,在IRP_MJ_CREATE处,如果
irpsp->parameters.create.securitycontext->desiredaccess&FILE_EXECUTE,进行溯栈,如果发现有RetEIP落在
CreateProcessW范围内,基本就能认为是执行打开了,这只是我一个不成熟的想法,有空研究一下
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2005-04-27 14:18
谢谢众家哥哥。虽然问题还时没解决。
游客

返回顶部