给个思路:用fopen()或CreateFile()成功打开一个文件时,文件分区表(磁盘的第一个扇区512字节)被读到内存中什么位置了?

解决方案 »

  1.   

    觉得楼主的问题有点含糊,文件分区表(如果你指的是NTFS中的MFT)不应该是“磁盘的第一个扇区512字节”。 逻辑磁盘的第一个逻辑扇区应该是BPB。而物理磁盘的第一个扇区应该是分区链表。
      

  2.   

    楼上各位,本人这个想法是源自于这样:当你用fopen()或CreateFile()打开或创建一个文件成功后,OS自动将文件系统加载成功,可以这样试验,插入一个U盘,编程fopen()成功写入一个文件,然后用WinHex工具将U盘的第一扇区的512字节改写全部填0,并保存到该U盘,这时你用资源管理器操作这个U盘,仍然是可以访问的,那么这512个字节被读到操作系统的设那么地方了呢?拔下U盘再插入,系统会不识别这个U盘,提示:要不要格式化?
    如果自己知道这512字节被操作系统读到什么地方了,那么我可以在内存中修改这片内存,做到“实时”的U盘中的内容不可见,只有当自己想访问时,用正确的内容覆盖这片内存,就可以完整访问U盘了。
    我的想法是做U盘数据隐藏,并不想使用文件系统驱动,因为这个想法会移植在Wince中,总不能在CE中做文件驱动吧!
    还是先谢谢各位!
      

  3.   

    这个要看U盘是怎么个分区的`~~
    一般第一个扇区是用来放文件的信息的~后面才是FAT区,再后面才是DATA区~~~
      

  4.   

    搂住问题提得非常好提供给你一个思路,fopen或者CreateFile之后,返回一个句柄,在调试的内存窗口里,查找一下在该句柄内存附近,是否有一段512字节的内容与你通过WinHex读取的内容一致的
    还有就是在整个内存中搜索(参看游戏修改器内存查找)与512字节匹配的部分找到具体内存位置后,需要找到与打开文件句柄是否有关联,是否每次都是固定加载到某一堆栈空间这些还是需要进一步分析希望想法能有用
      

  5.   

    晕,至于CE做驱动是很正常的。在应用层很难安全的实现你说的U盘数据隐藏。要知道Windows系统通常情况下对文件的操作是Lazy的,也就是说你CreateFile的时候是不会去读文件的,当你ReadFile的时候系统才会根据内部的lazy算法确定读多少和读到哪里去。另外即使你强悍到可以使用应用程序在内存中找到那块内存并且把它给清了,但是你能保证驱动不会将它写回磁盘么?比如别人插上盘后,又拔走了,你能确保被你清除的内存数据不会刷到U盘上导致数据破坏么?
      

  6.   

    楼上各位,本人这个想法是源自于这样:当你用fopen()或CreateFile()打开或创建一个文件成功后,OS自动将文件系统加载成功,可以这样试验,插入一个U盘,编程fopen()成功写入一个文件,然后用WinHex工具将U盘的第一扇区的512字节改写全部填0,并保存到该U盘,这时你用资源管理器操作这个U盘,仍然是可以访问的,那么这512个字节被读到操作系统的设那么地方了呢?拔下U盘再插入,系统会不识别这个U盘,提示:要不要格式化?
    =====================================
    因为你CreateFile成功之后,操作系统会改分区中的文件表。这个文件表是操作系统维护的。
    你更改只会让你的数据丢失,文件表中维护了每个文件从物理磁盘的那个位置开始,那个位置结束之类的信息。
    你要加密的话,可以写驱动,自己写自己文件表。这样其他程序都不能读取了。
      

  7.   

    楼上各位,感谢参与;
    我搞不明白,明明进入管理页面,给各位结帐;
    但系统提示说什么“只有未结帐....,云云,才能给分“?
    mfc168(子非鱼) :
    方法试过,没有找到那段内存。
    非常感谢