找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7631|回复: 5

[其它] 老掉牙的无驱动恢复SSDT

  [复制链接]

96

主题

158

回帖

4

精华

核心会员

积分
6513
发表于 2012-5-15 02:34:46 | 显示全部楼层 |阅读模式
  1. // RestoreSSDT.cpp : Defines the entry point for the console application.
  2. ////無驅動回復SSDT

  3. //#include "stdafx.h"
  4. #include <stdio.h>
  5. #include <tchar.h>
  6. #include <windows.h>
  7. #include <shlwapi.h>
  8. #include <iostream>
  9. using namespace std;

  10. typedef LONG NTSTATUS;

  11. #define SystemModuleInfo        11
  12. #define RVATOVA(base,offset) ((PVOID)((DWORD)(base)+(DWORD)(offset)))   
  13. #define STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)   
  14. #define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
  15. #define ibaseDD *(PDWORD)&ibase

  16. typedef struct {  
  17.     WORD    offset:12;  
  18.     WORD    type:4;  
  19. } IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;


  20. typedef struct _MEMORY_CHUNKS {  
  21.     ULONG Address;  
  22.     PVOID Data;  
  23.     ULONG Length;  
  24. } MEMORY_CHUNKS, *PMEMORY_CHUNKS;  


  25. typedef struct _SYSTEM_MODULE_INFORMATION {//Information Class 11   
  26.     ULONG    Reserved[2];  
  27.     PVOID    Base;  
  28.     ULONG    Size;  
  29.     ULONG    Flags;  
  30.     USHORT    Index;  
  31.     USHORT    Unknown;  
  32.     USHORT    LoadCount;  
  33.     USHORT    ModuleNameOffset;  
  34.     CHAR    ImageName[256];  
  35. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;  


  36. typedef struct {  
  37.     DWORD    dwNumberOfModules;  
  38.     SYSTEM_MODULE_INFORMATION    smi;  
  39. } MODULES, *PMODULES;  


  40. typedef struct _tagSSDT {  
  41.     PVOID pvSSDTBase;  
  42.     PVOID pvServiceCounterTable;  
  43.     ULONG ulNumberOfServices;  
  44.     PVOID pvParamTableBase;  
  45. } SSDT, *PSSDT;


  46. typedef
  47. NTSTATUS
  48. (WINAPI *PFNNtQuerySystemInformation)(      
  49.     DWORD    SystemInformationClass,  
  50.     PVOID    SystemInformation,  
  51.     ULONG    SystemInformationLength,  
  52.     PULONG    ReturnLength  
  53.     );

  54. //typedef
  55. //NTSTATUS
  56. //(WINAPI *NTSystemDebugControl)(
  57.         //IN int nCmd,  
  58.         //IN PVOID pInBuf,  
  59.         //IN ULONG nInLen,   
  60.         //OUT PVOID pOutBuf,  
  61.         //IN ULONG nOutLen,  
  62.         //OUT PULONG nRetLen OPTIONAL
  63.         //);


  64. //typedef
  65. NTSTATUS
  66. (__stdcall *NTSystemDebugControl)(
  67.         IN int nCmd,  
  68.         IN PVOID pInBuf,  
  69.         IN ULONG nInLen,   
  70.         OUT PVOID pOutBuf,  
  71.         IN ULONG nOutLen,  
  72.         OUT PULONG nRetLen OPTIONAL
  73.         );

  74. ///////////////////////////////////////////////////////////

  75. ULONG pBase = NULL;

  76. ///////////////////////////////////////////////////////////
  77. //
  78. //
  79. VOID SetProc(IN ULONG ulIndex, IN PULONG buf )  
  80. {  
  81.     MEMORY_CHUNKS datas;  
  82.     ULONG dwRetLen;  
  83.     datas.Address =(ULONG)pBase + (ulIndex*4);  
  84.     datas.Data = buf;  
  85.     datas.Length = sizeof(LONG);  
  86.     NTSystemDebugControl(0x9, &datas, sizeof(MEMORY_CHUNKS), NULL, 0, &dwRetLen);  
  87.       
  88. }  

  89. ///////////////////////////////////////////////////////////
  90. //
  91. //
  92. DWORD GetHeaders(
  93.         PCHAR ibase,  
  94.         PIMAGE_FILE_HEADER *pfh,  
  95.         PIMAGE_OPTIONAL_HEADER *poh,  
  96.         PIMAGE_SECTION_HEADER *psh)  
  97. {  
  98.     PIMAGE_DOS_HEADER mzhead = (PIMAGE_DOS_HEADER) ibase;  
  99.       
  100.     if ((mzhead->e_magic != IMAGE_DOS_SIGNATURE) || (ibaseDD[mzhead->e_lfanew] != IMAGE_NT_SIGNATURE))  
  101.         return FALSE;  
  102.       
  103.     *pfh = (PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];

  104.     if (((PIMAGE_NT_HEADERS)*pfh)->Signature != IMAGE_NT_SIGNATURE)   
  105.         return FALSE;

  106.     *pfh = (PIMAGE_FILE_HEADER)((PBYTE) *pfh + sizeof(IMAGE_NT_SIGNATURE));
  107.       
  108.     *poh = (PIMAGE_OPTIONAL_HEADER)((PBYTE) *pfh + sizeof(IMAGE_FILE_HEADER));

  109.     if ((*poh)->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
  110.         return FALSE;

  111.     *psh = (PIMAGE_SECTION_HEADER)((PBYTE)*poh+sizeof(IMAGE_OPTIONAL_HEADER));

  112.     return TRUE;
  113. }  


  114. ///////////////////////////////////////////////////////////
  115. //
  116. //
  117. DWORD FindKiServiceTable(HMODULE hModule,DWORD dwKSDT)  
  118. {  
  119.     PIMAGE_FILE_HEADER    pfh;  
  120.     PIMAGE_OPTIONAL_HEADER    poh;  
  121.     PIMAGE_SECTION_HEADER    psh;  
  122.     PIMAGE_BASE_RELOCATION    pbr;  
  123.     PIMAGE_FIXUP_ENTRY    pfe;   
  124.      
  125.     DWORD    dwFixups=0,i,dwPointerRva,dwPointsToRva,dwKiServiceTable;
  126.     BOOL    bFirstChunk;  
  127.     GetHeaders((PCHAR)hModule,&pfh,&poh,&psh);  

  128.     // loop thru relocs to speed up the search   
  129.     if ((poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) &&  
  130.         (!((pfh->Characteristics)&IMAGE_FILE_RELOCS_STRIPPED)))
  131.         {  
  132.          
  133.         pbr = (PIMAGE_BASE_RELOCATION)RVATOVA(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,hModule);  
  134.         
  135.                 bFirstChunk = TRUE;

  136.         // 1st IMAGE_BASE_RELOCATION.VirtualAddress of ntoskrnl is 0   
  137.         while (bFirstChunk || pbr->VirtualAddress)
  138.                 {  
  139.             bFirstChunk = FALSE;
  140.             pfe = (PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));

  141.             for (i=0; i < (pbr->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION)) >> 1; i++, pfe++)
  142.                         {
  143.                 if (pfe->type==IMAGE_REL_BASED_HIGHLOW)
  144.                                 {  
  145.                     dwFixups++;  
  146.                     dwPointerRva=pbr->VirtualAddress+pfe->offset;  
  147.                     // DONT_RESOLVE_DLL_REFERENCES flag means relocs aren't fixed   
  148.                     dwPointsToRva=*(PDWORD)((DWORD)hModule+dwPointerRva)-(DWORD)poh->ImageBase;  
  149.                     // does this reloc point to KeServiceDescriptorTable.Base?   
  150.                     if (dwPointsToRva==dwKSDT)
  151.                                         {  
  152.                         // check for mov [mem32],imm32. we are trying to find   
  153.                         // "mov ds:_KeServiceDescriptorTable.Base, offset _KiServiceTable"   
  154.                         // from the KiInitSystem.   
  155.                         if (*(PWORD)((DWORD)hModule + dwPointerRva-2) == 0x05c7)
  156.                                                 {  
  157.                             // should check for a reloc presence on KiServiceTable here   
  158.                             // but forget it   
  159.                             dwKiServiceTable = *(PDWORD)((DWORD)hModule+dwPointerRva+4)-poh->ImageBase;  
  160.                             return dwKiServiceTable;  
  161.                         }  
  162.                     }  
  163.                      
  164.                 } else {
  165.                     if (pfe->type!=IMAGE_REL_BASED_ABSOLUTE)
  166.                                         {
  167.                         // should never get here   
  168.                                                 // printf("/trelo type %d found at .%X/n",pfe->type,pbr->VirtualAddress+pfe->offset);
  169.                                         }
  170.                                 }

  171.             } // end for

  172.             *(PDWORD)&pbr+=pbr->SizeOfBlock;

  173.         }  // end while

  174.     } // end if
  175.       
  176.     if (!dwFixups)
  177.         {
  178.         // should never happen - nt, 2k, xp kernels have relocation data   
  179.                 // printf("No fixups!/n");
  180.         }
  181.     return 0;  
  182. }


  183. ///////////////////////////////////////////////////////////
  184. //
  185. //
  186. void ReSSDT()  
  187. {
  188.         //MEMORY_CHUNKS        datas;
  189.         HMODULE                        hKernel;
  190.         DWORD                        dwRetLen = 1024 * 800;  
  191.         PLONG                        KernelBase = NULL;      
  192.         DWORD                        dwKSDT;                                        // rva of KeServiceDescriptorTable   
  193.         DWORD                        dwKiServiceTable;                // rva of KiServiceTable   

  194.     PMODULES    pModules=(PMODULES)&pModules;  
  195.     DWORD                dwNeededSize, rc;  
  196.     DWORD                dwKernelBase, dwServices = 0;  
  197.     PCHAR                pKernelName;  
  198.     PDWORD                pService;

  199.     PIMAGE_FILE_HEADER                        pfh;
  200.     PIMAGE_OPTIONAL_HEADER                poh;
  201.     PIMAGE_SECTION_HEADER                psh;

  202.         GetProcAddress(LoadLibrary("NTDLL.DLl"), "NtSystemDebugControl");

  203.         __asm
  204.         {
  205.                 MOV NTSystemDebugControl, EAX
  206.         }

  207.     FARPROC NtQuerySystemInformationAddr = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");

  208.     // get system modules - ntoskrnl is always first there
  209.     rc = ((PFNNtQuerySystemInformation)NtQuerySystemInformationAddr)(SystemModuleInfo, pModules, 4, &dwNeededSize);

  210.     if (rc == STATUS_INFO_LENGTH_MISMATCH)
  211.         {
  212.         pModules = (MODULES *) GlobalAlloc(GPTR, dwNeededSize);
  213.         rc = ((PFNNtQuerySystemInformation) NtQuerySystemInformationAddr)(SystemModuleInfo, pModules, dwNeededSize, NULL);
  214.         }
  215.         else
  216.         {
  217. strange:
  218.         //    printf("Can't Get NtQuerySystemInformation()!/n");
  219.         return;
  220.     }

  221.     if (!NT_SUCCESS(rc)) goto strange;  
  222.       
  223.     // imagebase
  224.     dwKernelBase = (DWORD)pModules->smi.Base;

  225.     // filename - it may be renamed in the boot.ini
  226.     pKernelName = pModules->smi.ModuleNameOffset + pModules->smi.ImageName;

  227.     // map ntoskrnl - hopefully it has relocs
  228.     hKernel = LoadLibraryEx(pKernelName, 0, DONT_RESOLVE_DLL_REFERENCES);

  229.     if (!hKernel)
  230.         {
  231.         //      printf("Load Driver Fail! LastError=%i/n",GetLastError());
  232.                 return;
  233.         }

  234.     GlobalFree(pModules);

  235.     // our own export walker is useless here - we have GetProcAddress :)      
  236.     if (!(dwKSDT = (DWORD)GetProcAddress(hKernel, "KeServiceDescriptorTable")))
  237.         {

  238.         //       printf("Can't Get KeServiceDescriptorTable/n");   
  239.         return;
  240.     }

  241.     // get KeServiceDescriptorTable rva   
  242.     dwKSDT -= (DWORD)hKernel;

  243.     // find KiServiceTable
  244.     if (!(dwKiServiceTable = FindKiServiceTable(hKernel,dwKSDT)))
  245.         {
  246.     //    printf("Can't Get KiServiceTable.../n");
  247.         return;
  248.     }

  249.         // printf("&KiServiceTable==%08X/n/nDumping 'old' ServiceTable:/n/n",dwKiServiceTable+dwKernelBase);
  250.     pBase=(ULONG)dwKiServiceTable+dwKernelBase;
  251.     // let's dump KiServiceTable contents

  252.     // MAY FAIL!!!
  253.     GetHeaders((PCHAR)hKernel, &pfh, &poh, &psh);

  254.     for (pService=(PDWORD)((DWORD)hKernel + dwKiServiceTable);
  255.         *pService - poh->ImageBase < poh->SizeOfImage;
  256.         pService++, dwServices++)
  257.     {
  258.         ULONG ulAddr = *pService-poh->ImageBase + dwKernelBase;
  259.         SetProc(dwServices, &ulAddr);
  260.     //  printf("INDEX:%3X OrgAddr:%8X /r/n",dwServices,ulAddr);   
  261.     }

  262.         //   printf("/n/SSDT Total==%08X/n",dwServices);
  263.     FreeLibrary(hKernel);
  264. }



  265. ///////////////////////////////////////////////////////////
  266. //
  267. //
  268. int main(int argc, char* argv[])
  269. {
  270.         ReSSDT();
  271.         //printf("Hello World!\n");
  272.         return 0;
  273. }

