boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
阅读:1315回复:10

隐藏文件还不完善啊

楼主#
更多 发布于:2007-08-28 21:13
我在虚拟机测试时候没有问题,但是为什么拿到实机上执行测试就不对了呢?
我用DebugView看了一下,我的驱动的确是过滤了HideTest.txt文件名字了,但郁闷的是资源管理器就是可以看到我的C:\test\HideTest.txt,虚拟机跑就可以隐藏,不解啊
哪个中牛帮牛犊看看问题,大牛估计比较忙的;-*(
BOOLEAN
HandleDirectory(IN OUT PFILE_BOTH_DIR_INFORMATION DirInfo, IN PULONG lpBufLenth)
{
    PFILE_BOTH_DIR_INFORMATION currentDirInfo = DirInfo;
    ULONG offset = 0;
    ULONG position = 0;
    ULONG newLenth = *lpBufLenth;
    WCHAR fileName[] = L"HideTest.txt";
    do
    {
        offset = currentDirInfo->NextEntryOffset;

        if (!(FILE_ATTRIBUTE_DIRECTORY & currentDirInfo->FileAttributes) &&
             (0 == wcsncmp(currentDirInfo->FileName, fileName, currentDirInfo->FileNameLength>>1)))
        {
            RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, *lpBufLenth - position - offset);
            newLenth -= offset;
            position += offset;
        }
        else
        {
            if (!(FILE_ATTRIBUTE_DIRECTORY & currentDirInfo->FileAttributes))
            {
                KdPrint(("%08x File:%ws\n", currentDirInfo->FileAttributes, currentDirInfo->FileName));
            }
            position += offset;
            currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
        }
    } while (0 != offset);
    *lpBufLenth = newLenth;
    return TRUE;
}
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-08-28 21:29
我刚才又仔细的测试了一遍,bug如下:
如果当前目录只有一个HideTest.txt则隐藏失败,要是你又创建了一个文件则可以隐藏
 
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-08-28 21:36
哦,知道问题在哪里了;-)只有一个文件时候
    do
    {
        offset = currentDirInfo->NextEntryOffset;   //offset = 0
       。。。
      {
            newLenth -= offset;                                   //newLenth没有变化
            position += offset;
      }
       。。。
    } while (0 != offset);

由于没有考虑到这个情况导致一个bug出现/V
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-08-28 23:03
BOOLEAN
HandleDirectory(IN OUT PFILE_BOTH_DIR_INFORMATION DirInfo, IN PULONG lpBufLenth)
{
    PFILE_BOTH_DIR_INFORMATION currentDirInfo = DirInfo;
    PFILE_BOTH_DIR_INFORMATION lastDirInfo = NULL;
    ULONG offset = 0;
    ULONG position = 0;
    ULONG newLenth = *lpBufLenth;
    WCHAR fileName[] = L"Test.txt";
    do
    {
        offset = currentDirInfo->NextEntryOffset;
        if (!(FILE_ATTRIBUTE_DIRECTORY & currentDirInfo->FileAttributes) &&
             (0 == wcsncmp(currentDirInfo->FileName, fileName, currentDirInfo->FileNameLength>>1)))
        {
currentDirInfo->FileName, currentDirInfo->FileNameLength));
            if (0 == offset)
            {
                KdPrint(("l[%d][%d][%d][%d]\n", newLenth, *lpBufLenth, position, newLenth-(*lpBufLenth - position)));
                //Reset Last DirInfo NextEntryOffset To Zero!!!
                lastDirInfo->NextEntryOffset = 0;
                newLenth -= *lpBufLenth - position;
            }
            else
            {
                RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, *lpBufLenth - position - offset);
                newLenth -= offset;
                position += offset;
            }
        }
        else
        {
            position += offset;
            lastDirInfo = currentDirInfo;
            currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
        }
    } while (0 != offset);
    *lpBufLenth = newLenth;
    return TRUE;
}

请注意一定要lastDirInfo->NextEntryOffset = 0;
//Reset Last DirInfo NextEntryOffset To Zero!!!
lastDirInfo->NextEntryOffset = 0;
可见Windows2000其实并是以BufLenth来处理的,而是依靠currentDirInfo->NextEntryOffset
我调试时候BufLenth 计算正确了,但是由于忘记处理currentDirInfo->NextEntryOffset = 0;导致Windows2000继续读取超出BufLenth 的下一个DirInfo,这应该是Windows2000的一个bug
daviswu
驱动牛犊
驱动牛犊
  • 注册日期2007-03-07
  • 最后登录2009-01-16
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望40点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-29 09:54
谢谢lz分享
focusbh99
驱动牛犊
驱动牛犊
  • 注册日期2007-07-04
  • 最后登录2010-01-25
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望68点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-29 11:49
更严重的是, 经测试在vista上好像没没作用, XP 2K, 可以.
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-08-29 15:12
Vista俺没有啊,估计是微软安全性提高了吧 但是感觉太花哨了
focusbh99
驱动牛犊
驱动牛犊
  • 注册日期2007-07-04
  • 最后登录2010-01-25
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望68点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-29 15:19
与安全性能无关,驱动是可以安装, 但起不到作用. 楼主可心试一下.
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2007-08-29 17:32
【vista过滤】
XP和2000判断FileInformationClass == FileBothDirectoryInformation,
VISTA 下FileInformationClass ==FileIdBothDirectoryInformation ,做个判断,就可以了

;-)刚在论坛上就看到了
focusbh99
驱动牛犊
驱动牛犊
  • 注册日期2007-07-04
  • 最后登录2010-01-25
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望68点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-30 08:57
楼主, 你的softice 是在XP下,使用还在2K下使用.我用下了一个想在XP下使用, 也打了补丁, 但不行.
你如果有在XP下可使用的softice, 能不能发个给我.  我也想在虚拟机上调试一下驱动, 光用DeBugView感觉不爽.
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2007-08-30 11:39
我的是2K上的,DS3。2自带的
参考我的安装经历
http://bbs.driverdevelop.com/htm_data/11/0708/104847.html
调试的话我一般喜欢 DebugView,但是有时候会蓝屏的情况,根本看不到调试结果,这个时候就可以用ICE了,我的做法是:
首先在可疑代码中使用 _asm int 3;下断点,此中断会直接被ICE拦截并显示调试界面
然后你就可以使用src命令在源码状态下调试了,哈哈!
游客

返回顶部