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

[增加了RING3的实现] [支持XIKU]SysinternalsSuite第一弹 WinObj [复制链接]

Rank: 2

发表于 2009-7-12 00:41:41 |显示全部楼层
牛们都说不用驱动可以实现,今天看了一下,实现了,发出来
其实就是ZwOpenDirectoryObject,ZwQueryDirectoryObject,ZwOpenSymbolicLinkObject,ZwQuerySymbolicLinkObject这几个函数在RING3的应用,大家可以看代码,RING3的代码为WinObjRing3

扯蛋:
XIKU发起这个活动我觉得是相当不错的,老少皆宜。我等菜鸟可以了解一些新的或以前未了解到的牛X技术,更是一个学习前进的好机会;高手也可以通过这种方式来进一步熟练,并且说不定从中另有发现,希望牛们有什么好发现记得放出来哈。



正文:


工具介绍:
WinObj是一个查看Windows内核对象的工具。虽然我们平常都是在C++中常说对象这个概念,但是C++编译链接之后也是一堆二进制,所谓对象,是我们的一种形象认识。所以在以C写成的Windows中也有对象的概念,其实就是一堆数据结构以不同的规则拼凑在一起,便于管理。


原理:
Windows中的对象以一种类似文件管理的方式组织起来。Windows规定了一个根目录”\”,相当于磁盘的”C:\”,在此根目录下开始存储对象。并且目录也是对象,是一种Directory类型的对象,目录对象里面可以存储另外的对象。既然目录是对象,那么目录下面也可以存储目录,这样就形成了类似Windows的explorer的组织结构。
目录对象的定义:
typedef struct _OBJECT_DIRECTORY {
struct _OBJECT_DIRECTORY_ENTRY *HashBuckets[ NUMBER_HASH_BUCKETS ];
EX_PUSH_LOCK Lock;
struct _DEVICE_MAP *DeviceMap;
ULONG SessionId;
} OBJECT_DIRECTORY, *POBJECT_DIRECTORY;
其中有一个_OBJECT_DIRECTORY_ENTRY*的数组HashBuckets,大小为NUMBER_HASH_BUCKETS,WRK中NUMBER_HASH_BUCKETS为37

_OBJECT_DIRECTORY_ENTRY结构:
typedef struct _OBJECT_DIRECTORY_ENTRY {
struct _OBJECT_DIRECTORY_ENTRY *ChainLink;
PVOID Object;
ULONG HashValue;
} OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;
可以看到,_OBJECT_DIRECTORY_ENTRY中包含了对象PVOID Object,另外还以链表的形式连接到下一个_OBJECT_DIRECTORY_ENTRY结构,实现管理。

对象目录的管理知道之后,下面就是如何遍历对象目录。

