首页
社区
课程
招聘
[原创]简单实现防止U盘传染
发表于: 2009-10-23 17:47 14474

[原创]简单实现防止U盘传染

2009-10-23 17:47
14474
一 缘起:学校机房已经被弄得千疮百孔了,又没维护,U盘一插进去,感染的隐藏的,导致无法正常使用了。
很烦,就想到自己弄个试下当做学习,网上这样的工具应该不少了,现在可真是防不胜防啊!先分享下自己的简单实现,呵呵,不足之处还请大牛多指导下才好啊!

二 实现原理简介:一般ring3下的感染是通过GetLogicalDrives然后在GetDriveType来判断是否存在移动设备的,所以就跟了下这两API,
发现在我的xp sp3下实现的有点出乎意料,大致描述如下:
DWORD GetLogicalDrives(VOID)
{
NtQueryInformationProcess((-1,0x17,ProcessInformation,36,NULL);//ProcessInformationClass=0x17 这个在MSDN中我没找到说明。
return *(LPDWORD)((DWORD)ProcessInformation);
}

DWORD GetDriveTypeW(LPCTSTR lpRootPathName)
{
BYTE i;
;对lpRootPathName的一些字符编码操作
NtQueryInformationProcess((-1,0x17,ProcessInformation,36,NULL);
i=*(LPBYTE)lpRootPathName-0x41;
i=*(LPBYTE)((DWORD)ProcessInformation+4+i);
switch(i)
{
case 2: //移动设备
return 2;
case 3: //硬盘
return 3;
case 5: //CD_ROM
return 5;
default:
;不是以上三种再根据lpRootPathName进一步的判断,后面的可以不管了,上面的就够了。
}
}
既然这样就变简单了好多,我们只要HOOK这个NtQueryInformationProcess,就可以实现目的了!

U盘检测示例代码:
BOOL Detect_u(void)
{
        char DiskPath[5]="C:\\";
        DWORD DrivesBitmap;
        BYTE i;

        DrivesBitmap=GetLogicalDrives();
        for (i=0;i<24;i++)
        {
                DiskPath[0]='C'+i;
                if ((DrivesBitmap & 1)==1)
                {
                        if (GetDriveType(DiskPath)==2)
                                return TRUE;
                }
                DrivesBitmap>>=1;
        }
        return FALSE;
}

三 代码实现:这里HOOK NtQueryInformationProcess的方法用了比较简单的SSDT hook,主要代码片段如下:
NTSTATUS __stdcall MyNtQueryInformationProcess(__in          HANDLE ProcessHandle,
                                               __in          PROCESSINFOCLASS ProcessInformationClass,
                                               __out         PVOID ProcessInformation,
                                               __in          DWORD ProcessInformationLength,
                                               __out_opt     LPDWORD ReturnLength
                                                                                           )
                                                                                          
{
        NTSTATUS status;
        DWORD      i;
       
        status=RealNtQueryInformationProcess(ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength,ReturnLength);
        if (ProcessInformationClass==0x17)
        {
                KdPrint(("OriValue:0x%08X",*(LPDWORD)((DWORD)ProcessInformation+8)));
                *(LPDWORD)ProcessInformation<<=1; //GetLogicalDrives函数返回值drives bitmap <<1错乱对应关系,相当于HOOk GetLogicalDrives
                (DWORD)ProcessInformation+=4;
                for (i=0;i<26;i++)
                {
                        if (*(LPBYTE)ProcessInformation==2)
                        {
                                KdPrint(("Address:0x%08X",ProcessInformation));
                        //        KdPrint(("Have Ramovebel Device!"));
                                *(LPBYTE)ProcessInformation=3; //移动设备改成硬盘,相当于HOOk GetDriveType 两个都齐了!
                        }
                        (DWORD)ProcessInformation+=1;
                }
        KdPrint(("AffValue:0x%08X",*(LPDWORD)((DWORD)ProcessInformation-22)));
        }
       
        return status;
}

四 总结:这样虽然可以防住一些普通的感染,但是对比较BT的和ring0下的还是不行的,如果你在自己电脑上试驱动部分,
(Addr=(DWORD)KeServiceDescriptorTable->ServiceTableBase+0x9A*4)这里面的NtQueryInformationProcess在SSSDT中的偏移0x9A需要改下,
还有其他平台下GetLogicalDrives和GetDriveTyped的实现可能就不是这样了,我的是xp sp3!

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
moonife果然不一样呀
貌似病毒已经不用这种手段了,直接26个字母。。。
2009-10-23 17:51
0
雪    币: 44
活跃值: (24)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
很黄很暴力。。。因为你在编写此程序的时候一定会不停的插、拔。。

文章不错,顶。
2009-10-23 18:51
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个用来学习HOOK
拿来练练手还是很不错的
但真正的防U盘病毒还是不靠谱
至少我写U盘病毒不会GetLogicalDrives
BT点的病毒都很少用API

楼主的代码风格不错
赞一个
2009-10-23 19:12
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
hook这个啥用都没有,人家可以直接取PEB里的device map...
2009-10-23 19:34
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
可以防住一些,防不住所有,毕竟各种U盘病毒实现不一样
前段时间我也写过类似工具,不过和楼主思路不一样。。。

BTW:貌似有些系统GetDriveType用的是ZwQueryVolumeInformationFile
2009-10-23 20:33
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
7
typedef enum _PROCESSINFOCLASS {
                      ProcessBasicInformation,                 // 0     Y        N
                      ProcessQuotaLimits,                      // 1     Y        Y
                      ProcessIoCounters,                       // 2     Y        N
                      ProcessVmCounters,                       // 3     Y        N
                      ProcessTimes,                            // 4     Y        N
                      ProcessBasePriority,                     // 5     N        Y
                      ProcessRaisePriority,                    // 6     N        Y
                      ProcessDebugPort,                        // 7     Y        Y
                      ProcessExceptionPort,                    // 8     N        Y
                      ProcessAccessToken,                      // 9     N        Y
                      ProcessLdtInformation,                   // 10    Y        Y
                      ProcessLdtSize,                          // 11    N        Y
                      ProcessDefaultHardErrorMode,             // 12    Y        Y
                      ProcessIoPortHandlers,                   // 13    N        Y
                      ProcessPooledUsageAndLimits,             // 14    Y        N
                      ProcessWorkingSetWatch,                  // 15    Y        Y
                      ProcessUserModeIOPL,                     // 16    N        Y
                      ProcessEnableAlignmentFaultFixup,        // 17    N        Y
                      ProcessPriorityClass,                    // 18    N        Y
                      ProcessWx86Information,                  // 19    Y        N
                      ProcessHandleCount,                      // 20    Y        N
                      ProcessAffinityMask,                     // 21    N        Y
                      ProcessPriorityBoost,                    // 22    Y        Y
                      ProcessDeviceMap,                        // 23    Y        Y
  ProcessSessionInformation,            // 24    Y       Y
                        ProcessForegroundInformation,         // 25    N       Y
                        ProcessWow64Information               // 26    Y       N
                    } PROCESSINFOCLASS;
2009-10-23 20:43
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
支持一个,不错
2009-10-24 09:17
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
4楼,不用api的程序是啥样子,我想象不出来
2009-10-25 07:44
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
U盘病毒范围太窄了,应该是AUTORUN病毒,这个连硬盘都感染
所以hook那几个API冇用
2009-10-25 09:49
0
雪    币: 433
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
11
support!支持moonife兄弟
2009-10-25 19:32
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错,学习一下,
2009-10-26 20:37
0
雪    币: 454
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
要搞那么复杂么?
在每个盘的根目录下建个autorun.inf只读目录不就行了
2009-10-26 21:47
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
看看某人写的程序,就明白了
2009-10-26 22:27
0
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
13L 貌似正解 只是..
2010-1-20 15:23
0
雪    币: 52
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
现在U盘病毒比原来的autorun多多了,有很多方法可以实现感染。通过感染U盘文件照样可以实现传播啊
2010-1-21 16:43
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
直接全盘 免疫AUTORUN 这个文件不就好了吗?
2010-1-22 11:16
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
18
好东西,顶.
2010-1-24 19:37
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
一般我用U盘都喜欢建个特殊文件夹,把EXE放进里面,貌似不容易被感染。。。
2010-2-5 09:31
0
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
把U盘格式化成NTFS格式,然后建个文件夹命名为autorun.inf,再在安全里把全部所有者删除,这样只有创建者能改了,我一直这样用,不知这方法管不管用
2010-2-7 12:27
0
雪    币: 211
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
某些弱智的驱动光盘(eg: hp打印机 hsp1xxx)把设置保存在autorun.inf中,
全盘免疫AUTORUN 这个文件 就无法正常安装该驱动了
2010-3-26 09:43
0
游客
登录 | 注册 方可回帖
返回
//