高分!寻找内核,驱动高手解决unlock文件!

yjgx007 2011-06-28 09:59:14
Windows操作系统,
通常用NtQuerySystemInformation找到所有当前打开的文件句柄,但这些文件句柄中并不包括映射文件句柄(Mapping File Handle),也就是用CreateFileMapping或LoadLibraryEx(DATA_FILE)形式加载的文件。

我的问题是:

1) 怎样找到映射文件句柄?
2) 怎样关闭映射文件句柄?

本主题涉及跨进程操作,也就是写出代码寻找其它进程中打开的映射文件句柄,并关闭它,达到解锁unlock相关文件。 不是在自身进程中写代码操作!

User mode 或 Kernel mode均可,先提前谢谢各位高手给出线索!
没有这方面经验的朋友,请勿跟帖,谢谢。
...全文
541 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
大光呢 2011-08-03
  • 打赏
  • 举报
回复
zhu6789888 2011-07-06
  • 打赏
  • 举报
回复
关注下
sophy520eangel 2011-07-05
  • 打赏
  • 举报
回复
NtQuerySystemInformation = HANDLE
NtQueryObjectXX ==oBJECT INFO
足球中国 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 zzz3265 的回复:]

软件是我编写的, 具体那步不清楚可以说
[/Quote]
我也写过类似的东西 。不过是用vb写的。
功能和你的差不多。
你那个转到注册的方法不太好。
regedit修改一个键。就可以直接打开到当前项了。我用卡巴跟踪出来的。
Yofoo 2011-06-30
  • 打赏
  • 举报
回复
软件是我编写的, 具体那步不清楚可以说
Yofoo 2011-06-30
  • 打赏
  • 举报
回复
http://download.csdn.net/source/3406862

这个工具有你想要的功能

1.左边进程信息
2.列表双击进程
3.选择内存区域, 找到文件映射, 右键关闭
Lactoferrin 2011-06-30
  • 打赏
  • 举报
回复
PROEXP完全是在用户模式完成的

int main()
{
MEMORY_BASIC_INFORMATION mbi;void*allocbase=(void*)-1;
char*p;wchar_t file[256];
for(p=0;(size_t)p<0x7ffeffff;p+=mbi.RegionSize)
{
if(!VirtualQueryEx((HANDLE)-1,p,&mbi,sizeof mbi))break;
if(mbi.AllocationBase==allocbase)continue;else allocbase=mbi.AllocationBase;
if(mbi.Type&(MEM_IMAGE|MEM_MAPPED))
{
if(GetMappedFileNameW((HANDLE)-1,allocbase,file,256))
wprintf(L"BaseAddress:%p\nFileName:%ws\n",allocbase,file);
}
}
getch();
return 0;
}
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lactoferrin 的回复:]

我说了可以用NtQueryVirtualMemory(或者VirtualQueryEx)遍历进程内存,procexp就是这样做的
[/Quote]
我要遍历的内存空间是在WINWORD.EXE(其它进程),这个方法很耗时,我想PROEXP应该是先得到SECTION_OBJECT(从全局系统section句柄),然后,找到基址和文件名的。
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zzz3265 的回复:]

列宁同志说的是内核方式
用户模式远线程可以FreeLibrary, UnmapViewOfFile

判断对象是否是Section
OBJECT_TYPE.ObjectTypeTag (==) 'Sect'

从Section得到路径用
SECTION_OBJECT.Segmen
->SEGMENT.ControlArea
->CONTROL_AREA.FilePointe……
[/Quote]
我试下你这个,看能否得到映射基址
Lactoferrin 2011-06-30
  • 打赏
  • 举报
回复
我说了可以用NtQueryVirtualMemory(或者VirtualQueryEx)遍历进程内存,procexp就是这样做的
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
参照PROEXP.EXE, 它可以快速地找到哪些Dll文件被加载到WINWORD.EXE进程中,同时,它还可以找到哪些数据文件被映射到WINWORD.EXE进程中,并得到映射基址(这个地址是在WINWORD.EXE进程中的虚拟地址),遍历进程的内存去找映射文件基址显然不是一个好的方法,太慢,有什么快速 的方法吗?
GetModuleFileNameEx只能得到加载的DLL,对于加载的映射文件是找不到的。
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
远程注入UnMapViewOfFile应该是可行的, 但我这个遍历内存的 方法不太稳定,有时能找到那个mapping file - test.doc,有时就不行, UnMapViewOfFile注入后, 文件确实被解锁了(同时还要关闭test.doc文件句柄和相应的Section句柄 - 通过NtQuerySystemInformation)。
Lactoferrin 2011-06-30
  • 打赏
  • 举报
回复
你这样试一下
打开文件,得到FILE_OBJECT地址
修改SectionObjectPointers
发送FileDispositionInformation的irp
关闭文件
恢复SectionObjectPointers
Lactoferrin 2011-06-30
  • 打赏
  • 举报
回复
你用procexp看一下winword还有没有那个文件句柄
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
我在qq上, 具体是这样的, 我用WINWORD.EXE(MS WORD 2003)打开一个文档test.doc, test.doc被锁定了, 原因是文件被打开了, 并且该文件test.doc作为映 射文件被映射进入WINWORD.EXE中, 现在, 我通过NTQuerySystemInformation找到这个文件句柄, 关闭了它, 但文件仍处于锁定状态, 于是我又找到这上面说的Section句柄, 也关闭了它, 还处于锁定状态, 另外,我试了上面的驱动方式赋值SECTION_OBJECT_POINTERS相关的指针为空发生蓝屏.

是的,我用另一种方法,去遍历WINWORD.EXE中的内存, 寻找每一页, 用GetMappedFileName找到那个test.doc的映射基址, 并且远程线程注入调用了UnMapViewOfFile解除了映射(WINWORD.EXE进程中), 这个函数和你的NT函数作用一样,我用PROEXP.EXE(一个进程查看工具), 看到加载的映射文件已经在列表中消失了, 说明远程注入调用UnMapViewOfFile已经成功, 但问题是, 该文件还是被锁定。

我试着传递Section的FILE_OBJECT指针进入驱动, 然后 , 赋空值给DataSectionObject和ImageSectionObject, 接着调用IRP请求删除文件(具体见上面帖中链接代码), 等待删除完成后, 重新还原DataSectionObject和ImageSectionObject指针(为防止蓝屏), 除了不蓝屏了,这个方法一点效果也没有, test.doc还是被锁定状态。
Lactoferrin 2011-06-30
  • 打赏
  • 举报
回复
外, 我做了个测试, 即使我调用UnmapviewOfFile解除映射, 这个文件仍然处于锁定状态.
你还得关闭section的句柄

用NtQueryVirtualMemory可以枚举某个进程所有的映射的section,找到要解除映射的用NtUnmapViewOfSection就行
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zzz3265 的回复:]

列宁同志说的是内核方式
用户模式远线程可以FreeLibrary, UnmapViewOfFile

判断对象是否是Section
OBJECT_TYPE.ObjectTypeTag (==) 'Sect'

从Section得到路径用
SECTION_OBJECT.Segmen
->SEGMENT.ControlArea
->CONTROL_AREA.FilePointe……
[/Quote]

你能告诉我怎么关闭文件映射吗? 如果我用UnmapviewOfFile, 关键是怎么找这个Base Address作为参数, 另外, 我做了个测试, 即使我调用UnmapviewOfFile解除映射, 这个文件仍然处于锁定状态.
Yofoo 2011-06-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/zzz3265/archive/2010/11/10/6000728.aspx
Lactoferrin 2011-06-30
  • 打赏
  • 举报
回复
这个不会的,文件映 射的基址都会在AllocationBase中出现
yjgx007 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 zzz3265 的回复:]

软件是我编写的, 具体那步不清楚可以说
[/Quote]
你这个ToolSet写得真不错, 有源码就更好了^^。我按你说的找到了test.doc文件映射,你怎么做到的,能帖出部分源码吗?你是不是也是遍历进程所有内存得到的?看起来你的程序找得很快。。多谢。
加载更多回复(19)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