首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

[原创]Unlocker的编程”探险”及工作原理(已添加下载连接),该如何解决

2012-03-15 
[原创]Unlocker的编程”探险”及工作原理(已添加下载连接)Unlocker的编程”探险”及工作原理关键字:文件对象,N

[原创]Unlocker的编程”探险”及工作原理(已添加下载连接)
Unlocker的编程”探险”及工作原理

 关键字:文件对象,NT用户态,内核态


  Unlocker是偶写的一个文件解锁小工具,原来GUI用的是C# 2005编写,功能逻辑用的

是纯汇编加少量的C语言编写。现在为了不依赖于.Net Framework 平台,CUI用VB6.0

重写,而功能逻辑全部用C语言改写。





VB6对于GUI的快速开发以及”便携绿色化”还是比较优秀的一款工具,虽然他对漂亮

的XP皮肤支持有限(比如一些控件无法XP Skin化),甚至有些人会认为她是一款早已

过时的IDE,但目前来说,她还是可以很好的满足偶的需求,既然可以满足那么足以。

[PART0 : 关于文件解锁方法的浅谈]

NT下的文件解锁,我知道的主要有3种方法,我分别写了3个函数对应:

extern WINAPI int CloseHandleByDH(DWORD pid,HANDLE hfile);

extern WINAPI int CloseHandleByRT(DWORD pid,HANDLE hfile);

extern WINAPI int CloseHandleByCore(DWORD pid,HANDLE handle);





这些都是NT下编程中较基本的知识点,相信大多数Coder们看到这心中已经明白了。

  下面我逐一作简单说明:

1. CloseHandleByDH

使用DuplicateHandle的DUPLICATE_CLOSE_SOURCE 选项,该选项的作用是不但将源进

程中的对象句柄“拷贝”到目标进程(其实是将句柄指向Object的连接添加到目标进程

的对象表中。),而且同时关闭源进程中的对象句柄。

这种方法效果还是很好的,可以unlock大多数文件句柄,只要取得SE_DEBUG特权,

甚至连System进程中一些句柄都可以关闭。很多文件解锁工具用的都是这种方法。

 

2. CloseHandleByRT

这种方法的原理是向源进程中插入RemoteThread,同时将远线程的入口设置为
CloseHandle,并将源进程中要关闭的句柄传递给它。以前在汇编中我是写了一个
所谓的naked函数,还要在源进程中分配地址空间,然后将naked函数copy过去,
最后在该函数中调用CloseHandle。其实没这么复杂,对于只有一个参数的 ”知名” API,
完全可以用一个CreateRemoteThread搞定。但这种RemoteThread方法效果不是很好,
如果源进程不允许在用户态插入远线程(比如System,smss等),则这种方法就会失效。
RemoteThread效果大大不如第一种方法。

3. CloseHandleByCore

前两种方法对于有些内核对象来说没有效果-------原汤化原食,这时还得从内核

里想办法。所以有了CloseHandleByCore 方法。对于某些内核对象可以简单的在

Ring0中用ZwClose 关闭,然而另一些内核对象称之为PERMANENT对象,这种对象

要先使用ZwMakeTemporaryObject将其“转性”然后再将其关闭(但据偶观察还未见

到File类型的永久对象。)。然而在内核中做动作仍需小心,否则”必蓝”。这个问题

在后面还要提及。

 
以上列出了关闭句柄的几种方法,还没说如何获得活动文件对象的句柄表。偶用的

还是比较“正统”的NtQuerySystemInformation 方法,该函数返回系统中全部活动对

象的信息表,其中每一项结构定义如下:

typedef struct _SYSTEM_HANDLE_INFORMATION {

ULONG ProcessId;

UCHAR ObjectTypeNumber;

UCHAR Flags;

USHORT Handle;

PVOID Object;

ACCESS_MASK GrantedAccess;

}SYSTEM_HANDLE_INFORMATION,*PSYSTEM_HANDLE_INFORMATION;


为了便于VB与C的信息传递,偶定义了相关的OpenFile结构:

 

typedef struct _OPENED_FILE_INFO

