首页
社区
课程
招聘
[求助]分析FolderLock隐藏文件夹原理
发表于: 2007-5-14 22:48 13036

[求助]分析FolderLock隐藏文件夹原理

2007-5-14 22:48
13036
Folder Lock:

http://www.newsoftwares.net/folderlock/

售价:35美金
Download.com下载量:超过70万
获Download.com5星、奶牛下载站5牛和PC MAGAZINE推荐等

声称金刚不坏之身,公然挑战全球黑客

效果:加密后加密文件夹消失,搜索、显示隐藏文件系统文件、在DOS下查找都看不到,开启Folder Lock输入密码后文件夹显现。

初步hack分析:

1- 经检查没有放到Recycled
2- 用杀毒软件(我用趋势)查,安装目录下有些可疑的目录名能看见,不过cd不进来
3- 用File Monit跟踪,发现如下可疑文件(夹)操作,这些文件(夹)正常情况下都是看不见的:
    c:\sccfg.sys
    安装目录\Locker
    安装目录\Locker\)8$5
    安装目录\Locker\ascii
    asc.bat
    安装目录\\Locked
    安装目录\\Locked\  钒伊
    安装目录\Locked\pegtag.$s8
    安装目录\desktop.ini
4- 我用趋势阻止了对硬盘的删除操作,结果捕获了asc.bat、asc_check.bat和asc_check2.bat,这几个批处理文件都是程序执行过程中处理完自动删除的作者想隐蔽的,里面的内容是设置加密文件夹的只读隐藏和系统属性,然后就是MOVE目录,但他move的目标目录隐藏了我找不到

用趋势查毒时查看到的诡异文件夹:



这样,虽然捕获了很多蛛丝马迹,但还是无法分析出他的隐藏原理

各位兄台,帮我一起分析下,谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
2
windrvNt.sys Hook了那几个函数
上传的附件:
2007-5-14 23:34
0
雪    币: 212
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=;]...[/QUOTE]
估计采用了rootkit的方法,我也做过一个类似的,在看雪中有下载
2007-5-15 00:47
0
雪    币: 214
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
学习中。。。
2007-5-15 09:59
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
怎么就成趋势了呢?不时麦咖啡吗?
2007-5-15 10:02
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
口误口误,是卖咖啡
2007-5-15 23:46
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没错就是windrvNT,不过这是newsoftware公司自己专用的程序,其原理不得而知阿。。。
2007-5-15 23:47
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
rootkit是木马的手法吧,会不会冒犯各大杀毒软件阿。。。
2007-5-15 23:49
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
9
弄个双系统或者用winpe启动系统,一切不都看见了么?
2007-5-16 12:54
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
使用RKU恢复被挂钩的地方立马搞定~
还是太弱了~
2007-5-16 13:01
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
贴个我的某个玩具的隐藏代码~
#include <ntddk.h>
#include "file.h"
#include "disk.h"

typedef unsigned char BYTE, *PBYTE;

WCHAR *FileToHide[128];
ULONG NbFileToHide=0;

/*
       ZwQueryDirectoryFile hook, DKOM type.
*/

ZWQUERYDIRECTORYFILE ZwQueryDirectoryFileAddress = NULL;

