一个简单的文件夹映射文件夹工具工作原理的简单分析
from:http://www.unpack.cn/viewthread.php?tid=47463
【文章标题】: 一个简单的文件夹映射文件夹工具工作原理的简单分析
【文章作者】: ucantseeme
【软件名称】: junction.exe
【软件大小】: 93.3K
【下载地址】:
【保护方式】: 无
【操作平台】: 仅测试过XP,其他未知
【软件介绍】: 此工具提供文件夹映射文件夹的功能
【作者声明】: 阅读本文需要一些基础的汇编知识,跟API相关知识,转载请保证全文完整性
【学习目的】: 看看如何实现文件夹映射文件夹的功能
------------------------------------------------------------------------------------------
【详细过程】
1,先来说说前言,对不起,前言有点长。
首先说说这个文件夹映射文件夹是怎么一回事:简单的说来就是,操作这个文件夹中的内容,就等于操作另一个被映射的文件夹,操作另一个也就等于操作这个,操作这一个也就等于操作另一个。。。
其次我们知道本身windows操作系统就提供了一个叫“驱动器挂载点”的功能。这其实就是个文件夹映射磁盘分区的功能。具体
操作方式见下图:
先来到磁盘管理这个地方,如图1,选更改驱动器名和路径
然后来到图2的位置,点添加,在弹出新的窗口里面浏览一个空的文件夹便可完成映射
这样就完成文件夹映射分区了,除此之外,还有其他的方法,比如编程中可以用SetVolumeMountPoint的API来设置。
但是在实际生活应用中,我发现我需要文件夹映射到文件夹的功能。有了这个需求我就找啊找,终于找到了一款名叫junction的小工具
接下来我必须介绍此软件如何使用
从CMD打开此程序,可以看到使用说明,在CMD里面输入图中口令,按回车后,便会提示建立映射成功,如图3
2,好,介绍到一段落,开始分析。
本身操作系统没有提供文件夹映射文件夹的功能,我就对这个不到100K的小软件比较感兴趣,于是随便看了下,我们的目的很明确,就是看看怎么样文件夹映射文件夹的,其他的比如什么出错判断啊,撤销映射啊,统统不管他,首先就应该定位到关键代码处
代码如下:
首先OD从这个地方载入,并且输入参数,注意参数中不用加junction的文件名啦,直接两个文件夹路径,如图4
载入后看看OEP,感觉像Visual studio 200X编译的,不确定,不用管他
- 0040406C > $ E8 1C4B0000 call 00408B8D ; OEP
- 00404071 .^ E9 41FEFFFF jmp 00403EB7
- 00402890 /$ 81EC 1C040000 sub esp, 41C ; Main
- 00402896 |. A1 C0204100 mov eax, dword ptr [4120C0]
- 0040289B |. 33C4 xor eax, esp
- 0040289D |. 898424 180400>mov dword ptr [esp+418], eax
- 004028A4 |. 53 push ebx
- 004028A5 |. 55 push ebp
- 004028A6 |. 57 push edi
- 004028A7 |. 8BBC24 300400>mov edi, dword ptr [esp+430]
- 004028AE |. 33ED xor ebp, ebp
- 00402940 |. /0F8E BE010000 jle 00402B04
- 00402946 |> |8B14B7 /mov edx, dword ptr [edi+esi*4] ; 取参数指针
- 00402949 |. |68 6CF14000 |push 0040F16C ; UNICODE "/s"
- 0040294E |. |52 |push edx
- 0040294F |. |E8 D5090000 |call 00403329
- 00402954 |. |83C4 08 |add esp, 8
- (此处中间省去大量代码)
- 00402A5B |. |C605 28304100>|mov byte ptr [413028], 1
- 00402A62 |. |75 2D |jnz short 00402A91
- 00402A64 |> |83C6 01 |add esi, 1
- 00402A67 |. |3BB424 300400>|cmp esi, dword ptr [esp+430]
- 00402A6E |.^|0F8C D2FEFFFF \jl 00402946
- 00402A74 |. 8B4424 10 mov eax, dword ptr [esp+10]
- 00402A78 |. 85C0 test eax, eax
- 00402A7A |. 74 25 je short 00402AA1
- 00402A7C |. 8B0C87 mov ecx, dword ptr [edi+eax*4] ; 取参二
- 00402A7F |. 8B14AF mov edx, dword ptr [edi+ebp*4] ; 取参一
- 00402A82 |. 51 push ecx
- 00402A83 |. 52 push edx
- 00402A84 |. E8 17FAFFFF call 004024A0 ; 关键,所有东西都在里面,当然是F7
- 00402A89 |. 83C4 08 add esp, 8
- 00402A8C |. E9 C0000000 jmp 00402B51
进入了call 004024A0这句以后一路F8,还是那句话,只要你的参数没错,就会来到这个地方,有两个API,一个是CreateDirectory,另一个是CreateFile,其中CreateDirectory的Path参数就是你输入的参数一的路径,上面图3也说过了,软件会自己创建目录,也就这创建的,创建好以后在用CreateFile打开它,看到这里那接下来的跟就更要小心了
- 00402684 |> \6A 00 push 0 ; /pSecurity = NULL
- 00402686 |. 55 push ebp ; |Path
- 00402687 |. FF15 38C04000 call dword ptr [<&KERNEL32.CreateDire>; \CreateDirectoryW
- 0040268D |. 6A 00 push 0 ; /hTemplateFile = NULL
- 0040268F |. 68 00002002 push 2200000 ; |Attributes = BACKUP_SEMANTICS|200000
- 00402694 |. 6A 03 push 3 ; |Mode = OPEN_EXISTING
- 00402696 |. 6A 00 push 0 ; |pSecurity = NULL
- 00402698 |. 6A 00 push 0 ; |ShareMode = 0
- 0040269A |. 68 00000040 push 40000000 ; |Access = GENERIC_WRITE
- 0040269F |. 55 push ebp ; |FileName
- 004026A0 |. FF15 68C04000 call dword ptr [<&KERNEL32.CreateFile>; \CreateFileW
- 004026A6 |. 8BF0 mov esi, eax
- 004026A8 |. 83FE FF cmp esi, -1
- 004026AB |. 75 37 jnz short 004026E4 ; 判断打开文件夹是否出错
接着一路F8,走不来多远又看到一个API,DeviceIoControl,顺着它往下看去,没多远就要ret了,这个call就要执行完了,经各方面分析,这个我不认识的API确实很重要,我又不认识他,干嘛用的呢,查查看吧,最后我在微软的MSDN网站上找到了相关文档说明,在下面
- 0040276D |. 6A 00 push 0 ; /pOverlapped = NULL
- 0040276F |. 8D4C24 14 lea ecx, dword ptr [esp+14] ; |
- 00402773 |. 51 push ecx ; |pBytesReturned
- 00402774 |. 6A 00 push 0 ; |OutBufferSize = 0
- 00402776 |. 83C0 0C add eax, 0C ; |
- 00402779 |. 6A 00 push 0 ; |OutBuffer = NULL
- 0040277B |. 898424 380200>mov dword ptr [esp+238], eax ; |
- 00402782 |. 83C0 08 add eax, 8 ; |
- 00402785 |. 50 push eax ; |InBufferSize
- 00402786 |. 8D9424 380200>lea edx, dword ptr [esp+238] ; |
- 0040278D |. 52 push edx ; |InBuffer
- 0040278E |. 68 A4000900 push 900A4 ; |IoControlCode = FSCTL_SET_REPARSE_POINT
- 00402793 |. 56 push esi ; |hDevice
- 00402794 |. FF15 70C04000 call dword ptr [<&KERNEL32.DeviceIoCo>; \DeviceIoControl
对设备执行指定的操作
IoControlCode = FSCTL_SET_REPARSE_POINT
Operation
The FSCTL_SET_REPARSE_POINT control code sets a reparse point on a file or directory.
To perform this operation, call ZwFsControlFile with the following parameters.
Minifilters should use FltTagFile instead of FSCTL_SET_REPARSE_POINT to set a reparse point.
For more information about reparse points and the FSCTL_SET_REPARSE_POINT control code, see the Microsoft
Windows SDK documentation.
本人顺手提供金山词霸服务
操作该FSCTL_SET_REPARSE_POINT控制代码设置一个文件或目录重分析点。要执行此操作,请使用以下参数
ZwFsControlFile。微筛选应使用FltTagFile而FSCTL_SET_REPARSE_POINT设置重分析点。如需重新分析点,
FSCTL_SET_REPARSE_POINT控制代码,信息,请参阅Microsoft Windows SDK文档。
小结:
看到这里也不用多说了,文档里面已经告诉我们了,虽然金山词霸有点衰,但大意还是在那的。此程序是通过使用API DeviceIoControl配合参数FSCTL_SET_REPARSE_POINT实现文件夹映射文件夹功能的,我们做个简单的实验就是把这条API调用给NOP掉,那这个映射无论如何也不会建立了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)