mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
阅读:2668回复:17

从驱动往应用程序传数据的问题

楼主#
更多 发布于:2007-07-31 17:53
我用DeviceIoControl里面定义的输出buffer的方法从驱动向应用传数据,直接
往输出buffer里面写入数据就没问题,要是从驱动一个变量里面strcpy就蓝屏重起,帮忙看看吧
ResultStatus = ObReferenceObjectByHandle(ProcessHandle,PROCESS_ALL_ACCESS,*PsProcessType,UserMode,(PVOID)&process,(PVOID)&info);

DBGPRINT(("%s"),process->ImageFileName ) 这个能打出来,这是个UCHAR[16]的变量
//strcpy(buff,"test")  这样就没问题 , buffer是外面传进来的buffer
strcpy(buff,process->ImageFileName);    这个就蓝屏,不止是这样,任何读imagefilename的操作
都会BSOD,这是怎么回事啊


已经蓝了无数次了,各位帮帮忙吧
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-31 20:14
查了网上一些说法,好像说是需要zwreadvirtualmemory才能读出这个变量阿,不太明白,不过我
的环境是xp,好像这个函数已经不支持了阿,有什么替代的函数吗,谢谢
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-08-01 12:23
process->ImageFileName如果不以0结尾,strcpy可能因为越界,而导致蓝屏. 检查一下.
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-01 17:27
不是越界的问题吧
我这样赋值都不行啊
char a;
a = process->ImageFileName[0];
bladellz
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望121点
  • 贡献值0点
  • 好评度120点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-02 11:26
if(buffer!=NULL)
Odyssey
驱动小牛
驱动小牛
  • 注册日期2004-12-15
  • 最后登录2008-03-29
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望115点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-02 12:11
没有用debugger跟一下啊?minidump呢?
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-08-02 14:02
RtlCopyMemory试试
实用信息:www.infozobo.com
jackiefzj
驱动牛犊
驱动牛犊
  • 注册日期2004-10-28
  • 最后登录2024-03-01
  • 粉丝0
  • 关注0
  • 积分495分
  • 威望135点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-08-02 16:03
Attach到ProcessHandle进程了吧。。。注意一下DeviceIoControl时的进程上下文,你Attach到其他进程,写DeviceIoControl进程的虚拟地址,肯定会出错
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-08-02 17:29
感觉好像就是jackiefzj说的问题,在hook ntcreateprocess的时候,里面的代码似乎是在创建的进程上执行的吧,不太懂,感觉上好像是这样,那怎么解决阿,我见过有人说nwreadvirtualmemory好像管用什么的,但是这个函数在xp的kernel库没有导出阿,jackiefzj有什么办法解决吗
jackiefzj
驱动牛犊
驱动牛犊
  • 注册日期2004-10-28
  • 最后登录2024-03-01
  • 粉丝0
  • 关注0
  • 积分495分
  • 威望135点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2007-08-02 17:50
hook NtCreateProcess?没明白。。。取ImageFileName应该在NtCreateProcess()内,应用层读ImageFileName应该在DeviceIoControl内。
你怎么把ImageFileName直接copy到Irp->UserBuffer里的?
中间应该有一个变量临时保存的一下吧?注意分配这个变量时,用NonPagedPool
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2007-08-02 17:51
你读的不是eprocess->ImageFileName?这个是在内核中的,不存在你说的问题.
如果要访问,其他进程的用户空间,要attach 到那个进程去,在访问.
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-08-03 09:53
我说一下目前解决的情况

1.ntcreateprocess里面无论怎么调用这个eprocess,都没问题,
2.ntterminateprocess里面一访问这个eprocess就死掉(dbgprint没问题),而且传入的processid是一个空值,搞不清楚系统是怎么处理这个空值还能找到对应的eprocess的,最后发现用
PsGetCurrentProcess得到的eprocess能读出来。还是有个问题,比如我要是启动notepad.exe在关闭,关闭的时候取出来的是正确的notepad.exe,但是如果在程序里面用api启动关闭notepad.exe,关闭的时候取出来的是调用程序.exe。反正先将就着用吧
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2007-08-03 10:24
对于ntterminateprocess
1.,如果是进程自己退出,exitprocess,调用ntterminateprocess的时候handle为0,表示是当前进程退出,调用PsGetCurrentProcess可以取得eprocess的imagefilename
2.如果是A进程调用TerminateProcess 结束B进程,PsGetCurrentProcess是A进程.
如果想取得B进程的ImageFileName,可以ObReferenceObjectByHandle从handle获得
B的eprocess.
jackiefzj
驱动牛犊
驱动牛犊
  • 注册日期2004-10-28
  • 最后登录2024-03-01
  • 粉丝0
  • 关注0
  • 积分495分
  • 威望135点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2007-08-03 10:26
ntterminateprocess中,PsGetCurrentProcess取出的父进程,也就是操作进程。你点notepad.exe关闭按钮,实际上是自己关闭自己,取出来虽然还是notepad,但其实意义是不一样的。

再给你总结一下
要取操作进程,直接PsGetCurrentProcess()
要取目标进程,就ObReferenceObjectByHandle -> ProcessHandle,由于你当前进程上下文在操作进程内,所以取出EProcess后,还要KeAttachProcess(EProcess)过去

KeAttachProcess(EProcess);    //切换到目标context

nameptr   = (PCHAR)EProcess + g_ProcessNameOffset;
strncpy( ProcessName, nameptr, 16 );
ProcessName[16] = 0; /* NULL at end */
        
KeDetachProcess();    //切回原context

再多嘴一句,进程监视,PsSetCreateProcessNotifyRoutine是正道
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2007-08-03 11:05
eprocess都在内核空间,不需要KeAttachProcess
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-08-03 13:36
多谢zhaock 斑竹以及jackiefzj大虾,困扰多日的问题解决了
另外试验的结果如版主所说确实不需要attatch

现在还有一个小问题,就是我从eprocess取出来的imagefilename变量(uchar[16])如果
是中文名称的情况下就不对了,但是这个变量好像又不是unicode的,不知道怎样能正确
地读出来哪。
fox1999
驱动牛犊
驱动牛犊
  • 注册日期2006-04-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度82点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-08-03 15:57
如何解決的? 不過應該用 RtlCopyMemory.
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2007-08-03 16:40
我只是测试中路过的...
人不靓仔心灵美,版头不正红花仔!
游客

返回顶部