NTSTATUS ZwQueryDirectoryFileHook(
                IN HANDLE FileHandle,
                IN HANDLE Event OPTIONAL,
                IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
                IN PVOID ApcContext OPTIONAL,
                OUT PIO_STATUS_BLOCK IoStatusBlock,
                OUT PVOID FileInformation,
                IN ULONG FileInformationLength,
                IN FILE_INFORMATION_CLASS FileInformationClass,
                IN BOOLEAN ReturnSingleEntry,
                IN PUNICODE_STRING FileName OPTIONAL,
                IN BOOLEAN RestartScan
)
{
     NTSTATUS status;
     ULONG NameOffset;
     ULONG NameSizeOffset;
     WCHAR *FileNamePtr;
     PULONG FileNameLength;
     PBYTE curr, prev;
     PULONG DeltaCurr, DeltaPrev;
     UNICODE_STRING UnicodeFilename ;
     ULONG i;
        
     status = ((ZWQUERYDIRECTORYFILE)(ZwQueryDirectoryFileAddress)) (
           FileHandle,
           Event,
           ApcRoutine,
           ApcContext,
           IoStatusBlock,
           FileInformation,
           FileInformationLength,
           FileInformationClass,
           ReturnSingleEntry,
           FileName,
           RestartScan);      
     
     if( !NT_SUCCESS(status) )
        return status;

     curr = FileInformation;   
        
     switch( FileInformationClass )
     {
        /*     
            we get, for any structure, the offset of the filename and filename size
            so we have to write only 1 hook routine :)
        */     
        case FileDirectoryInformation:
             NameOffset = ((ULONG)&(((PFILE_DIRECTORY_INFORMATION)curr)->FileName)) - ((ULONG)curr);
             NameSizeOffset = ((ULONG)&(((PFILE_DIRECTORY_INFORMATION)curr)->FileNameLength))
                               - ((ULONG)curr);      
             break;

        case FileFullDirectoryInformation:
             NameOffset = ((ULONG)&(((PFILE_FULL_DIR_INFORMATION)curr)->FileName)) - ((ULONG)curr);
             NameSizeOffset = ((ULONG)&(((PFILE_FULL_DIR_INFORMATION)curr)->FileNameLength))
                               - ((ULONG)curr);           
             break;

        case FileBothDirectoryInformation:
             NameOffset = ((ULONG)&(((PFILE_BOTH_DIR_INFORMATION)curr)->FileName)) - ((ULONG)curr);
             NameSizeOffset = ((ULONG)&(((PFILE_BOTH_DIR_INFORMATION)curr)->FileNameLength))
                               - ((ULONG)curr);      
             break;

        case FileNamesInformation:
             NameOffset = ((ULONG)&(((PFILE_NAMES_INFORMATION)curr)->FileName)) - ((ULONG)curr);
             NameSizeOffset = ((ULONG)&(((PFILE_NAMES_INFORMATION)curr)->FileNameLength))
                               - ((ULONG)curr);         
             break;
            
        case FileIdBothDirectoryInformation:
             NameOffset = ((ULONG)&(((PFILE_ID_BOTH_DIR_INFORMATION)curr)->FileName)) - ((ULONG)curr);
             NameSizeOffset = ((ULONG)&(((PFILE_ID_BOTH_DIR_INFORMATION)curr)->FileNameLength))
                               - ((ULONG)curr);
             break;
        
        case FileIdFullDirectoryInformation:
             NameOffset = ((ULONG)&(((PFILE_ID_FULL_DIR_INFORMATION)curr)->FileName)) - ((ULONG)curr);
             NameSizeOffset = ((ULONG)&(((PFILE_ID_FULL_DIR_INFORMATION)curr)->FileNameLength))
                               - ((ULONG)curr);   
            
             break;        

       default:
             // this isn't an interesting ZwQueryDirectoryFile call
             return status;      
     }  
     
     /*
        Now we can apply, as for process, a DKOM hook. For any struct, the first
        element is the NextEntryDelta.
        we can easily get and modify it :)
     */   
     
     
     for(i=0; i<NbFileToHide; i++) {
        
        curr = FileInformation;  
        
        prev = NULL;
        while( curr ) {
        
           // we get the NextEntryOffsets
           DeltaCurr = (PULONG)curr;
           DeltaPrev = (PULONG)prev;
        
           FileNamePtr = (WCHAR*)((PBYTE)curr + NameOffset);
           FileNameLength = (PULONG) ((PBYTE)curr + NameSizeOffset);         
              
           if( FileNamePtr!=NULL && *FileNameLength == wcslen(FileToHide[i])*2 &&
               !memcmp(_wcsupr(FileNamePtr),FileToHide[i],(SIZE_T)*FileNameLength))
           {   

              // file to hide   
              
              if( !prev ) {
                  // we are first of the list
                  if( *DeltaCurr )
                     // there's a next entry
                     (PBYTE)FileInformation += *DeltaCurr;
                  else
                     FileInformation = NULL;   
              }
              else {
                  // there's an entry before
                  if( *DeltaCurr )
                     // NextEntryOffset of the previous entry "points" to the next
                     *DeltaPrev += *DeltaCurr;
                  else
                     // we're last file
                     *DeltaPrev = 0;   
              }   
           }        
           else
              // if curr is not to hide, prev becomes curr :)
              prev = curr;
        
           if( *DeltaCurr )  
              curr += *DeltaCurr;
           else  
              curr = NULL;
            
        } // while
     } // for
        
     
     return status;
}
2007-5-16 13:04
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
NaX
12
支持cvcvxk的代码,不过如果你不是通过修改SSDT,或改写内核函数头,又如何达到hook ZwQueryDirectoryFile呢?如何DKOM?
2007-5-16 13:27
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
双系统我试了,搞不定它。。。
2007-5-16 14:41
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
搞不定?是加密部分吧?

双系统,可以看见了,只是还有加密~
2007-5-16 21:16
0
游客
登录 | 注册 方可回帖
返回
//