操作被占用的文件unlocker机理分析Word文件下载.docx
- 文档编号:6844145
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:18
- 大小:26.09KB
操作被占用的文件unlocker机理分析Word文件下载.docx
《操作被占用的文件unlocker机理分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作被占用的文件unlocker机理分析Word文件下载.docx(18页珍藏版)》请在冰点文库上搜索。
UnlockerAssistant.exe主要是实现系统托盘等辅助功能,同时安装钩子:
.text:
00403AC9
publicstart
00403AC9start:
//...
00403AD5
call
sub_40391E
跟进,能看到主要的实现代码:
00403925
sub_402E83
00403944
push
offsetLibFileName;
"
UnlockerHook.dll"
00403949
ds:
LoadLibraryA
0040398A
offsetProcName;
HookInstall"
00403994
edi;
GetProcAddress
注册窗口消息,初始化控件,安装钩子;
00403A1A
Shell_NotifyIconA
00403A20
sub_40359E
;
RegOpenKeyExA...
设置托盘图标,写入注册表启动项;
00403A69
offsets_Hookuninstall;
HookUninstall"
卸载钩子.
当然也有绿化版本只写入右键,这些大家自己看反汇编的代码,详细的钩子过程反汇编UnlockerHook.dll,也不再做纠缠.
我们只看UnlockerHook.dll里一处:
10001102sub_10001102
procnear
10001181
GetModuleFileNameW
1000118E
PathRemoveFileSpecW
100011A7
offsets_SUnlocker_exe;
\"
%s\\Unlocker.exe\"
"
100011E0
ShellExecuteExW
呼出主程序,进行文件处理.
[UnlockerDriver5.sys分析]
反汇编驱动文件,跳到入口点:
INIT:
00402000;
int__stdcallstart(PDRIVER_OBJECTDriverObject,int)
00402000
00402000start
procnear
0040203D
IoCreateDevice
004020E3
IoCreateSymbolicLink
上面就是DriverEntry了.注意这一段:
004020AB
mov
dwordptr[ecx],offsetloc_401000
004020B1
dwordptr[esi+40h],offsetloc_401000
004020B8
dwordptr[esi+44h],offsetsub_401090
004020BF
dwordptr[esi+48h],offsetloc_401020
004020C6
dwordptr[esi+34h],offsetsub_401240
经典的,处理MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeofPVOID)]等等.
我们跟踪这两个函数,先跟sub_401240,如下:
PAGE:
0040124D
RtlInitUnicodeString
00401257
IoDeleteSymbolicLink
00401265
IoDeleteDevice
很明显的DriverUnload函数;
接着跟sub_401090,这个函数就是类似于DispatchControl(IRP_MJ_DEVICE_CONTROL)了;
我们挑关键的看,RtlInitUnicodeString函数填充UNICODE_STRING结构就不多做纠缠:
004010FA
ObReferenceObjectByHandle
获取由句柄描述的对象的指针,也就是获取FILE_OBJECT对象;
这里,想想内核级文件的Read和Write,通过HANDLE执行就要先用ObReferenceObjectByHandle函数来获得Handle对应的FileObject,
然后我们再给FileObject发送IRP进行实质操作.
略过分配内存,接着往下走:
00401158
ObQueryNameString
这个函数将获取设备名,然后和FILE_OBJECT的FileName构成完整的名字返回(应用层在注册表中保存设备名+目录名);
00401214
ObfDereferenceObject
再一次调用ObfDereferenceObject,将对象的引用计数器恢复到先前的值,防止泄漏;
0040122D
IofCompleteRequest
MajorFunction[IRP_MJ_CLOSE*(sizeofPVOID)],完成操作.
回头看看这个驱动,实际上是很经典也很简单的驱动程序,实现的功能也很简单:
返回文件句柄对应的内核文件对象的完整名字,传给主程序进行文件"
删除"
移动"
等操作.
[Unlocker.exe分析]
直接跳到入口点:
004135FB
004135FBstart
00413607
sub_412EDC
跟进去,挑重点:
00412EEF
sub_40D1FF
命令行用法说明
00412EFC
sub_40D78C
查询注册表
00412F0C
offsetCaption;
Unlocker1.8.5"
00412F11
sub_413DEF
创建线程,网络升级,在线辅助
00412F1C
ecx,eax
00412F1E
sub_40FA79
这里开始!
=============================================================================
我把sub_40FA79列出来(有省略),如下:
0040FA79sub_40FA79
CODEXREF:
sub_412EDC+42p
0040FA79
ebx
0040FA7A
esi
0040FA7B
ntdll.dll"
0040FA82
0040FA8E
edi
0040FA8F
edi,ds:
GetProcAddress
0040FA95
ZwQuerySystemInformation"
0040FA9D
offsets_Zwqueryobject;
ZwQueryObject"
0040FAA7
offsets_Zwdeletefile;
ZwDeleteFile"
0040FAB2
offsets_Rtlinitunicod;
RtlInitUnicodeString"
0040FABD
offsets_Rtladjustpriv;
RtlAdjustPrivilege"
0040FAC8
offsets_Ntloaddriver;
NtLoadDriver"
0040FAD3
offsets_Ntunloaddrive;
NtUnloadDriver"
0040FAD8
ebx
hModule
0040FAD9
[esi+14h],eax
0040FADC
这一段的代码是unlocker的重点部分,获取ntdll.dll地址后,调用其中的函数:
1)ZwQuerySystemInformation函数获得系统当前所以进程的所建立的句柄及其相关信息;
2)ZwQueryObject获取句柄所代表对象信息,查出目标文件(设备名+目录名);
3)ZwDeleteFile删除目标文件;
4)NtLoadDriver加载驱动,当然还需要后面的注册表修改;
===========================================================================
再往下:
00412F9E
00412FAB
offsets_SUnlocker_cfg;
%s\\Unlocker.cfg"
00412FB5
wsprintfW
00412FC2
sub_40D3F4
跟进sub_40D3F4函数,发现作用是将驱动信息写入注册表;
00413008
dwordptr[eax+8];
lpFileName
0041300B
sub_410E28
004133E8
QueryDosDeviceA
004134B7
offsets_DeviceLanmanr;
\\Device\\LanmanRedirector"
004134BC
eax
LPWSTR
004134BD
[ebp+lpSrch],eax
004134C0
遍历查询DOS设备,进行重定向;
00413504
esi,ds:
DialogBoxParamA
0041350A
GetModuleHandleA
00413529
sub_411A59
//--->
getfullname
创建一个对话框窗口,显示所有枚举出的相关进程;
sub_411A59函数将获取对象文件的完整名,并返回,我们跟进去:
00411F63
dwordptr[esi];
dwProcessId
00411F65
OpenProcess
00411F6B
bInheritHandle
00411F6C
450h
dwDesiredAccess
00411F71
OpenProcess
之前是进程和模块遍历,找到相关联的所有进程和模块,OpenProcess打开需要操作的文件;
00411F93
GetCurrentProcess
00411FA2
DuplicateHandle
获取本地进程,将对象进程的句柄复制到本地进程(句柄进程相关);
00411FBB
offsets_?
Unlockerdriv;
\\\\?
\\UnlockerDriver5"
00411FC0
CreateFileW
将句柄发送给驱动程序,驱动将返回文件句柄对应的内核文件对象的完整名字;
[文件操作选择]
现在退出sub_411A59函数返回主线,我们走到这里:
00413536
cmp
byteptr[eax+3],0
0041353A
jz
shortloc_41357B
0041353A
0041353C
eax,cInitial
00413541
test
eax,eax
00413543
shortloc_413571
或者"
重命名"
操作;
00413543
00413545
xor
ebx,ebx
00413547
00413549
jbe
shortloc_41355F
操作
这里将进行文件处理的选择,是无动作?
删除?
还是移动?
重命名?
0041357B
0041357D
cInitial,ebx
00413583
shortloc_4135AE
cInitial存放的值代表当前的窗口是否为初始窗口;
a)
我们先看是派生窗口时的处理,loc_4135AE:
004135B5
offsetsub_412D62;
lpDialogFunc
00412DA4
[esp+800h+hDlg];
hDlg
00412DAB
sub_412371
//-->
toMoveFile
生成一个浏览对话框供选择路径保存文件:
004123AB
sub_410064
//--->
00410082
CoInitialize
004100D6
SHBrowseForFolderW
004100E4
SHGetPathFromIDListW
004100F4
CoUninitialize
//<
---
004123DE
PathIsDirectoryW
0041242C
GetSaveFileNameW
00412451
sub_4115AE
inject
实际上查看sub_412371这个函数的交叉引用(实际上你不用看引用也很容易就会发现),会发现:
00412478sub_412478
GuiControlDeal
这里是一个对话框,也就是我们右键unlocker时产生的界面,它将生成unlocker的主界面,
也将处理各种用户操作的消息,发给各个子程序去处理;
回到:
004135C7
esi;
DialogBoxParamA
004135CF
sub_410F86
MoveFile
由于cInitial值为0,所以此时必定是用户选择了"
或"
;
=========================================================================
跟进sub_410F86,看到:
00410F96
jnz
loc_4110C2
重命名
00411145
wsprintfW
00411173
SHFileOperationW
00411166
[ebp+FileOp.wFunc],4
ReName
text:
00411217
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作 被占 文件 unlocker 机理 分析
![提示](https://static.bingdoc.com/images/bang_tan.gif)