Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Hàm tương tự GetModuleHandle, GetProcAddress trong Kernel

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    61

    Mặc định Hàm tương tự GetModuleHandle, GetProcAddress trong Kernel

    Chào mọi người, cho mình hỏi trong kernel có hàm nào tương tự 2 hàm GetModuleHandle,GetProcAddress trong usermode không ? hôm bữa search thấy có mà quên không lưu lại tên giờ không biết kiếm ở đâu. Hiện tại thì mình phải dùng mấy hàm được hướng dẫn trong này http://alter.org.ua/docs/nt_kernel/procaddr

    Và mọi người có thể hướng dẫn mình cách lấy địa chỉ hàm ZwTerminateThread với được không? Cảm ơn rất nhiều

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Cách chuẩn mà nhiều người sử dụng là ZwQuerySystemInformation, cách sử dụng thì cũng như NtQuerySystemInformation

    Kevin có đoạn code này:

    Visual C++ Code:
    1. typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY {
    2.     ULONG  Unknown1;
    3.     ULONG  Unknown2;
    4. #ifdef _WIN64
    5.     ULONG Unknown3;
    6.     ULONG Unknown4;
    7. #endif
    8.     PVOID  Base;
    9.     ULONG  Size;
    10.     ULONG  Flags;
    11.     USHORT  Index;
    12.     USHORT  NameLength;
    13.     USHORT  LoadCount;
    14.     USHORT  PathLength;
    15.     CHAR  ImageName[256];
    16. } SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
    17.  
    18. typedef struct _SYSTEM_MODULE_INFORMATION {
    19.     ULONG Count;
    20.     SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
    21. } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
    22.  
    23. PVOID KernelGetModuleBase(PCHAR  pModuleName)
    24. {
    25.     PVOID pModuleBase = NULL;
    26.     PULONG pSystemInfoBuffer = NULL;
    27.  
    28.     __try
    29.     {
    30.         NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;
    31.         ULONG    SystemInfoBufferSize = 0;
    32.        
    33.         status = ZwQuerySystemInformation(SystemModuleInfo, &SystemInfoBufferSize, 0, &SystemInfoBufferSize);
    34.         if (!SystemInfoBufferSize) return NULL;
    35.  
    36.         pSystemInfoBuffer = (PULONG)ExAllocatePool(NonPagedPool, SystemInfoBufferSize*2);
    37.         if (!pSystemInfoBuffer) return NULL;
    38.  
    39.         memset(pSystemInfoBuffer, 0, SystemInfoBufferSize*2);
    40.  
    41.         status = ZwQuerySystemInformation(SystemModuleInfo, pSystemInfoBuffer, SystemInfoBufferSize*2, &SystemInfoBufferSize);
    42.  
    43.         if (NT_SUCCESS(status))
    44.         {
    45.             PSYSTEM_MODULE_ENTRY pSysModuleEntry = ((PSYSTEM_MODULE_INFORMATION)(pSystemInfoBuffer))->Module;
    46.             ULONG i;
    47.            
    48.             for (i = 0; i <((PSYSTEM_MODULE_INFORMATION)(pSystemInfoBuffer))->Count; i++)
    49.             {
    50.                 if (_stricmp(pSysModuleEntry[i].ModuleName + pSysModuleEntry[i].ModuleNameOffset, pModuleName) == 0)
    51.                 {
    52.                     pModuleBase = pSysModuleEntry[i].ModuleBaseAddress;
    53.                     break;
    54.                 }
    55.             }
    56.         }
    57.  
    58.     }
    59.     __except(EXCEPTION_EXECUTE_HANDLER)
    60.     {
    61.         pModuleBase = NULL;
    62.     }
    63.    
    64.     if(pSystemInfoBuffer) ExFreePool(pSystemInfoBuffer);
    65.    
    66.     return pModuleBase;
    67. } // end KernelGetModuleBase()
    68.  
    69. PVOID KernelGetProcAddress( PVOID ModuleBase, PCHAR pFunctionName )
    70. {
    71.     PVOID pFunctionAddress = NULL;
    72.    
    73.     __try
    74.     {
    75. #ifndef WIN9X_SUPPORT
    76.         ULONG size = 0;
    77.         PIMAGE_EXPORT_DIRECTORY exports =(PIMAGE_EXPORT_DIRECTORY)RtlImageDirectoryEntryToData(ModuleBase, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size);
    78.         ULONG addr = (PUCHAR)((ULONG)exports-(ULONG)ModuleBase);
    79. #else
    80.         PIMAGE_DOS_HEADER dos =(PIMAGE_DOS_HEADER) ModuleBase;
    81.         PIMAGE_NT_HEADERS nt  =(PIMAGE_NT_HEADERS)((ULONG) ModuleBase + dos->e_lfanew);
    82.  
    83.         PIMAGE_DATA_DIRECTORY expdir = (PIMAGE_DATA_DIRECTORY)(nt->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT);
    84.         ULONG addr = expdir->VirtualAddress;
    85.         PIMAGE_EXPORT_DIRECTORY exports =(PIMAGE_EXPORT_DIRECTORY)((ULONG) ModuleBase + addr);
    86. #endif
    87.         PULONG functions = (PULONG)((ULONG) ModuleBase + exports->AddressOfFunctions);
    88.         PSHORT ordinals  = (PSHORT)((ULONG) ModuleBase + exports->AddressOfNameOrdinals);
    89.         PULONG names     = (PULONG)((ULONG) ModuleBase + exports->AddressOfNames);
    90.         ULONG  max_name  = exports->NumberOfNames;
    91.         ULONG  max_func  = exports->NumberOfFunctions;
    92.  
    93.         ULONG i;
    94.  
    95.         for (i = 0; i < max_name; i++)
    96.         {
    97.             ULONG ord = ordinals[i];
    98.             if(i >= max_name || ord >= max_func) return NULL;
    99.            
    100.             if (functions[ord] < addr || functions[ord] >= addr + size)
    101.             {
    102.                 if (strcmp((PCHAR) ModuleBase + names[i], pFunctionName)  == 0)
    103.                 {
    104.                     pFunctionAddress =(PVOID)((PCHAR) ModuleBase + functions[ord]);
    105.                     break;
    106.                 }
    107.             }
    108.         }
    109.     }
    110.     __except(EXCEPTION_EXECUTE_HANDLER)
    111.     {
    112.         pFunctionAddress = NULL;
    113.     }
    114.  
    115.     return pFunctionAddress;
    116. } // end KernelGetProcAddress()
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.
    Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.

Các đề tài tương tự

  1. Máy đo đường huyết 3 trong 1 Kernel Multicheck
    Gửi bởi huongviettpol trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 24-09-2012, 10:58 AM
  2. Kernel máy thử tiểu đường 3 trong 1
    Gửi bởi huongviettpol trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 23-07-2012, 08:36 AM
  3. cd /dev/hdb Trong Linux Kernel
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình shell Linux
    Trả lời: 1
    Bài viết cuối: 24-11-2010, 11:37 AM
  4. Calling DLL by LoadLibrary/GetProcAddress Error in service?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 08-12-2009, 09:05 PM
  5. Hàm GetModuleHandle để làm gì vậy
    Gửi bởi honey trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 01-01-2009, 12:15 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn