宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 2247|回复: 0

[转载] 恢复 SSDT

[复制链接]
  • TA的每日心情
    开心
    2024-12-9 18:45
  • 签到天数: 124 天

    [LV.7]常住居民III

    admin 发表于 2009-12-12 23:49:53 | 显示全部楼层 |阅读模式

    欢迎您注册加入!这里有您将更精采!

    您需要 登录 才可以下载或查看,没有账号?注册

    x
    // 只贴 ring3 部分,这也是最主要的代码,驱动只是负责把得到的原始值写到 ssdt,其他啥也不做
    // 简单说一下,找 KiServiceTable 表过程, 是直接读取原始内核文件,寻找输出符号,然后结合重定位信息,谁向 KeServiceDescriptorTable 赋值,从而确定 KiServiceTable 的位置。
    // 这是第一写驱动相关的代码,写的很挫,高手就不用看了。

    1. #include <tchar.h>
    2. #include <Windows.h>
    3. #include <winioctl.h>
    4. #include "RSSDT.h"
    5. /*
    6. // RSSDT.h
    7. typedef struct _tagSST_ENTRY
    8. {
    9. ULONG cbSize;
    10. ULONG Index;
    11. ULONG OrgValue; // 类型 RVA, 传给驱动的时做 Set Value
    12. ULONG NowValue; // 类型 RVA, 传给驱动做 get value
    13. } SST_ENTRY, *PSST_ENTRY;
    14. #define IOCTL_RSSDT_ENTRY_SET CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
    15. */
    16. ULONG Rav2Raw(PVOID pFileData, ULONG rav)
    17. {
    18. PIMAGE_DOS_HEADER pDosH;
    19. PIMAGE_NT_HEADERS pNtH;
    20. PIMAGE_SECTION_HEADER pSectH;
    21. ULONG Index;

    22. pDosH = (PIMAGE_DOS_HEADER)pFileData;
    23. pNtH = (PIMAGE_NT_HEADERS)((ULONG)pFileData + pDosH->e_lfanew);
    24. pSectH = IMAGE_FIRST_SECTION(pNtH);

    25. if ( rav >= 0 && rav < pSectH->VirtualAddress )
    26.    return rav;

    27. for ( Index = 0; Index < pNtH->FileHeader.NumberOfSections; Index++ )
    28. {
    29.    if ( rav >= pSectH->VirtualAddress && rav < pSectH->VirtualAddress + pSectH->Misc.VirtualSize )
    30.     return rav - pSectH->VirtualAddress + pSectH->PointerToRawData;
    31.    pSectH++;
    32. }

    33. return (ULONG)-1;
    34. }
    35. PVOID NTAPI
    36. GetImageDirEntry(
    37.      IN ULONG ImageBase,
    38.      IN ULONG DirIndex,
    39.      OUT OPTIONAL PIMAGE_NT_HEADERS* ppNtH,
    40.      OUT OPTIONAL PIMAGE_DATA_DIRECTORY* ppDataDir
    41.      )
    42. {
    43. PIMAGE_DOS_HEADER pDosH;
    44. PIMAGE_NT_HEADERS pNtH;
    45. PIMAGE_DATA_DIRECTORY pDataDir;

    46. pDosH = (PIMAGE_DOS_HEADER)ImageBase;
    47. if ( pDosH->e_magic != IMAGE_DOS_SIGNATURE )
    48. {
    49.    return NULL;
    50. }

    51. pNtH = (PIMAGE_NT_HEADERS)(ImageBase + pDosH->e_lfanew);
    52. if ( pNtH->Signature != IMAGE_NT_SIGNATURE )
    53. {
    54.    return NULL;
    55. }

    56. if ( ppNtH != NULL )
    57. {
    58.    *ppNtH = pNtH;
    59. }

    60. pDataDir = &pNtH->OptionalHeader.DataDirectory[DirIndex];

    61. if ( pDataDir->VirtualAddress == 0 )
    62. {
    63.    return NULL;
    64. }

    65. if ( ppDataDir != NULL )
    66. {
    67.    *ppDataDir = pDataDir;
    68. }

    69. return (PVOID)(ImageBase + Rav2Raw((PVOID)ImageBase, pDataDir->VirtualAddress));
    70. }
    71. typedef BOOLEAN (NTAPI* LOOPUPXREF_CALLBACK)(PULONG RefAddr, PVOID Param);
    72. ULONG NTAPI // 返回找到的引用个数
    73. pLookupImageXRef(
    74.      IN ULONG ImageBase, // 参考地址
    75.      IN PIMAGE_DATA_DIRECTORY pBrDir,
    76.      IN PIMAGE_BASE_RELOCATION pBr,
    77.      IN ULONG SymAddr,
    78.      IN LOOPUPXREF_CALLBACK LookupXRefCallback, // 回调
    79.      IN PVOID pParam
    80.      )
    81. {
    82. ULONG nRefCount = 0;

    83. __try
    84. {
    85.    ULONG Size = 0;
    86.    while ( pBr->SizeOfBlock != 0 && Size < pBrDir->Size )
    87.    {
    88.     PWORD pRelItem = (PWORD)(pBr + 1);
    89.     PIMAGE_BASE_RELOCATION pNextBr = (PIMAGE_BASE_RELOCATION)((ULONG)pBr + pBr->SizeOfBlock);
    90.    
    91.     while ( (ULONG)pRelItem < (ULONG)pNextBr )
    92.     {
    93.      ULONG RefBlock = Rav2Raw((PVOID)ImageBase, pBr->VirtualAddress);
    94.    
    95.      if ( (pRelItem[0] >> 12) == 3 )
    96.      {
    97.       PULONG RefAddr = (PULONG)(ImageBase + RefBlock + (pRelItem[0] & 0x0FFF));
    98.      
    99.       // 验证内存是否有效
    100.       if ( !IsBadReadPtr(RefAddr, 1) && RefAddr[0] == SymAddr )
    101.       {
    102.        nRefCount++;
    103.        if ( LookupXRefCallback(RefAddr, pParam) )
    104.         break;
    105.       }
    106.      }
    107.    
    108.      pRelItem++;
    109.     }
    110.    
    111.     Size += pBr->SizeOfBlock;
    112.     pBr = pNextBr;
    113.    }
    114. }
    115. __except ( EXCEPTION_EXECUTE_HANDLER )
    116. {
    117.    // DbgPrint("pLookupImageXRef: Found a Exception!\n");
    118. }

    119. return nRefCount;
    120. }
    121. ULONG NTAPI
    122. LookupImageXRef(
    123.      IN ULONG ImageBase, // 有效地址
    124.      IN ULONG SymAddr,
    125.      IN LOOPUPXREF_CALLBACK LookupXRefCallback, // 回调
    126.      IN PVOID Param
    127.      )
    128. {
    129. if ( LookupXRefCallback != NULL )
    130. {
    131.    PIMAGE_DATA_DIRECTORY pBrDir;
    132.    PIMAGE_BASE_RELOCATION pBr;
    133.   
    134.    pBr = GetImageDirEntry(ImageBase, IMAGE_DIRECTORY_ENTRY_BASERELOC, NULL, &pBrDir);
    135.    if ( pBr != NULL )
    136.    {
    137.     return pLookupImageXRef(ImageBase, pBrDir, pBr, SymAddr, LookupXRefCallback, Param);
    138.    }
    139. }

    140. return 0;
    141. }
    142. typedef struct tag_SYSTEM_SERVICE_TABLE {
    143. PULONG ServiceTable; // array of entry points
    144. PULONG CounterTable; // array of usage counters
    145. ULONG ServiceLimit; // number of table entries
    146. PCHAR ArgumentTable; // array of argument counts
    147. } SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE, **PPSYSTEM_SERVICE_TABLE;
    148. BOOLEAN WINAPI LookXRefCallback(PULONG pRefAddr, PVOID pParam)
    149. {
    150. USHORT OpCode = *((PUSHORT)pRefAddr - 1);
    151. if ( OpCode == 0x05C7 ) // mov ds:_KeServiceDescriptorTable, offset _KiServiceTable
    152. {
    153.    if ( pParam != NULL )
    154.    {
    155.     *(PULONG)pParam = pRefAddr[1]; // KiServiceTable
    156.    }
    157.   
    158.    return FALSE;
    159. }

    160. return TRUE;
    161. }
    162. BOOL GetSSTEntry(PCTSTR pszServiceName, PSST_ENTRY pSSTEntry)
    163. {
    164. HANDLE hFile, hFileMap;
    165. LPVOID pFileData;
    166. HMODULE hNtdll;
    167. FARPROC pfnService;
    168. BOOL bResult;
    169. TCHAR szNtoskrnlPath[MAX_PATH];

    170. hNtdll = GetModuleHandle(_T("ntdll.dll"));
    171. pfnService = GetProcAddress(hNtdll, pszServiceName);
    172. if ( pfnService == NULL || *(PBYTE)pfnService != 0xB8 )
    173.    return FALSE;

    174. // mov eax, ??
    175. pSSTEntry->Index = *(PULONG)((PBYTE)pfnService + 1);

    176. GetSystemDirectory(szNtoskrnlPath, MAX_PATH);
    177. _tcscat(szNtoskrnlPath, _T("\\ntoskrnl.exe")); // or ntkrnlpa.exe

    178. hFile = CreateFile(szNtoskrnlPath, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ,
    179.    NULL, OPEN_EXISTING, 0, NULL);
    180. if ( hFile == INVALID_HANDLE_VALUE )
    181.    return FALSE;

    182. hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    183. CloseHandle(hFile);

    184. if ( hFileMap == NULL )
    185.    return FALSE;

    186. pFileData = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
    187. CloseHandle(hFileMap);

    188. if ( NULL == pFileData )
    189.    return FALSE;

    190. bResult = FALSE;
    191. __try
    192. {
    193.    PIMAGE_DOS_HEADER pDosH;
    194.    PIMAGE_NT_HEADERS pNtH;
    195.    PIMAGE_EXPORT_DIRECTORY pExpDir;
    196.    PULONG pFunName, pFunAddr;
    197.    PUSHORT pFunNameOrd;
    198.    ULONG Index;
    199.   
    200.    pDosH = (PIMAGE_DOS_HEADER)pFileData;
    201.    pNtH = (PIMAGE_NT_HEADERS)((ULONG)pFileData + pDosH->e_lfanew);
    202.    pExpDir = (PIMAGE_EXPORT_DIRECTORY)((ULONG)pFileData + pNtH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    203.   
    204.    pFunName = (PULONG)((ULONG)pFileData + Rav2Raw(pFileData, pExpDir->AddressOfNames));
    205.    pFunNameOrd = (PUSHORT)((ULONG)pFileData + Rav2Raw(pFileData, pExpDir->AddressOfNameOrdinals));
    206.    pFunAddr = (PULONG)((ULONG)pFileData + Rav2Raw(pFileData, pExpDir->AddressOfFunctions));
    207.   
    208.    for ( Index = 0; Index < pExpDir->NumberOfNames; Index++ )
    209.    {
    210.     PCSTR pName = (PCSTR)((ULONG)pFileData + Rav2Raw(pFileData, pFunName[Index]));
    211.     if ( strcmp(pName, "KeServiceDescriptorTable") == 0 )
    212.     {
    213.      ULONG _KiServiceTable, _KeServiceDescriptorTable; // 类型都是 va
    214.    
    215.      _KiServiceTable = 0;
    216.      _KeServiceDescriptorTable = pNtH->OptionalHeader.ImageBase + pFunAddr[pFunNameOrd[Index]];
    217.    
    218.      LookupImageXRef((ULONG)pFileData, _KeServiceDescriptorTable, LookXRefCallback, &_KiServiceTable);
    219.      if ( _KiServiceTable != 0 )
    220.      {
    221.       PULONG ServiceTable;
    222.       _KiServiceTable -= pNtH->OptionalHeader.ImageBase;
    223.      
    224.       ServiceTable = (PULONG)((ULONG)pFileData + Rav2Raw(pFileData, _KiServiceTable));
    225.       pSSTEntry->OrgValue = ServiceTable[pSSTEntry->Index] - pNtH->OptionalHeader.ImageBase;
    226.      }
    227.    
    228.      bResult = TRUE;
    229.      break;
    230.     }
    231.    }
    232. }
    233. __except ( EXCEPTION_EXECUTE_HANDLER )
    234. {
    235.    bResult = FALSE;
    236. }

    237. UnmapViewOfFile(pFileData);
    238. return bResult;

    239. }
    240. HANDLE GetServiceByName(IN PCTSTR pszServiceName, OUT OPTIONAL SC_HANDLE* pScManager)
    241. {
    242. SC_HANDLE hScManager, hScService;

    243. hScService = NULL;
    244. hScManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    245. if ( pScManager != NULL )
    246.    *pScManager = hScManager;

    247. if ( hScManager != NULL )
    248. {
    249.    hScService = OpenService(hScManager, pszServiceName, SERVICE_ALL_ACCESS);
    250.    if ( pScManager == NULL )
    251.     CloseServiceHandle(hScManager);
    252. }

    253. return hScService;
    254. }
    255. SC_HANDLE InstallDriver(IN PCTSTR pszServiceName, IN PCTSTR pszDriverFile)
    256. {
    257. SC_HANDLE hScManager, hScService;

    258. hScManager = NULL;
    259. hScService = GetServiceByName(pszServiceName, &hScManager);

    260. if ( hScService == NULL && hScManager != NULL )
    261. {
    262.    hScService = CreateService(hScManager, pszServiceName, pszServiceName, SERVICE_ALL_ACCESS,
    263.     SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, pszDriverFile, NULL,
    264.     NULL, NULL, NULL, NULL
    265.     );
    266.    // GetLastError();
    267. }

    268. if ( hScManager != NULL )
    269.    CloseServiceHandle(hScManager);

    270. return hScService;
    271. }
    272. BOOL UninstallDriver(SC_HANDLE hScService)
    273. {
    274. SERVICE_STATUS Status;

    275. if ( ControlService(hScService, SERVICE_CONTROL_STOP, &Status) )
    276. {
    277.    DeleteService(hScService);
    278.    CloseServiceHandle(hScService);
    279.   
    280.    return TRUE;
    281. }
    282. // GetLastError();

    283. return FALSE;
    284. }
    285. BOOL ResetSSTEntry(PCSTR lpServiceName)
    286. {
    287. SC_HANDLE hScService;
    288. HANDLE hDevice;
    289. SST_ENTRY SstEntry;
    290. ULONG cbReturn;
    291. TCHAR szDriverPath[MAX_PATH];
    292. PTSTR pszDriverName;
    293. BOOL bResult;

    294. SstEntry.cbSize = sizeof (SST_ENTRY);
    295. if ( !GetSSTEntry(lpServiceName, &SstEntry) )
    296.    return FALSE;

    297. GetModuleFileName(NULL, szDriverPath, MAX_PATH);
    298. pszDriverName = _tcsrchr(szDriverPath, _T('\\'));
    299. _tcscpy(pszDriverName, _T("\\RSSDT.sys"));

    300. hScService = GetServiceByName(_T("RSSDT"), NULL);
    301. if ( hScService == NULL )
    302. {
    303.    hScService = InstallDriver(_T("RSSDT"), szDriverPath);
    304.    if ( hScService == NULL )
    305.     return FALSE;
    306. }

    307. bResult = FALSE;
    308. if ( StartService(hScService, 0, NULL) || GetLastError() == ERROR_ALREADY_EXISTS )
    309. {
    310.    hDevice = CreateFile(_T("\\\\.\\RSSDT"),
    311.     GENERIC_READ,
    312.     FILE_SHARE_READ | FILE_SHARE_WRITE,
    313.     NULL,
    314.     OPEN_EXISTING,
    315.     0,
    316.     NULL
    317.     );
    318.    GetLastError();
    319.   
    320.    if ( hDevice != INVALID_HANDLE_VALUE )
    321.    {
    322.     bResult = DeviceIoControl(hDevice, IOCTL_RSSDT_ENTRY_SET, &SstEntry, sizeof (SstEntry),
    323.      &SstEntry, sizeof (SstEntry), &cbReturn, NULL);
    324.    
    325.     CloseHandle(hDevice);
    326.    }
    327. }

    328. UninstallDriver(hScService);
    329. return bResult;
    330. }
    331. #if 1
    332. int __cdecl main()
    333. {
    334. ResetSSTEntry("NtCreateKey");
    335. ResetSSTEntry("NtCreatePagingFile");
    336. ResetSSTEntry("NtEnumerateValueKey");
    337. ResetSSTEntry("NtOpenKey");
    338. ResetSSTEntry("NtQueryKey");
    339. ResetSSTEntry("NtQueryValueKey");
    340. ResetSSTEntry("NtSetSystemPowerState");

    341. return 0;
    342. }
    343. #endif
    复制代码
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    免责声明

    本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

    QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

    Copyright © 2001-2023 Discuz! Team. GMT+8, 2025-5-8 13:37 , File On Powered by Discuz! X3.49

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