复制代码
source Restore SSDT_20120505_01.rar (17.54 KB, 下载次数: 5015)

别人的作品, 忘记在哪看到的

po在此当备份

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-5-15 20:24:53 | 显示全部楼层
SystemDebugControl早已没用啦,可惜.

以前有些代码利用这个函数实现内核内存读写,隐藏进程等,后来微软把它给封了.

现在是只有用驱动了.{:soso_e101:}
我就是嗷嗷叫的老马了......

96

主题

158

回帖

4

精华

核心会员

积分
6513
 楼主| 发表于 2012-5-15 21:26:57 | 显示全部楼层
阿~~~~~~

lkd> uf 7c92de4e
7c92de4e b8ff000000      mov     eax,0FFh
7c92de53 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92de58 ff12            call    dword ptr [edx]
7c92de5a c21800          ret     18h

4

主题

183

回帖

3

精华

钻石会员

积分
4965
发表于 2012-5-16 18:43:39 | 显示全部楼层
貌似不好用了,不过还是感谢共享源码

hook前

hook前

hook后

hook后

恢复后

恢复后

0

主题

25

回帖

0

精华

铜牌会员

积分
34
发表于 2012-12-10 20:16:32 | 显示全部楼层
看看看看看看

1

主题

60

回帖

0

精华

铜牌会员

积分
122
发表于 2013-1-11 16:31:08 | 显示全部楼层
win7应该没用了吧
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表