开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1617|回复: 1
收起左侧

[图文教程] CreateFile Bypass Filter

[复制链接]
结帖率:53% (9/17)
发表于 2013-3-30 10:39:32 | 显示全部楼层 |阅读模式   广东省中山市
代码目的是用IoCreateFileSpecifyDeviceObjectHint打开文件,绕过fsfilter

其中判断只打开非系统卷(通过注册表识别)
同时,当卷未加载时,使用一个技巧(IoVerifyVolume)来间接调用IopMountVolume,让卷的设备在FS上能找到(VPB有底层设备)

是以前为了解决卡巴2010的一个脑残BUG写的,最后没使用,不过注册表识别系统卷和强制挂载卷的方法还是比较有意思的。
  1. <li>

  2. </li><li>

  3. </li><li>

  4. </li><li>

  5. </li><li>PVOID pIoCreateFileSpecifyDeviceObjectHint = 0 ;

  6. </li><li>extern POBJECT_TYPE *IoDeviceObjectType;

  7. </li><li>ULONG SystemVolumeIndex = 0xffffffff;

  8. </li><li>NTSTATUS MyIoCreateFile(

  9. </li><li>                                                                             
  10.             OUT PHANDLE FileHandle,

  11. </li><li>                                                                             
  12.             IN ACCESS_MASK DesiredAccess,

  13. </li><li>                                                                             
  14.             IN POBJECT_ATTRIBUTES ObjectAttributes,

  15. </li><li>                                                                             
  16.             OUT PIO_STATUS_BLOCK IoStatusBlock,

  17. </li><li>                                                                             
  18.             IN PLARGE_INTEGER AllocationSize OPTIONAL,

  19. </li><li>                                                                             
  20.             IN ULONG FileAttributes,

  21. </li><li>                                                                             
  22.             IN ULONG ShareAccess,

  23. </li><li>                                                                             
  24.             IN ULONG Disposition,

  25. </li><li>                                                                             
  26.             IN ULONG CreateOptions,

  27. </li><li>                                                                             
  28.             IN PVOID EaBuffer OPTIONAL,

  29. </li><li>                                                                             
  30.             IN ULONG EaLength,

  31. </li><li>                                                                             
  32.             IN CREATE_FILE_TYPE CreateFileType,

  33. </li><li>                                                                             
  34.             IN PVOID ExtraCreateParameters OPTIONAL,

  35. </li><li>                                                                             
  36.             IN ULONG Options

  37. </li><li>                                                                             
  38.             )

  39. </li><li>{

  40. </li><li>        NTSTATUS stat ;

  41. </li><li>        LPWSTR pPathVolume;

  42. </li><li>        ULONG volumeindex ;

  43. </li><li>        WCHAR VolumePath[13] = L"\\GLOBAL??\\A:";

  44. </li><li>        HANDLE LinkHandle ;

  45. </li><li>        OBJECT_ATTRIBUTES oba ;

  46. </li><li>        PDEVICE_OBJECT DeviceObject ;

  47. </li><li>

  48. </li><li>        if (pIoCreateFileSpecifyDeviceObjectHint == NULL || UserInit)

  49. </li><li>        {

  50. </li><li>                goto NormalCreateFile;

  51. </li><li>        }

  52. </li><li>        

  53. </li><li>        pPathVolume = ObjectAttributes->ObjectName->Buffer + 4;

  54. </li><li>        

  55. </li><li>        if (*pPathVolume >= L'A' && *pPathVolume <= L'Z')

  56. </li><li>        {

  57. </li><li>                volumeindex = *pPathVolume - L'A';

  58. </li><li>        }

  59. </li><li>        else if(*pPathVolume >= L'a' && *pPathVolume <=
  60. L'z')

  61. </li><li>        {

  62. </li><li>                volumeindex = *pPathVolume - L'a';

  63. </li><li>        }

  64. </li><li>        else

  65. </li><li>        {

  66. </li><li>                goto NormalCreateFile;

  67. </li><li>        }

  68. </li><li>

  69. </li><li>        if (pPathVolume[1] != L':' || pPathVolume[2] != L'\\')

  70. </li><li>        {

  71. </li><li>                goto NormalCreateFile;

  72. </li><li>        }

  73. </li><li>

  74. </li><li>        if (volumeindex == SystemVolumeIndex )

  75. </li><li>        {

  76. </li><li>                goto NormalCreateFile;

  77. </li><li>        }

  78. </li><li>

  79. </li><li>        if (VolumeBaseDevObjCache[volumeindex] == 0 )

  80. </li><li>        {

  81. </li><li>                UNICODE_STRING uniname ;

  82. </li><li>                HANDLE KeyHandle ;

  83. </li><li>                UNICODE_STRING DevUniName;

  84. </li><li>                PVOID pKeyInfo ;

  85. </li><li>                ULONG btr ;

  86. </li><li>                LPWSTR pDeviceName ;

  87. </li><li>                PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo ;

  88. </li><li>                PFILE_OBJECT FileObject ;

  89. </li><li>

  90. </li><li>                VolumePath[10] = VolumePath[10] + volumeindex ;

  91. </li><li>

  92. </li><li>

  93. </li><li>                RtlInitUnicodeString(&uniname ,
  94. L"\\Registry\\Machine\\SYSTEM\\Setup");

  95. </li><li>                InitializeObjectAttributes(&oba , &uniname ,
  96. OBJ_CASE_INSENSITIVE , 0 , 0);

  97. </li><li>                stat = ZwOpenKey(&KeyHandle , KEY_ALL_ACCESS ,
  98. &oba);

  99. </li><li>               

  100. </li><li>                if (!NT_SUCCESS(stat))

  101. </li><li>                {

  102. </li><li>                        goto NormalCreateFile;

  103. </li><li>                }

  104. </li><li>                pKeyInfo = ExAllocatePool(NonPagedPool ,
  105. sizeof(KEY_VALUE_PARTIAL_INFORMATION)+ MAX_PATH * sizeof(WCHAR));

  106. </li><li>               

  107. </li><li>                if (!pKeyInfo)

  108. </li><li>                {

  109. </li><li>                        ZwClose(KeyHandle);

  110. </li><li>                        goto NormalCreateFile;

  111. </li><li>                }

  112. </li><li>                RtlInitUnicodeString(&uniname , L"SystemPartition");

  113. </li><li>                stat = ZwQueryValueKey(KeyHandle ,

  114. </li><li>                                                                &uniname
  115. ,

  116. </li><li>                                                               
  117. KeyValuePartialInformation ,

  118. </li><li>                                                               
  119. pKeyInfo  ,

  120. </li><li>                                                               
  121. sizeof(KEY_VALUE_PARTIAL_INFORMATION) + MAX_PATH * sizeof(WCHAR) ,

  122. </li><li>                                                                &btr
  123. );

  124. </li><li>                ZwClose(KeyHandle);

  125. </li><li>

  126. </li><li>                if (!NT_SUCCESS(stat))

  127. </li><li>                {

  128. </li><li>                        ExFreePool(pKeyInfo);

  129. </li><li>                        goto NormalCreateFile;

  130. </li><li>                }

  131. </li><li>               

  132. </li><li>                RtlInitUnicodeString(&uniname, VolumePath);

  133. </li><li>                InitializeObjectAttributes(&oba  , &uniname ,
  134. OBJ_CASE_INSENSITIVE , 0 , 0  );

  135. </li><li>                        

  136. </li><li>                        

  137. </li><li>                stat = ZwOpenSymbolicLinkObject(&LinkHandle ,
  138. SYMBOLIC_LINK_QUERY , &oba );

  139. </li><li>

  140. </li><li>                if (!NT_SUCCESS(stat))

  141. </li><li>                {

  142. </li><li>                        ExFreePool(pKeyInfo);

  143. </li><li>                        goto NormalCreateFile;

  144. </li><li>

  145. </li><li>                }

  146. </li><li>                pDeviceName = ExAllocatePool(NonPagedPool ,
  147. MAX_PATH*sizeof(WCHAR));

  148. </li><li>

  149. </li><li>                if (!pDeviceName)

  150. </li><li>                {

  151. </li><li>                        ExFreePool(pKeyInfo);

  152. </li><li>                        ZwClose(LinkHandle);

  153. </li><li>                        goto NormalCreateFile;

  154. </li><li>                }

  155. </li><li>

  156. </li><li>                RtlInitUnicodeString(&DevUniName , pDeviceName);

  157. </li><li>

  158. </li><li>                DevUniName.MaximumLength = MAX_PATH * sizeof(WCHAR);

  159. </li><li>

  160. </li><li>                stat = ZwQuerySymbolicLinkObject(LinkHandle ,
  161. &DevUniName , NULL);

  162. </li><li>        

  163. </li><li>                ZwClose(LinkHandle);

  164. </li><li>               

  165. </li><li>                if (!NT_SUCCESS(stat))

  166. </li><li>                {

  167. </li><li>                        ExFreePool(pKeyInfo);

  168. </li><li>                        ExFreePool(pDeviceName);

  169. </li><li>                }

  170. </li><li>

  171. </li><li>                KeyValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)pKeyInfo ;


  172. </li><li>                if (_wcsnicmp(pDeviceName , &KeyValueInfo->Data ,
  173. DevUniName.Length / sizeof(WCHAR)) == 0)

  174. </li><li>                {

  175. </li><li>                        SystemVolumeIndex = volumeindex ;

  176. </li><li>                        ExFreePool(pKeyInfo);

  177. </li><li>                        ExFreePool(pDeviceName);

  178. </li><li>                        goto NormalCreateFile;

  179. </li><li>                }

  180. </li><li>

  181. </li><li>                ExFreePool(pKeyInfo);

  182. </li><li>

  183. </li><li>

  184. </li><li>                stat = IoGetDeviceObjectPointer(&DevUniName ,

  185. </li><li>                        FILE_READ_ATTRIBUTES ,

  186. </li><li>                        &FileObject ,

  187. </li><li>                        &DeviceObject );

  188. </li><li>

  189. </li><li>                ExFreePool(pDeviceName);

  190. </li><li>

  191. </li><li>                if (!NT_SUCCESS(stat))

  192. </li><li>                {

  193. </li><li>                        goto NormalCreateFile ;

  194. </li><li>                }

  195. </li><li>

  196. </li><li>                DeviceObject =
  197. IoGetBaseFileSystemDeviceObject(FileObject);

  198. </li><li>        

  199. </li><li>        

  200. </li><li>                if (DeviceObject == FileObject->DeviceObject)

  201. </li><li>                {

  202. </li><li>                        //DbgPrint("device object not mounted! %08x\n" ,
  203. DeviceObject);

  204. </li><li>                        stat = IoVerifyVolume(DeviceObject , FALSE);

  205. </li><li>                        if (!NT_SUCCESS(stat))

  206. </li><li>                        {

  207. </li><li>                                //DbgPrint("try mounte volume failed
  208. %08x\n", stat);

  209. </li><li>                                ObDereferenceObject(FileObject);

  210. </li><li>                                goto NormalCreateFile ;

  211. </li><li>                        }

  212. </li><li>                        //DbgPrint("mount volume OK\n");

  213. </li><li>                        if (DeviceObject->Vpb &&
  214. DeviceObject->Vpb->DeviceObject)

  215. </li><li>                        {

  216. </li><li>                                DeviceObject =
  217. DeviceObject->Vpb->DeviceObject ;

  218. </li><li>                        }

  219. </li><li>                }

  220. </li><li>

  221. </li><li>                ObDereferenceObject(FileObject);

  222. </li><li>

  223. </li><li>        

  224. </li><li>                if (!DeviceObject)

  225. </li><li>                {

  226. </li><li>                        goto NormalCreateFile;

  227. </li><li>                }

  228. </li><li>

  229. </li><li>                VolumeBaseDevObjCache[volumeindex] = DeviceObject ;        


  230. </li><li>

  231. </li><li>        }

  232. </li><li>        else

  233. </li><li>        {

  234. </li><li>                DeviceObject = VolumeBaseDevObjCache[volumeindex];

  235. </li><li>        }

  236. </li><li>

  237. </li><li>        goto BypassCreateFile;

  238. </li><li>NormalCreateFile:

  239. </li><li>                        return IoCreateFile(FileHandle , DesiredAccess ,


  240. </li><li>                                ObjectAttributes , IoStatusBlock ,
  241. AllocationSize ,

  242. </li><li>                                FileAttributes , ShareAccess , Disposition ,
  243. CreateOptions , EaBuffer ,

  244. </li><li>                                EaLength , CreateFileType ,
  245. ExtraCreateParameters , Options);

  246. </li><li>

  247. </li><li>BypassCreateFile:

  248. </li><li>        

  249. </li><li>        __asm

  250. </li><li>        {

  251. </li><li>                        push DeviceObject

  252. </li><li>                        push Options

  253. </li><li>                        push ExtraCreateParameters

  254. </li><li>                        push CreateFileType

  255. </li><li>                        push EaLength

  256. </li><li>                        push EaBuffer

  257. </li><li>                        push CreateOptions

  258. </li><li>                        push Disposition

  259. </li><li>                        push ShareAccess

  260. </li><li>                        push FileAttributes

  261. </li><li>                        push AllocationSize

  262. </li><li>                        push IoStatusBlock

  263. </li><li>                        push ObjectAttributes

  264. </li><li>                        push DesiredAccess

  265. </li><li>                        push FileHandle

  266. </li><li>                        call pIoCreateFileSpecifyDeviceObjectHint

  267. </li><li>                        mov stat ,eax

  268. </li><li>                        

  269. </li><li>        }

  270. </li><li>        

  271. </li><li>        return stat ;

  272. </li><li>

  273. </li><li>}</li>
复制代码
结帖率:100% (5/5)

签到天数: 1 天

发表于 2013-3-30 10:45:52 | 显示全部楼层   广东省惠州市
是什么的??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表