FindProcess???

Тема в разделе "WASM.BEGINNERS", создана пользователем mAgoja, 25 фев 2007.

  1. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    Здравствуйте...
    Подскажите плиз ... как организовать поиск всех процессов в системе???
    Как защитить программу от повторного запуска...???
    Зарание спасибо...
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Подскажите плиз ... как организовать поиск всех процессов в системе???
    см. ToolHelp API в MSDN
    >> Как защитить программу от повторного запуска...???
    cоздавай какой-нибуть обьект ядра (напр. мьютекс) с уникальным именем, и если в GetLastError() будет ERROR_ALLREADY_EXISTS значит один екземпляр программы уже запущен
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Поиск не обязателен. Нужно созать мутант с именем "N", и отслеживать, если при создании ошибка - значит такой мутант уже есть-> прога запущена.
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Блин, Cr4sh опередил!
     
  5. mAgoja

    mAgoja New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    114
    Адрес:
    Ukraine
    Пасибо... усем... я очехлился.. :)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кстати, еще рулит ZwQuerySystemInformation
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    sysenter/int 3e тоже рулит :)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    slow
    да че уж там, сразу делать калгейт через \Device\PhysicalMemory, переходить в привилегированный режим, искать в памяти базу ntoskrnl.exe, искать в ней импорт ZwQuerySystemInformation и дергать, потом IRETD :))
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Great, исходничком не поделишся?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    FreeManCPM

    Код (Text):
    1. #include <windows.h>
    2.  
    3. int __cdecl ring0_execute(LPVOID lpKernelProc);
    4. DWORD ring0_GetKernelBase();
    5.  
    6. /*
    7. * terazin-b by sn0w [at antichat dot ru]
    8. * (c) leaders of antichat team, 2006
    9. *
    10. * greetz: zaco skvoznoy kez
    11. *
    12. */
    13.  
    14. #define _WIN32_WINNT 0x0501
    15. #include <aclapi.h>
    16.  
    17. #define INTNUMBER 0F0h
    18. #define SE_KERNEL_OBJECT 6
    19. #define OBJ_CASE_INSENSITIVE 0x00000040L
    20. #define OBJ_KERNEL_HANDLE 0x00000200L
    21.  
    22. #define INIT_UNICODE(_var,_buffer) \
    23.     UNICODE_STRING _var = { \
    24.     sizeof (_buffer) - sizeof (WORD), \
    25.     sizeof (_buffer), \
    26.     _buffer }
    27.  
    28. #define InitializeObjectAttributes( p, n, a, r, s ) { \
    29.     (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \
    30.     (p)->RootDirectory = r; \
    31.     (p)->Attributes = a; \
    32.     (p)->ObjectName = n; \
    33.     (p)->SecurityDescriptor = s; \
    34.     (p)->SecurityQualityOfService = NULL; \
    35.     }
    36.  
    37. typedef struct _UNICODE_STRING {
    38.     USHORT Length;
    39.     USHORT MaximumLength;
    40.     PWSTR Buffer;
    41. } UNICODE_STRING, *PUNICODE_STRING;
    42.  
    43. typedef struct _OBJECT_ATTRIBUTES {
    44.     ULONG Length;
    45.     HANDLE RootDirectory;
    46.     PUNICODE_STRING ObjectName;
    47.     ULONG Attributes;
    48.     PVOID SecurityDescriptor;
    49.     PVOID SecurityQualityOfService;
    50. } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
    51.  
    52. typedef (__stdcall *_NtOpenSection)(PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, PVOID ObjectAttributes);
    53.  
    54. //
    55. // Kernel Mode Execution routine
    56. //
    57. // return values: 0 - failed to execute, 1 - execute success
    58. // NOTE: when a function fails you can attempt to recall it.
    59. //
    60. // WARNING! when you want to modify functional code you must
    61. // take your attention on automatic variables inside body.
    62. // default stack restore is /add esp, 60h/
    63. //
    64. //
    65. int __cdecl ring0_execute(LPVOID lpKernelProc)
    66. {
    67.     _NtOpenSection NtOpenSection = (_NtOpenSection)GetProcAddress(GetModuleHandle("ntdll.dll"),"NtOpenSection");
    68.     OBJECT_ATTRIBUTES ObAttributes;
    69.     EXPLICIT_ACCESS Access;
    70.     HANDLE hSection;
    71.     LPVOID pbMap;
    72.     PACL OldDacl=NULL, NewDacl=NULL;
    73.     PSECURITY_DESCRIPTOR SecDesc=NULL;
    74.  
    75.     INIT_UNICODE(ObString, L"\\Device\\PhysicalMemory");
    76.  
    77.     InitializeObjectAttributes(&ObAttributes,&ObString,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);
    78.  
    79.     Access.grfAccessPermissions = SECTION_MAP_WRITE;
    80.     Access.grfAccessMode = GRANT_ACCESS;
    81.     Access.grfInheritance = NO_INHERITANCE;
    82.     Access.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
    83.     Access.Trustee.pMultipleTrustee = NULL;
    84.     Access.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
    85.     Access.Trustee.TrusteeType = TRUSTEE_IS_USER;
    86.     Access.Trustee.ptstrName = "CURRENT_USER";
    87.  
    88.     if(NtOpenSection(&hSection,SECTION_MAP_READ|SECTION_MAP_WRITE,&ObAttributes)!=-1)
    89.     {
    90.         NtOpenSection(&hSection,MEM_MAPPED|MEM_PRIVATE,&ObAttributes);
    91.         GetSecurityInfo(hSection,(SE_OBJECT_TYPE)SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,0,0,&OldDacl,0,&SecDesc);
    92.         SetEntriesInAcl(1, &Access, OldDacl, &NewDacl);
    93.         SetSecurityInfo(hSection, (SE_OBJECT_TYPE)SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,NewDacl,NULL);
    94.         CloseHandle(hSection);
    95.         NtOpenSection(&hSection,SECTION_MAP_READ|SECTION_MAP_WRITE,&ObAttributes);
    96.     }
    97.  
    98.     __asm {
    99.         push eax
    100.         sidt fword ptr [esp - 2]
    101.         pop esi
    102.         btr esi, 1fh
    103.         push 1
    104.         push esi
    105.         push 0
    106.         push SECTION_MAP_WRITE
    107.         push hSection
    108.         call dword ptr ds:MapViewOfFile
    109.  
    110.         cmp eax, 0
    111.         jnz map_ok
    112.         push hSection
    113.         call dword ptr ds:CloseHandle
    114.         xor eax, eax
    115.         add esp, 60h // stack restore
    116.         ret
    117.         map_ok:
    118.         mov [pbMap], eax
    119.         and esi, 0fffh
    120.         lea esi, dword ptr [eax + esi + INTNUMBER * 8]
    121.         fild qword ptr [esi]
    122.         call skip_ring0
    123.         // begin ring 0
    124.         call lpKernelProc
    125.         iretd
    126.         // end ring 0
    127.         skip_ring0:
    128.         pop word ptr [esi]
    129.         mov byte ptr [esi + 2], 8
    130.         mov byte ptr [esi + 5], 0eeh
    131.         pop word ptr [esi + 6]
    132.         int INTNUMBER
    133.     }
    134.  
    135.     UnmapViewOfFile(pbMap);
    136.     CloseHandle(hSection);
    137.  
    138.     return 1;
    139. }
    140.  
    141.  
    142.  
    143. //
    144. // some auxilary funcs
    145. //
    146.  
    147. #define NTSTATUS LONG
    148. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
    149. #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
    150. #define DEF_KERNEL_BASE 0x80400000L
    151. #define SystemModuleInformation 11
    152.  
    153. typedef struct _SYSTEM_MODULE_INFORMATION
    154. {
    155.     ULONG Reserved[2];
    156.     PVOID Base;
    157.     ULONG Size;
    158.     ULONG Flags;
    159.     USHORT Index;
    160.     USHORT Unknown;
    161.     USHORT LoadCount;
    162.     USHORT ModuleNameOffset;
    163.     CHAR ImageName[256];
    164. } SYSTEM_MODULE_INFORMATION;
    165.  
    166.  
    167. DWORD ring0_GetKernelBase()
    168. {
    169.     HANDLE hHeap = GetProcessHeap();
    170.  
    171.     NTSTATUS Status;
    172.     ULONG cbBuffer = 0x8000;
    173.     PVOID pBuffer = NULL;
    174.     DWORD retVal = DEF_KERNEL_BASE;
    175.  
    176.     HMODULE hntdll = GetModuleHandle("ntdll.dll");
    177.  
    178.     NTSTATUS (WINAPI * _NtQuerySystemInformation)(UINT, PVOID, ULONG, PULONG);
    179.     *(FARPROC *)&_NtQuerySystemInformation = GetProcAddress(hntdll, "ZwQuerySystemInformation");
    180.  
    181.     do
    182.     {
    183.         pBuffer = HeapAlloc(hHeap, 0, cbBuffer);
    184.         if (pBuffer == NULL)
    185.             return DEF_KERNEL_BASE;
    186.  
    187.         Status = _NtQuerySystemInformation(SystemModuleInformation,
    188.         pBuffer, cbBuffer, NULL);
    189.  
    190.         if(Status == STATUS_INFO_LENGTH_MISMATCH)
    191.         {
    192.             HeapFree(hHeap, 0, pBuffer);
    193.             cbBuffer *= 2;
    194.         }
    195.         else if(Status != STATUS_SUCCESS)
    196.         {
    197.             HeapFree(hHeap, 0, pBuffer);
    198.             return DEF_KERNEL_BASE;
    199.         }
    200.     }
    201.     while (Status == STATUS_INFO_LENGTH_MISMATCH);
    202.  
    203.     DWORD numEntries = *((DWORD *)pBuffer);
    204.     SYSTEM_MODULE_INFORMATION *smi = (SYSTEM_MODULE_INFORMATION *)((char *)pBuffer + sizeof(DWORD));
    205.  
    206.     for(DWORD i = 0; i < numEntries; i++)
    207.     {
    208.         if(strcmpi(smi->ImageName, "ntoskrnl.exe"))
    209.         {
    210.             retVal = (DWORD)(smi->Base);
    211.             break;
    212.         }
    213.         smi++;
    214.     }
    215.  
    216.     HeapFree(hHeap, 0, pBuffer);
    217.     return retVal;
    218. }
    219.  
    220. DWORD g_KernBase;
    221. DWORD g_Address;
    222. DWORD g_Mem;
    223.  
    224. PVOID R0_GetProcAddress(PCHAR pFunctionName)
    225. {
    226.     PVOID pFunctionAddress = NULL;
    227.     PVOID ModuleBase = (PVOID)g_KernBase;
    228.  
    229.     __try
    230.     {
    231.         PIMAGE_DOS_HEADER dos =(PIMAGE_DOS_HEADER) ModuleBase;
    232.         PIMAGE_NT_HEADERS nt =(PIMAGE_NT_HEADERS)((ULONG) ModuleBase + dos->e_lfanew);
    233.  
    234.         PIMAGE_DATA_DIRECTORY expdir = (PIMAGE_DATA_DIRECTORY)
    235.         (nt->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT);
    236.         ULONG size = expdir->Size;
    237.         ULONG addr = expdir->VirtualAddress;
    238.  
    239.         PIMAGE_EXPORT_DIRECTORY exports =(PIMAGE_EXPORT_DIRECTORY)((ULONG) ModuleBase + addr);
    240.  
    241.         PULONG functions =(PULONG)((ULONG) ModuleBase + exports->AddressOfFunctions);
    242.         PSHORT ordinals =(PSHORT)((ULONG) ModuleBase + exports->AddressOfNameOrdinals);
    243.         PULONG names =(PULONG)((ULONG) ModuleBase + exports->AddressOfNames);
    244.         ULONG max_name =exports->NumberOfNames;
    245.         ULONG max_func =exports->NumberOfFunctions;
    246.  
    247.         ULONG i;
    248.  
    249.         for (i = 0; i < max_name; i++)
    250.         {
    251.             ULONG ord = ordinals[i];
    252.             if(i >= max_name || ord >= max_func)
    253.             {
    254.                 return NULL;
    255.             }
    256.             if (functions[ord] < addr || functions[ord] >= addr + size)
    257.             {
    258.                 if (strcmp((PCHAR) ModuleBase + names[i], pFunctionName) == 0)
    259.                 {
    260.                     pFunctionAddress =(PVOID)((PCHAR) ModuleBase + functions[ord]);
    261.                     break;
    262.                 }
    263.             }
    264.         }
    265.     }
    266.     __except(EXCEPTION_EXECUTE_HANDLER)
    267.     {
    268.         pFunctionAddress = NULL;
    269.     }
    270.     return pFunctionAddress;
    271. }
    272.  
    273.  
    274. typedef LONG (NTAPI *ZwQuerySystemInformation)(
    275.    IN LONG   SystemInformationClass,
    276.   OUT PVOID  SystemInformation,
    277.    IN ULONG  SystemInformationLength,
    278.   OUT PULONG ReturnLength OPTIONAL );
    279.  
    280.  
    281. //
    282. // This routine would be executed in KERNEL MODE
    283. //
    284.  
    285. void R0_DISCOVER_AND_EXECUTE()
    286. {
    287.     ZwQuerySystemInformation(R0_GetProcAddress("ZwQuerySystemInformation"))(
    288.         SystemProcessInformation,
    289.         // ну и далее по тексту, не помню, что ей надо передать,чтобы получить список процессов :)
    290.         );
    291. }
    292.  
    293. //
    294. // Entry
    295. //
    296.  
    297. int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
    298. {
    299.     char s_buff[256];
    300.  
    301.     g_KernBase = ring0_GetKernelBase();
    302.     if(!g_KernBase)
    303.     {
    304.         MessageBox(0, "Couldn\'t discover kernel base address", "Error", MB_OK|MB_ICONWARNING);
    305.         return 0;
    306.     }
    307.  
    308.     ring0_execute(R0_DISCOVER_AND_EXECUTE);
    309.  
    310.     wsprintf(s_buff, "Execute complete. ExAllocatePoolWithTag address: 0x%.8X, allocated memory address: 0x%.8X", g_Address, g_Mem);
    311.     MessageBox(0, s_buff, "Done", MB_OK|MB_ICONWARNING);
    312.  
    313.     return 0;
    314. }
    Создание шлюза прерывания. Правда, она не снимает запись из IDT позавершении.
    Так что если после ее завершения сделать INT F0 в любом процессе, увидишь крааасивый синий экран :)