{

char ProcessName[MAX_PATH]; //进程名全称

char FileName[MAX_PATH]; //文件全名称

HANDLE hFile; //文件句柄

DWORD PID; //进程ID

DWORD Flags; //句柄标志

DWORD GrantedAccess; //句柄访问授权

PVOID Object; //对象体指针

int CurrentIndex; //当前句柄项在句柄表中的索引

}OPENED_FILE_INFO,*POPENED_FILE_INFO;

 

VB6中与其定义的结构是:


Type OPENED_FILE_INFO

ProcessName As String * MAX_PATH

FileName As String * MAX_PATH

hfile As Long

pid As Long

Flags As Long

GrantedAccess As Long

Object As Long

CurrentIndex As Long

End Type



[PART1 : 一个内核态中的严重漏洞!]

在用户模式(UserMode)中,使用不到Object对象指针,但在内核中往往需要传递Object

去完成某些操作。这本来也无可厚非,但有一个严重的漏洞存在:

 

在内核中使用该Object时不能确保它是否还处在有效状态!

 

前面用NtQuerySystemInformation 取得系统句柄表,只是系统在某个时间段里的“快照”,

谁也没有保证这些句柄和对象在后面仍然有效!如果我们在Ring3级中引用一个失效

的句柄,那顶多也就返回无效句柄之类的错误。但在Ring0级则情况大有不同,在内

核态(KernelMode)中引用任何无效的内存都有可能引发“严重问题”。在编码过程中

我发现即使ObReferenceObjectByPointer之类的函数返回 STATUS_SUCCESS ,仍不

能确保该对象是一个有效对象,貌似ObReferenceObjectByPointer 不管三七二十一,



只是简单的将对象头(Object_Header)结构中的PointerCount值加1。

经过若干次的“蓝屏”,用Softice总结如下:

 

若文件对象的引用计数和句柄计数都为零,则基本上可以确定该对象已不

存在了。为了保险系数更高,我又增加判定第3个条件:对象的Type

字段总为0xBAD0????。通过这3点,则可保证该对象已OVER!不用再处理了!

(其实这也不是所谓的“数学证明”式的保证。虽然在各个系统上2K,

XP-SP2,XP-SP3,2K3-SP2 都没有出问题,但我因未查NT源码,也不敢拍着胸

脯说在各位的系统上不会出问题,如果我的“保证”哪里有错误,请毫不

犹豫的指出,谢谢!)即有:

