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

【原创】分析了一下360安全卫士的HOOK [复制链接]

Rank: 4

发表于 2009-10-8 16:45:21 |显示全部楼层
分析了一下360的HOOK,通过直接hook KiFastCallEntry实现对所有系统调用的过滤。
我分析的版本如下:
主程序版本: 6.0.1.1003
HookPort.sys版本: 1, 0, 0, 1005
HookPort.sys的TimeStamp: 4A8D4AB8

简单说明:360把所有被hook的系统服务的过滤函数放在了一个表里,索引即对应的系统服务在该过滤函数表中的索引。
所有列出来的函数都会被hook掉的,是否处理指某个系统服务有没有相应的过滤函数进行处理,拒绝还是放行就是在过滤函数中完成判断的。
不处理的系统服务,将会直接调用原始服务例程。
函数如下:
服务名称                    索引    是否处理    备注
==============================================================================
NtCreateKey                    0x00    否
NtQueryValueKey                0x01    是
NtDeleteKey                    0x02    是
NtDeleteValueKey            0x03    是
NtRenameKey                    0x04    是
NtReplaceKey                0x05    是
NtRestoreKey                0x06    是
NtSetValueKey                0x07    是
NtCreateFile                0x08    是
NtFsControl                    0x09    是
NtSetInformationFile         0x0A    是
NtWriteFile                    0x0B    是
NtWriteFileGather            0x0B    是        //和NtWriteFile共用一个过滤函数
NtCreateProcess                0x0D    是
NtCreateProcessEx            0x0E    是
NtCreateUserProcess            0x0F    是        //Only on Vista or later
NtCreateThread                0x10    是
NtCreateThreadEx            0x10    是        //和NtCreateThread共用一个过滤函数,for vista or later
NtOpenThread                0x11    是
NtDeleteFile                0x12    是
NtOpenFile                    0x13    是
NtReadVirtualMemory            0x14    否
NtTerminateProcess            0x15    是
NtQueueApcThread            0x16    是
NtSetContextThread            0x17    是
NtSetInformationThread        0x18    否
NtProtectVirtualMemory        0x19    否
NtWriteVirtualMemory        0x1A    是
NtAdjustGroupToken            0x1B    否
NtAdjustPrivilegesToken     0x1C    否
NtRequestWaitReplyPort        0x1D    是
NtCreateSection                0x1E    是
NtOpenSecton                0x1F    是
NtCreateSymbolicLinkObject    0x20    是
NtOpenSymbolicLinkObject    0x21    否
NtLoadDriver                0x22    是
NtUnloadDriver                0x22    是        //和NtLoadDriver共用一个过滤函数
NtQuerySystemInformation    0x23    是
NtSetSystemTime                0x25    否
NtSystemDebugControl        0x26    是
NtUserBuildHwndList            0x27    是
NtUserQueryWindow            0x28    是
NtUserFindWindowEx            0x29    是
NtUserWindowFromPoint        0x2A    是
NtUserMessageCall            0x2B    是
NtUserPostMessage            0x2C    是
NtUserSetWindowsHookEx        0x2D    是
NtUserPostThreadMessage        0x2E    是
NtOpenProcess                0x2F    是
NtDeviceIoControlFile        0x30    是
NtUserSetParent                0x31    是
NtOpenKey                    0x32    是
NtDuplicateObject            0x33    是
NtResumeThread                0x34    否
NtUserChildWindowFromPointEx 0x35    是
NtUserDestroyWindow            0x36    是
NtUserInternalGetWindowText    0x37    否
NtUserMoveWindow            0x38    是        //和NtSetParent共用一个过滤函数
NtUserRealChildWindowFromPoint 0x39 是        //和NtUserChildWindowFromPointEx共用一个过滤函数
NtUserSetInformationThread    0x3A    否
NtUserSetInternalWindowPos    0x3B    是        //和NtSetParent共用一个过滤函数
NtUserSetWindowLong            0x3C    是        //和NtSetParent共用一个过滤函数
NtUserSetWindowPlacement    0x3D    是        //和NtSetParent共用一个过滤函数        
NtUserSetWindowPos            0x3E    是        //和NtSetParent共用一个过滤函数
NtUserSetWindowRgn            0x3F    是        //和NtSetParent共用一个过滤函数        
NtUserShowWindow            0x40    是
NtUserShowWindowAsync        0x41    是        //和NtUserShowWindow共用一个过滤函数
NtQueryAttributesFile        0x42    否
NtUserSendInput                0x43    否
NtAlpcSendWaitReceivePort    0x44    是        //for vista or later
NtUnmapViewOfSection        0x46    是
NtUserSetWinEventHook        0x47    否
NtSetSecurityObject            0x48    是
NtUserCallHwndParamLock        0x49    是
NtUserRegisterUserApiHok    0x4A    否

           

Rank: 2

发表于 2009-10-8 18:45:55 |显示全部楼层
所噶~~
把其他的钩子也分析一下。

Rank: 1

发表于 2009-10-8 23:56:12 |显示全部楼层
借教主的宝地贴份代码,菜鸟之作,各位牛牛请勿见笑

bfsdrv.rar

70 KB, 下载次数: 890

Rank: 3Rank: 3

发表于 2009-10-9 00:01:11 |显示全部楼层
膜拜教主~
教众特来膜拜教主~
FsFilter 发的什么代码,看看。

Rank: 4