NTSYSAPI
NTSTATUS
NTAPI
ZwOpenDirectoryObject(
OUT PHANDLE DirectoryHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
DDK中没有这个函数的声明,但在Windows2000 Native API Reference中有详细解释。
然后调用
NTSTATUS
ObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
通过HANDLE得到OBJECT.
之后就可以开始遍历目录了
下面是我写的遍历函数
  1. NTSTATUS TraverseDirectory(char *Dir,PVOID *retBuf,PULONG RetSize)
  2. {
  3. NTSTATUS status;
  4. UNICODE_STRING dirName;
  5. OBJECT_ATTRIBUTES oa;
  6. HANDLE dirHandle;
  7. PVOID obj;
  8. POBJECT_HEADER objHeader;
  9. POBJECT_HEADER_NAME_INFO objName;
  10. PUNICODE_STRING objTypeName;
  11. POBJECT_DIRECTORY objDir;
  12. POBJECT_DIRECTORY_ENTRY pDirEntry;
  13. ANSI_STRING aDirName;
  14. ANSI_STRING aName;
  15. ULONG bytesRet;
  16. PVOID pBuffer;
  17. POBJ_INFO pObjInfo;
  18. POBJECT_SYMBOLIC_LINK symLink;
  19. int i;
  20. bytesRet=0;
  21. RtlInitAnsiString(&aDirName,Dir);
  22. RtlAnsiStringToUnicodeString(&dirName,&aDirName,TRUE);
  23. InitializeObjectAttributes(&oa,&dirName,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,NULL,NULL);
  24. status=ZwOpenDirectoryObject(&dirHandle,DIRECTORY_ALL_ACCESS,&oa);
  25. if(!NT_SUCCESS(status))
  26. {
  27. DbgPrint("ZwOpenDirectoryObject failed:%x\n",status);
  28. return status;
  29. }
  30. status=ObReferenceObjectByHandle(dirHandle,DIRECTORY_ALL_ACCESS,NULL,KernelMode,&objDir,NULL);
  31. if(! NT_SUCCESS(status))
  32. {
  33. DbgPrint("ObReferenceObjectByHandle failed!");
  34. ZwClose(dirHandle);
  35. return status;
  36. }
  37. pBuffer=ExAllocatePool(PagedPool,655350);
  38. if(!pBuffer)
  39. {
  40. DbgPrint("not enough memory!");
  41. return STATUS_INSUFFICIENT_RESOURCES;
  42. }
  43. RtlZeroMemory(pBuffer,655350);
  44. pObjInfo=(POBJ_INFO)pBuffer;
  45. for(i=0;i<NUMBER_HASH_BUCKETS;i++)
  46. {
  47. pDirEntry=objDir->HashBuckets[i];
  48. while(pDirEntry)
  49. {
  50. obj=pDirEntry->Object;
  51. objHeader=OBJECT_TO_OBJECT_HEADER(obj);
  52. objName=OBJECT_HEADER_TO_NAME_INFO(objHeader);
  53. objTypeName=(PUNICODE_STRING)((ULONG)(objHeader->Type)+0x40);
  54. RtlUnicodeStringToAnsiString(&aName,&(objName->Name),TRUE);
  55. strcpy(pObjInfo->ObjName,aName.Buffer);
  56. RtlFreeAnsiString(&aName);
  57. RtlUnicodeStringToAnsiString(&aName,objTypeName,TRUE);
  58. strcpy(pObjInfo->Type,aName.Buffer);
  59. RtlFreeAnsiString(&aName);
  60. if(wcscmp(objTypeName->Buffer,L"SymbolicLink")==0)
  61. {
  62. symLink=obj;
  63. RtlUnicodeStringToAnsiString(&aName,&(symLink->LinkTarget),TRUE);
  64. strcpy(pObjInfo->SymLink,aName.Buffer);
  65. RtlFreeAnsiString(&aName);
  66. }
  67. else
  68. {
  69. strcpy(pObjInfo->SymLink,"");
  70. }
  71. bytesRet+=sizeof(OBJ_INFO);
  72. DbgPrint("Object Name:%s Object Type:%s SymLink:%s\n",pObjInfo->ObjName,pObjInfo->Type,pObjInfo->SymLink);
  73. pDirEntry=pDirEntry->ChainLink;
  74. pObjInfo++;
  75. }
  76. }
  77. ObDereferenceObject(objDir);
  78. ZwClose(dirHandle);
  79. *RetSize=bytesRet;
  80. *retBuf=pBuffer;
  81. return status;
  82. }
复制代码

具体的看附件。







结束:
这里只介绍了主要的对象目录的一些实现,Windows内核对象要挖掘的东西是很多的,这里只把关于实现WinObj的方面说了一下。
更具体的关于内核对象的可以看一下Sysnap大侠的文章
http://bbs.kanxue.com/showthread.php?t=74430




说明:
我没有在应用程序中加载驱动,大家可以用工具先加载好驱动再运行应用程序。
objAPP.jpg

WinObjSYS.rar

53 KB, 下载次数: 665

WinObjAPP.part1.rar

1.86 MB, 下载次数: 408

WinObjAPP.part2.rar

1.67 MB, 下载次数: 394

WinObjRing3.part1.rar

1.86 MB, 下载次数: 365

WinObjRing3.part2.rar

1.86 MB, 下载次数: 406

WinObjRing3.part3.rar

97 KB, 下载次数: 597

Rank: 4

发表于 2009-7-12 00:45:25 |显示全部楼层
WinObj根本就不需要驱动。。。

Rank: 5Rank: 5

发表于 2009-7-12 01:53:00 |显示全部楼层
winobj确实不需要驱动,winobjex才需要~

还是支持下楼主~最近也在搞一个SYSINTERNALS的东东,无奈工作太忙,只能断断续续写一点~

羡慕楼上的有闲人

Rank: 1

发表于 2009-7-12 01:54:21 |显示全部楼层
如果lz是抄的请ls拿出证据,不要无缘无故扣人家声望

Rank: 4

发表于 2009-7-12 02:00:56 |显示全部楼层
我没说他是抄的

LZ不符合xIkUg的要求

他只是在实现他自己的WinObj,并不是Sysinternals里面的WinObj的真实实现。。。

Rank: 1

发表于 2009-7-12 02:03:19 |显示全部楼层
引用第5楼diyhack于2009-07-11 23:00发表的  :
我没说他是抄的
LZ不符合xIkUg的要求
他只是在实现他自己的WinObj,并不是Sysinternals里面的WinObj的真实实现。。。
哦,原来这年头山寨比创新受用啊,我真向ls学习了

Rank: 9Rank: 9Rank: 9

发表于 2009-7-12 02:05:46 |显示全部楼层
讲知识点,符合要求。。。
悟空,退下,为师一个人就够了

Rank: 4

发表于 2009-7-12 02:07:13 |显示全部楼层
如果是创新的话就不要写是SysinternalsSuite里的WinObj。。。

如果Lz写的是自己实现WinObj,我肯定给他加分。。。

BTW:欢迎LS的LS从火星回到地球

Rank: 1

发表于 2009-7-12 02:12:12 |显示全部楼层
引用第8楼diyhack于2009-07-11 23:07发表的  :
如果是创新的话就不要写是SysinternalsSuite里的WinObj。。。
如果Lz写的是自己实现WinObj,我肯定给他加分。。。
BTW:欢迎LS的LS从火星回到地球
谢谢,哈哈。。。
只是希望牛们客观一些嘛,这里不是声望竞技场,声望也不应该成为一种权力和劳动成果剥夺的象征品

Rank: 5Rank: 5

发表于 2009-7-12 04:09:10 |显示全部楼层
论坛还是应该有奖有罚。扣声望只对那种故意捣乱的同学。
楼主这样付出了努力的好同学,还是应该表扬的~给楼主加个声望

当然DIYHACK同学说的也没错,代码确实粗陋了一点,也没有完全符合XIKUG的题目,楼主继续努力吧

Rank: 4

发表于 2009-7-12 10:08:31 |显示全部楼层
同意MJ,楼主继续努力,尽量还其本色~

Rank: 2

发表于 2009-7-12 11:28:50 |显示全部楼层
谢谢大家支持
我确实不知道winobj的具体实现方法,只是按照自己知道的方法做的
另外请问RING3下怎么实现这个功能,希望牛们来些提示哈

Rank: 1

发表于 2009-7-12 12:26:21 |显示全部楼层
楼主辛苦了,这才是学习者的样子,支持!
某些要声望的反思一下。。

Rank: 4

发表于 2009-7-12 14:55:35 |显示全部楼层
好~~~

Rank: 4

发表于 2009-7-12 18:47:38 |显示全部楼层
看看ZwXxxxx里面跟Object有关的函数,或者直接IDA把WinObj给R了~

Rank: 2

发表于 2010-2-16 22:05:29 |显示全部楼层
好代码!谢谢LZ~

Rank: 1

发表于 2010-3-25 16:05:27 |显示全部楼层
好代码!谢谢LZ~

Rank: 1

发表于 2010-5-10 14:55:51 |显示全部楼层
谢谢啦,下载回去看看~~支持下·

Rank: 1

发表于 2010-5-10 15:27:40 |显示全部楼层
不错,sysinternals 里面确实有很多好东西
您需要登录后才可以回帖 登录 | 立即加入

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

GMT+8, 2019-6-17 12:30 , Processed in 0.045944 second(s), 11 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部