C/C++ code
if(poh->PointerCount == 0 &&\            poh->u0.HandleCount == 0 &&\            (DWORD)(poh->Type)>>16 == 0xBAD0)        {            DbgPrint("[%s] Bad Object!\n",__func__);            //__asm("int $3");        }




[解决办法]
mark
[解决办法]
唯顶。
[解决办法]
侯佩 额滴神.....
[解决办法]
严重MARK
[解决办法]
很好,继续。
[解决办法]
以前我还想写一个呢....
 一直没闹明白原理..
谢谢啦...拜读
mark
[解决办法]
mark
[解决办法]
难啊.
[解决办法]
膜拜
[解决办法]
学习
[解决办法]
呵呵,要的就是这条渔~!感谢楼主。
[解决办法]
什么东东,这么多
[解决办法]
很好,很强大啊
[解决办法]
mark
[解决办法]
不错~~支持哦。。

对于part1
有没使用异常处理和MmIsAddressValid 呢?

对于part2
不建议使用该方法,因为没办法保证有代码引用该对象

对于part3
CoreGetFileName在多核下可能会有问题,提升IRQL只能在单核上实现同步。

[解决办法]
谢谢LZ,太好了,我正在开始学VC,虽然对我来说内容有点深,但先收藏,相信总有一天能看懂。
[解决办法]
额滴婶婶 楼主原来是侯佩呀 膜拜膜拜
[解决办法]
顶顶
先mark一下
[解决办法]
其实我看了第一句话就已经拜倒了~~~
偶像啊~~~

说一个我使用时候的一个小发现,有次朋友有台机器中病毒了,生成了很多删不掉的问题,没办法只要清楚unlocker,但是unlocker没有报告有锁定,因为文件比较多而且很大,总共有4g左右,但是好像删了很久。。。。>24h。。。
请大大看看是什么问题造成的。

[解决办法]
收藏
[解决办法]
晕死我博客上这文章好多
[解决办法]
探讨
引用:
额滴婶婶 楼主原来是侯佩呀 膜拜膜拜

不至于吧?受宠若惊啊!呵呵

[解决办法]
不得不顶~

[解决办法]
学习、标记
标记、学习

帮顶。
[解决办法]
楼主牛人一个!进来学习!实在佩服!
[解决办法]
lz辛苦了,支持一下
[解决办法]
功能应该也可用VB实现吧,貌似陈辉那里有的。
[解决办法]
好像在看雪看过?


[解决办法]
我也在研究
[解决办法]
ZY 并且 学习..
[解决办法]
111 

[解决办法]
好文,多谢大侠,有空试一下!
[解决办法]
好东西啊!
会汇编的,我认为都是高手,哈哈~~~
[解决办法]
顶。。。
[解决办法]
好东西。测试下实际杀毒工作中效果怎么样。谢谢。。PS..下载速度有点慢..IXIX.
[解决办法]
意见1.不能多选.每次只能关闭一个.

2.关闭句柄后再次打开次文件.无法重新搜索出.

3.查找框只支持10个字符.
[解决办法]
4.无法显示锁定文件的进程或线程.
不过删除蛮好用的.谢谢了.有环境了继续测试.
[解决办法]
IT'S VERY USERFUL...
[解决办法]
强人
[解决办法]

[解决办法]

探讨
引用:
额滴婶婶 楼主原来是侯佩呀 膜拜膜拜

不至于吧?受宠若惊啊!呵呵

[解决办法]
如何 做到 GUI用VB, 逻辑算法等代码用 c/c++的? 一直没搞明白两种语言的东西怎么融合在一起的

难道是用DLL或者COM么
[解决办法]
支持LZ。。。
[解决办法]
留名 改天
[解决办法]
强啊
[解决办法]

[解决办法]
Mark 下,好细看
[解决办法]
mark
[解决办法]
mark
[解决办法]
哇 厉害 unloaker可是好工具

[解决办法]
相当MARK!!!!
[解决办法]
up
[解决办法]
太深奥了,看不懂,能否告诉我
知道一个文件名,如果它删不掉,会提示有其它程序占用它,请问,怎么知道到底是什么程序占用它?
[解决办法]
郁闷,搜索filename竟然搜不到,首先我想搜explorer,说搜不到,然后我想输入explorer.exe,竟然输不了那么长,然后我输入bcb.exe,还是搜不到,为什么呀?


[解决办法]
收藏~~
[解决办法]
什么东东哦
[解决办法]
留名 学习
[解决办法]
谢谢分享
[解决办法]
好东西.
[解决办法]
严重mark之.
[解决办法]
mark
[解决办法]
学习。。
[解决办法]
about对话框真够山寨的...
[解决办法]
NB
[解决办法]
unlocker原来是你写的???
太牛了
我一直用啊
很好用
[解决办法]
只为膜拜lz而来
[解决办法]
mark
[解决办法]
UP
[解决办法]
请问这个 Unlocker 跟 http://ccollomb.free.fr/unlocker 是一个东西吗?
[解决办法]
楼主 这个很好 很强大 学习中
[解决办法]
偶顶偶顶~祝愿毛主席身体健康!
[解决办法]
不错不错, 支持!
[解决办法]
ddddddddddddddddddddddddddddddddd
[解决办法]
顶!!!!!!!!!!!!!!!!!!
[解决办法]
回帖是一种美德!传说每天回帖即可获得 10 分可用分
[解决办法]
不懂是干嘛的
我的目标是 ---->

^_^
[解决办法]
还以为是那个著名的unlocker...........
[解决办法]
mark...
[解决办法]

探讨
引用:
引用:
版主也是人,他们没拿工资,为什么要为你服务?

他们是为CSDN服务的

各位版主的奴才意识相当到位...............

这鸟人真是已贱到了无可复加....
看来我不日你妈你都不知道谁是你爹了.

[解决办法]
很不错 ,能下源码么
[解决办法]
学习中...
[解决办法]
mark..

热点排行