发表于 2009-10-9 00:08:45 |显示全部楼层
总共有6个驱动吧

Rank: 3Rank: 3

发表于 2009-10-9 10:30:56 |显示全部楼层
牛啊。
问:楼主是如何分析的,使用了什么工具?

Rank: 9Rank: 9Rank: 9

发表于 2009-10-9 12:26:31 |显示全部楼层
引用第5楼goodonline于2009-10-09 07:30发表的  :
牛啊。
问:楼主是如何分析的,使用了什么工具?
windbg+ida
悟空,退下,为师一个人就够了

Rank: 1

发表于 2009-10-9 13:30:35 |显示全部楼层
洋气.很洋气

Rank: 1

发表于 2009-10-9 17:00:55 |显示全部楼层
NtAlpcSendWaitReceivePort    前段时间我写了个hook,对这个函数做处理的,结果很不稳定,不知道360怎么处理的。

Rank: 1

发表于 2009-10-9 17:32:05 |显示全部楼层
该函数原型
  1. NtAlpcSendWaitReceivePort(IN  HANDLE PortHandle,
  2.                                         IN    DWORD SendFlags,
  3.                                         IN    PLPC_MESSAGE SendMessage OPTIONAL,
  4.                                         IN    PVOID InMessageBuffer OPTIONAL,
  5.                                         OUT    PLPC_MESSAGE ReceiveBuffer OPTIONAL,
  6.                                         OUT    PULONG ReceiveBufferSize OPTIONAL,
  7.                                         OUT    PVOID OutMessageBuffer OPTIONAL,
  8.                                             PLARGE_INTEGER Timeout OPTIONAL )
  9. 其中第三个参数PLPC_MESSAGE SendMessage 保存很多有用信息。
  10. typedef struct _LPC_MESSAGE {
  11.     USHORT                  DataLength;
  12.     USHORT                  Length;
  13.     USHORT                  MessageType;
  14.     USHORT                  DataInfoOffset;
  15.     CLIENT_ID               ClientId;
  16.     ULONG                   MessageId;
  17.     ULONG                   CallbackId;
  18. } LPC_MESSAGE, *PLPC_MESSAGE;
  19. 这个结构大体是这个原型,在wrk中是
  20. typedef struct _PORT_MESSAGE {
  21.     union {
  22.         struct {
  23.             CSHORT DataLength;
  24.             CSHORT TotalLength;
  25.         } s1;
  26.         ULONG Length;
  27.     } u1;
  28.     union {
  29.         struct {
  30.             CSHORT Type;
  31.             CSHORT DataInfoOffset;
  32.         } s2;
  33.         ULONG ZeroInit;
  34.     } u2;
  35.     union {
  36.         LPC_CLIENT_ID ClientId;
  37.         double DoNotUseThisField;       // Force quadword alignment
  38.     };
  39.     ULONG MessageId;
  40.     union {
  41.         LPC_SIZE_T ClientViewSize;          // Only valid on LPC_CONNECTION_REQUEST message
  42.         ULONG CallbackId;                   // Only valid on LPC_REQUEST message
  43.     };
  44. //  UCHAR Data[];
  45. } PORT_MESSAGE, *PPORT_MESSAGE;
复制代码

LPC_MESSAGE后是一个DATA,DataLength是这个DATA区的大小,DATA中保存了很多有用的信息

Rank: 1

发表于 2009-10-9 22:16:56 |显示全部楼层
强悍~~

Rank: 1

发表于 2009-10-9 22:27:41 |显示全部楼层
学习。。

Rank: 2

发表于 2009-10-10 12:15:36 |显示全部楼层
sysenter会调用这个NT!KiFastCallEntry(不要和NTDLL!KiFastSystemCall混淆了,呵呵^)
int 2e会调用NT!KiSystemService
其实NT!KiSystemService也跳到NT!KiFastCallEntry处(不是头部哦)
。。。

Rank: 1

发表于 2009-10-10 19:45:16 |显示全部楼层
这个地方的Hook原来我用XueTr也看到了,不过没研究这么深。
刚仔细搜索了一下,找到2~3篇相关的文章,其中说到KiFastCallEntry入口后:

# eax中是服务例程ID
# edx指向用户堆栈,服务例程函数调用参数可以通过其得到

看上去还是挺简单的,有空的时候可以写个POC做下过滤试试看

Rank: 4

发表于 2009-10-10 20:42:52 |显示全部楼层
KiFastCallEntry的Inlinehook随便一个ARK都可以看到,内部的处理才是关键

Rank: 2

发表于 2009-10-11 13:26:43 |显示全部楼层
3 楼你用的是F5,呵呵。。这个代码看起来很不顺眼。

Rank: 1

发表于 2009-10-12 17:53:13 |显示全部楼层
膜拜一个

Rank: 1

发表于 2009-10-12 18:19:49 |显示全部楼层
引用第15楼icezy于2009-10-11 10:26发表的  :
3 楼你用的是F5,呵呵。。这个代码看起来很不顺眼。
没用F5 纯手工 只是代码风格模仿F5罢了

Rank: 2

发表于 2009-10-15 20:09:21 |显示全部楼层
期待着教主的继续分析啊

Rank: 4

发表于 2009-10-15 20:26:30 |显示全部楼层
你来晚了…
您需要登录后才可以回帖 登录 | 立即加入

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

GMT+8, 2019-7-16 21:17 , Processed in 0.044895 second(s), 11 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部