1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Перехваты импорта через ядро

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntcdm, 13 сен 2010.

  1. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Да вот дело в том, что когда я сплайсом хукал и хуки ставил на свой код - то управление передавалось и код не падал именно так, по крайней мере его можно было потрасиировать. А тут через экспорт хукаю - и падает.


    Clerk
    контекст в данном случае это что? Состояние всех регистров?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Да. И инфу об исключении.
     
  3. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    значит так.
    Бряк на выполнение ставлю след. образом:
    Код (Text):
    1. kd> ba e 1 0x30004
    дальше бряк срабатывает и я смотрю PTE
    Код (Text):
    1. Breakpoint 3 hit
    2. 001b:00030004 8bec            mov     ebp,esp
    3. kd> !pte 0x30004
    4.                     VA 00030004
    5. PDE at C0600000            PTE at C0000180
    6. contains 0000000020631867  contains 800000001FEAA867
    7. pfn 20631     ---DA--UWEV   pfn 1feaa     ---DA--UW-V
    Дальше нажимаю F11 и попадаю почему то сюда:
    Код (Text):
    1. kd> t
    2. ntdll!KiUserExceptionDispatcher+0x1:
    3. 001b:77ba6449 8b4c2404        mov     ecx,dword ptr [esp+4]
    Интересно, почему именно KiUserExceptionDispatcher+0x1 а не просто KiUserExceptionDispatcher ?

    дальше смотрю стек вызова
    Код (Text):
    1. kd> k
    2. ChildEBP RetAddr  
    3. 0015fbc0 00030004 ntdll!KiUserExceptionDispatcher+0x1
    4. WARNING: Frame IP not in any known module. Following frames may be wrong.
    5. 0015fb3c 0086dd9e 0x30004
    6. 0015fbc0 0086e479 winlogon!WinMain+0x40
    7. 0015fc50 77351194 winlogon!_initterm_e+0x1a1
    8. 0015fc5c 77bbb495 kernel32!BaseThreadInitThunk+0xe
    9. 0015fc9c 77bbb468 ntdll!__RtlUserThreadStart+0x70
    10. 0015fcb4 00000000 ntdll!_RtlUserThreadStart+0x1b
    смотрю регистры
    Код (Text):
    1. kd> r
    2. eax=0015fbb0 ebx=00000001 ecx=00000065 edx=00000004 esi=001e186c edi=00000000
    3. eip=77ba6449 esp=0015f838 ebp=0015fbc0 iopl=0         nv up ei pl nz na po nc
    4. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
    5. ntdll!KiUserExceptionDispatcher+0x1:
    6. 001b:77ba6449 8b4c2404        mov     ecx,dword ptr [esp+4] ss:0023:0015f83c=0015f85c
    пробую
    Код (Text):
    1. kd> .lastevent
    2. Last event: <no event>
    3. kd> .exr -1
    4. Last event was not an exception
    5. kd> .ecxr
    6. Unable to get exception context, HRESULT 0x8000FFFF
    Что то он толи этот эксепщен не отлавливает, толи не эксепшен это вовсе. Подскажите.
     
  4. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    еще добавлю что при попытке поставить
    Код (Text):
    1. bp 0x30004
    - дебаггер пишет *BUSY* и зависает...
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Код (Text):
    1. PDE at C0600000            PTE at C0000180
    2. contains 0000000020631867  contains 800000001FEAA867
    3. pfn 20631     ---DA--UWEV   pfn 1feaa     ---DA--UW-V
    ---DA--UW-V так страница же не исполняемая. Судя по всему, исключение происходит из-за этого.
     
  6. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Подскажите пожалуйста как это поменять в дебаггере и программно из ядра?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Если из отладчика, то можно найти PTE и поменять бит руками.
     
  8. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Код (Text):
    1. kd> .exr 0026FA9C
    2. ExceptionAddress: 00030004
    3.    ExceptionCode: c0000005 (Access violation)
    4.   ExceptionFlags: 00000000
    5. NumberParameters: 2
    6.    Parameter[0]: 00000008
    7.    Parameter[1]: 00030004
    8. Attempt to execute non-executable address 00030004
    9.  
    10. kd> .cxr 0026FAB8
    11. eax=0026fdb8 ebx=001cb144 ecx=003f1ec8 edx=77b664f4 esi=003f1ec8 edi=00000000
    12. eip=00030004 esp=0026fd9c ebp=0026fdc8 iopl=0         nv up ei pl nz na po nc
    13. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010302
    14. 001b:00030004 8bec            mov     ebp,esp
    Уже вижу что память не исполняемая. Как это поправить?
     
  9. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Может подскажете как это сделать вручную и программно?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Аа у вас PAE. Тогда старший бит в PTE. Можно попробовать MmProtectMdlSystemAddress(), хотя мб с пользовательским ап работать не будет.
     
  11. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    совершенно верно, MmProtectMdlSystemAddress уже попробовал - БСОДит.

    Полазил по форумам и нашел кодес тут http://www.rootkit.com/board.php?thread=8073&did=edge0&disp=8073
    Код (Text):
    1. NTSTATUS ChangePageProtection(PVOID BaseAddress,
    2.                              CLIENT_ID TargetClientId)
    3. {
    4.  
    5.   HANDLE                    ProcessHandle = 0;
    6.   PEPROCESS                TargetProcess;
    7.   OBJECT_ATTRIBUTES            ObjectAttributes;
    8.  
    9.   PMDL                    pMdl = NULL;
    10.  
    11.   MDL_DATA_PAGE_PROTECTION    Mdl_Data;
    12.   PMDL_DATA_PAGE_PROTECTION    pMdl_Data;
    13.  
    14. //  KAPC_STATE                  ApcState;
    15.  
    16.  
    17.     //////////////////////////////////////////////////
    18.  
    19.     __try {    
    20.    
    21.  
    22.         /*****************************************************
    23.        
    24.         // THIS CODE ISN'T USED BUT CAN BE IF YOU WANT TO ATTACH
    25.        
    26.         // Retrieve the EPROCESS structure for the target process  
    27.  
    28.         if(!NT_SUCCESS(PsLookupProcessByProcessId(
    29.             (ULONG) TargetClientId.UniqueProcess,    // ULONG  ProcessId
    30.             &TargetProcess)))                    // OUT PEPROCESS  *EProcess
    31.         {
    32.             return 0;            
    33.         }
    34.  
    35.         // Attach to the process
    36.  
    37.         KeStackAttachProcess (
    38.             &TargetProcess->Pcb,        // PKPROCESS    Process
    39.             &ApcState                    // OUT PKAPC_STATE ApcState
    40.             );
    41.            
    42.         *****************************************************/
    43.        
    44.        
    45.                
    46.         // Prepare OBJECT_ATTRIBUTES structure
    47.  
    48.         InitializeObjectAttributes(
    49.             &ObjectAttributes,            // OUT POBJECT_ATTRIBUTES
    50.             NULL,                    // PUNICODE_STRING  ObjectName
    51.             OBJ_KERNEL_HANDLE ||
    52.             OBJ_CASE_INSENSITIVE,        // ULONG  Attributes
    53.             NULL,                    // HANDLE  RootDirectory
    54.             NULL                        // PSECURITY_DESCRIPTOR  SecurityDescriptor                        );        
    55.  
    56.  
    57.         // Get a process handle
    58.         // Do not use ZwClose on an active process handle
    59.         // The return definition for XP / Win2k will be
    60.         // INVALID_KERNEL_HANDLE / STATUS_HANDLE_NOT_CLOSABLE
    61.            
    62.         ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS,
    63.                 &ObjectAttributes, &TargetClientId);
    64.  
    65.          
    66.         /*****************************************************/
    67.  
    68.         RtlZeroMemory(&Mdl_Data, sizeof MDL_DATA_PAGE_PROTECTION);
    69.  
    70.         // Allocate an MDL large enough to hold our temporary
    71.         // MDL_DATA_PAGE_PROTECTION structure
    72.  
    73.         pMdl = IoAllocateMdl(
    74.             &Mdl_Data,                    // PVOID  VirtualAddress
    75.             sizeof MDL_DATA_PAGE_PROTECTION,    // ULONG  Length
    76.             FALSE,                        // BOOLEAN  SecondaryBuffer
    77.             FALSE,                        // BOOLEAN  ChargeQuota
    78.             NULL                            // IN OUT PIRP  Irp  OPTIONAL
    79.             );
    80.  
    81.         if (!pMdl)
    82.             return STATUS_UNSUCCESSFUL;
    83.  
    84.  
    85.         // Lock the physical pages mapped by the virtual address range into memory
    86.  
    87.         MmProbeAndLockPages (
    88.             pMdl,                        // IN OUT PMDL  MemoryDescriptorList
    89.             KernelMode,                    // KPROCESSOR_MODE  AccessMode
    90.             IoWriteAccess                     // LOCK_OPERATION  Operation
    91.             );
    92.    
    93.  
    94.         // Map the pages into the process
    95.  
    96.         pMdl_Data = (PMDL_DATA_PAGE_PROTECTION) MmMapLockedPagesSpecifyCache(
    97.             pMdl,                        // PMDL  MemoryDescriptorList
    98.             UserMode,                         // KPROCESSOR_MODE  AccessMode
    99.             MmCached,                         // MEMORY_CACHING_TYPE  CacheType
    100.             NULL,                        // PVOID  BaseAddress
    101.             FALSE,                        // ULONG  BugCheckOnFailure
    102.             NormalPagePriority                 // MM_PAGE_PRIORITY  Priority
    103.             );
    104.  
    105.  
    106.         /*****************************************************/
    107.  
    108.  
    109.         //////////////////////////////////////////////////
    110.            
    111.  
    112.         // Change the protection on the region
    113.         // from PAGE_EXECUTE_WRITECOPY to PAGE_EXECUTE_READWRITE
    114.  
    115.         pMdl_Data->BaseAddress = BaseAddress;
    116.         pMdl_Data->ProtectSize = PAGE_SIZE;
    117.        
    118.  
    119.         // Not exported by Win2K ntoskrnl, obtain address by
    120.         // parsing export directory of Ntdll.
    121.        
    122.         pZwProtectVirtualMemory(
    123.             ProcessHandle,                // IN HANDLE ProcessHandle
    124.             &pMdl_Data->BaseAddress,         // IN OUT PVOID *BaseAddress
    125.             &pMdl_Data->ProtectSize,         // IN OUT PULONG ProtectSize
    126.             PAGE_EXECUTE_READWRITE,         // IN ULONG NewProtect
    127.             &pMdl_Data->OldProtect        // OUT PULONG OldProtect
    128.             );
    129.  
    130.         //////////////////////////////////////////////////        
    131.        
    132.  
    133.         //////////////////////////////////////////////////
    134.  
    135.         // CLEANUP:
    136.  
    137.         // Unmap the pages and free the MDL
    138.  
    139.         MmUnmapLockedPages(pMdl_Data, pMdl);
    140.         MmUnlockPages(pMdl);
    141.         IoFreeMdl(pMdl);
    142.  
    143.         /*****************************************************
    144.        
    145.         // THIS CODE ISN'T USED BUT CAN BE IF YOU WANT TO ATTACH
    146.        
    147.         // Dereference from PsLookupProcessByProcessId
    148.         ObDereferenceObject(TargetProcess);
    149.        
    150.         // Detach from the process
    151.          
    152.         KeUnstackDetachProcess (
    153.             &ApcState                    // PKAPC_STATE ApcState
    154.             );
    155.  
    156.         *****************************************************/        
    157.  
    158.         //=============================================================
    159.  
    160.     } __except (EXCEPTION_EXECUTE_HANDLER)  {
    161.  
    162.           DbgPrint ("\n ERROR ExceptionCode: %x\n", GetExceptionCode() );
    163.         return STATUS_UNSUCCESSFUL;
    164.  
    165.     }    // end __try{
    166.  
    167.  
    168.     return STATUS_SUCCESS;
    169.  
    170. }
    но после вызва pZwProtectVirtualMemory с BaseAddress=0x30000 возвращается статус STATUS_CONFLICTING_ADDRESSES
    В чем может быть проблема снова?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Для работы с пользовательским ап есть соответствующие сервисы. Во первых менеджер памяти манипулирует VAD для приватной памяти. Выделять пользовательскую память через мдл это изврат.
     
  13. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Во многих статьях, в частности вот тут Starting a Process from KernelMode именно через MDL и выделяется и на XP у меня чудненько работает.

    Кстати, может сейчас рискну выделить память через ZwAllocateVirtualMemory. о результатах отпишу
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Не верная инфа расползается по инету как зараза. Если на разных ресурсах написано одно и тоже, это не значит что оно верно.
     
  15. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Ну что же, выделив память след. образом:
    Код (Text):
    1. SIZE_T nRegionSize = PAGE_SIZE;
    2.  
    3.                         ZwAllocateVirtualMemory(
    4.                             NtCurrentProcess(),
    5.                             (PVOID*)&pVirtualMemory,
    6.                             NULL,
    7.                             &nRegionSize,
    8.                             MEM_COMMIT,
    9.                             PAGE_EXECUTE_READWRITE
    10.                             );
    Я смог выделить память в нужном мне процессе так, что уже ексепшен не вываливается !!! тоесть мой код отрабатывает нормально!!! спасибо Клерку за подсказку!!!!!

    Зато еще у меня осталась проблема с тем, что пропатчив экспорт библиотеки msvcrt.dll она поменялась в других процессах.

    патчу таблицу экспорта след. образом:
    Код (Text):
    1.         PIMAGE_DOS_HEADER dosHeader;
    2.         PIMAGE_NT_HEADERS pNTHeader;
    3.         DWORD exportsStartRVA;
    4.        
    5.         dosHeader = (PIMAGE_DOS_HEADER) ImageInfo->ImageBase;
    6.  
    7.         pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew );
    8.  
    9.         // First, verify that the e_lfanew field gave us a reasonable
    10.         // pointer, then verify the PE signature.
    11.         if ( pNTHeader->Signature == IMAGE_NT_SIGNATURE )
    12.         {
    13.  
    14.             exportsStartRVA = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    15.  
    16.             if (exportsStartRVA)
    17.             {
    18.                 PIMAGE_EXPORT_DIRECTORY pExportDirectory = MakePtr( PIMAGE_EXPORT_DIRECTORY, dosHeader, exportsStartRVA );
    19.  
    20.                 PDWORD pdwAddressOfNames =  MakePtr(PDWORD, dosHeader, pExportDirectory->AddressOfNames);
    21.                 PDWORD pdwAddressOfFunctions =  MakePtr(PDWORD, dosHeader, pExportDirectory->AddressOfFunctions);
    22.                 PWORD pdwAddressOfOrdinals =  MakePtr(PWORD, dosHeader, pExportDirectory->AddressOfNameOrdinals);
    23.                 //WORD dwOrdinalBase = pExportDirectory->Base;
    24.  
    25.                 ULONG i=0;
    26.  
    27.                 PCHAR pcName;
    28.                 PDWORD pFunc;
    29.  
    30.  
    31.                 while(i<pExportDirectory->NumberOfNames)
    32.                 {
    33.  
    34.                     if (pdwAddressOfNames[i] != 0 )
    35.                     {
    36.                         pcName =  MakePtr(PCHAR, dosHeader, pdwAddressOfNames[i]);
    37.  
    38.                         if (_stricmp(pcName, "memset") == 0)
    39.                         {
    40.                             WORD funcIndex = pdwAddressOfOrdinals[i];
    41.  
    42.                             pFunc = MakePtr(PDWORD, dosHeader, pdwAddressOfFunctions[funcIndex]);
    43.  
    44.                             BYTE* ptrmem = (BYTE*)g_pVirtualMemory+4;
    45.                             int i;
    46.  
    47.                             for (i=0;i<0x52;i++)
    48.                             {
    49.                                 if (*(DWORD*)ptrmem == 0x0AABBCCDD) //marker for old caller
    50.                                 {
    51.  
    52.                                     *(DWORD*)ptrmem = (DWORD)pFunc;
    53.  
    54.                                 }
    55.                                 ptrmem++;
    56.                             }
    57.  
    58.  
    59.                             DWORD CR0Reg;
    60.  
    61.                             __asm{
    62.                                 mov eax,CR0
    63.                                     mov CR0Reg,eax
    64.                                     and eax,0FFFEFFFFh
    65.                                     mov CR0,eax
    66.                             }
    67.  
    68.                             pdwAddressOfFunctions[funcIndex] = (PBYTE)g_pVirtualMemory+4 - (PBYTE)dosHeader;
    69.  
    70.  
    71.  
    72.                            
    73.                             __asm
    74.                             {
    75.                                 mov eax,CR0Reg
    76.                                 mov CR0,eax
    77.                             }
    78.                            
    79.  
    80.  
    81.                         }
    82.  
    83.                     }
    84.  
    85.  
    86.  
    87.  
    88.  
    89.                     i++;
    90.                 }
    Клерк, ты писал что файловые проекции не разделяемы. Почему же у меня меняется эта ДЛЛ-ка в других процессах. Какие будут предложения чтобы исправить?
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Не может проекция меняться в других процессах.
     
  17. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    меняется, факт. Может потому что у меня Win 7?
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Это не возможно. Опишите подробно.
     
  19. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Использую показанный кодес в нотификаторе Image Load Notify Routine. Сначала отслеживаю загрузку winlogon.exe и выделяю память в нем. Затем отслеживаю загрузку msvcrt.dll в процесс Winlogon.exe и делаю патч таблицы экспорта. Эта библиотека грузится в другие процессы но в других процессах я ее уже не патчу.

    Код (Text):
    1. VOID ImageLoadNotifyRoutine(IN PUNICODE_STRING  FullImageName, IN HANDLE  ProcessId, IN PIMAGE_INFO  ImageInfo)
    2. {
    3.     DBGPRINT(("ImageLoadNotifyRoutine name: %wZ at base %X\r\n", FullImageName, ImageInfo->ImageBase));
    4.     // Setup the name of the DLL to target
    5.  
    6.     if (safe_wcsstr(FullImageName, L"winlogon.exe" ) != NULL)
    7.     {
    8.         if (g_nWinlogonProcessId == 0)
    9.         {
    10.             DbgBreakPoint();
    11.  
    12.             g_nWinlogonProcessId = (ULONG)ProcessId;
    13.             g_pWinlogonImageBase = ImageInfo->ImageBase;
    14.  
    15.             DBGPRINT(("ImageLoadNotifyRoutine Winlogon found with pid=%d, Session=%d\r\n", ProcessId, PsGetCurrentProcessSessionId()));
    16.  
    17.             //PMDL pMdl = NULL;
    18.             BYTE *pVirtualMemory = NULL;
    19.             PHYSICAL_ADDRESS phBegin,phEnd,phSkip;
    20.             phBegin.QuadPart = 0;
    21.             phEnd.QuadPart = (LONGLONG)-1;
    22.             phSkip.QuadPart = PAGE_SIZE;
    23.             DWORD dwAllocationSize;
    24.             __try
    25.             {
    26.                
    27.                 dwAllocationSize = PAGE_SIZE;
    28.  
    29.                 {
    30.  
    31.                     {
    32.                        
    33.  
    34.  
    35.                         pVirtualMemory = NULL;
    36.  
    37.                         SIZE_T nRegionSize = PAGE_SIZE;
    38.  
    39.                         ZwAllocateVirtualMemory(
    40.                             NtCurrentProcess(),
    41.                             (PVOID*)&pVirtualMemory,
    42.                             NULL,
    43.                             &nRegionSize,
    44.                             MEM_COMMIT,
    45.                             PAGE_EXECUTE_READWRITE
    46.                             );
    47.  
    48.  
    49.  
    50.                         if (pVirtualMemory)
    51.                         {
    52.  
    53.  
    54.                             *((DWORD*)pVirtualMemory) = 1;
    55.                             memcpy(pVirtualMemory + 4, my_memset2, 0x52);
    56.  
    57.                             g_pVirtualMemory  = pVirtualMemory;
    58.  
    59.                             BYTE* ptrmem = pVirtualMemory+4;
    60.  
    61.                             //(*(PDWORD) (pCode + i + 1)) = (DWORD)ptrmem;
    62.  
    63.                             for (int i=0;i<0x52;i++)
    64.                             {
    65.                                 if ( *(DWORD*)ptrmem == 0x0EEFFCCBB) //marker for variable
    66.                                 {
    67.                                     *(DWORD*)ptrmem = (DWORD)pVirtualMemory;
    68.                                 }
    69.                                 else if (*(DWORD*)ptrmem == 0x0AABBCCDD) //marker for old caller
    70.                                 {
    71.  
    72.                                     //*(DWORD*)ptrmem = (DWORD)pOldFunction;
    73.                                 }
    74.  
    75.                                 ptrmem++;
    76.                             }
    77.  
    78.  
    79.                     }
    80.  
    81.                 }
    82.             }
    83.             __except(EXCEPTION_EXECUTE_HANDLER)
    84.             {
    85.                 DBGPRINT(("ImageLoadNotifyRoutine woops! exception 1 %X\r\n", GetExceptionCode()));
    86.             }
    87.            
    88.            
    89.  
    90.  
    91.            
    92.  
    93.         }
    94.        
    95.     }
    96.     else if ((ULONG)ProcessId == g_nWinlogonProcessId  && safe_wcsstr(FullImageName, L"msvcrt.dll" ) != NULL)
    97.     {
    98.        
    99.         DBGPRINT(("ImageLoadNotifyRoutine loading dll name %wZ for winlogon with pid=%d, Session=%d\r\n", FullImageName, g_nWinlogonProcessId, PsGetCurrentProcessSessionId()));
    100.  
    101.        
    102.        
    103.         DbgBreakPoint();
    104.  
    105.         PIMAGE_DOS_HEADER dosHeader;
    106.         PIMAGE_NT_HEADERS pNTHeader;
    107.         DWORD exportsStartRVA;
    108.        
    109.         dosHeader = (PIMAGE_DOS_HEADER) ImageInfo->ImageBase;
    110.  
    111.         pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew );
    112.  
    113.         // First, verify that the e_lfanew field gave us a reasonable
    114.         // pointer, then verify the PE signature.
    115.         if ( pNTHeader->Signature == IMAGE_NT_SIGNATURE )
    116.         {
    117.  
    118.             exportsStartRVA = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    119.  
    120.             if (exportsStartRVA)
    121.             {
    122.                 PIMAGE_EXPORT_DIRECTORY pExportDirectory = MakePtr( PIMAGE_EXPORT_DIRECTORY, dosHeader, exportsStartRVA );
    123.  
    124.                 PDWORD pdwAddressOfNames =  MakePtr(PDWORD, dosHeader, pExportDirectory->AddressOfNames);
    125.                 PDWORD pdwAddressOfFunctions =  MakePtr(PDWORD, dosHeader, pExportDirectory->AddressOfFunctions);
    126.                 PWORD pdwAddressOfOrdinals =  MakePtr(PWORD, dosHeader, pExportDirectory->AddressOfNameOrdinals);
    127.                 //WORD dwOrdinalBase = pExportDirectory->Base;
    128.  
    129.                 ULONG i=0;
    130.  
    131.                 PCHAR pcName;
    132.                 PDWORD pFunc;
    133.  
    134.  
    135.                 while(i<pExportDirectory->NumberOfNames)
    136.                 {
    137.  
    138.                     if (pdwAddressOfNames[i] != 0 )
    139.                     {
    140.                         pcName =  MakePtr(PCHAR, dosHeader, pdwAddressOfNames[i]);
    141.  
    142.                         if (_stricmp(pcName, "memset") == 0)
    143.                         {
    144.                             WORD funcIndex = pdwAddressOfOrdinals[i];
    145.  
    146.                             pFunc = MakePtr(PDWORD, dosHeader, pdwAddressOfFunctions[funcIndex]);
    147.  
    148.                             BYTE* ptrmem = (BYTE*)g_pVirtualMemory+4;
    149.                             int i;
    150.  
    151.                             for (i=0;i<0x52;i++)
    152.                             {
    153.                                 if (*(DWORD*)ptrmem == 0x0AABBCCDD) //marker for old caller
    154.                                 {
    155.  
    156.                                     *(DWORD*)ptrmem = (DWORD)pFunc;
    157.  
    158.                                 }
    159.                                 ptrmem++;
    160.                             }
    161.  
    162.  
    163.                             DWORD CR0Reg;
    164.  
    165.                             __asm{
    166.                                 mov eax,CR0
    167.                                     mov CR0Reg,eax
    168.                                     and eax,0FFFEFFFFh
    169.                                     mov CR0,eax
    170.                             }
    171.  
    172.                             pdwAddressOfFunctions[funcIndex] = (PBYTE)g_pVirtualMemory+4 - (PBYTE)dosHeader;
    173.  
    174.  
    175.  
    176.                            
    177.                             __asm
    178.                             {
    179.                                 mov eax,CR0Reg
    180.                                 mov CR0,eax
    181.                             }
    182.                            
    183.  
    184.  
    185.  
    186.  
    187.                         }
    188.  
    189.                     }
    190.  
    191.  
    192.  
    193.  
    194.  
    195.                     i++;
    196.                 }
    197.  
    198.  
    199.  
    200.  
    201.             }
    202.         }
    203.  
    204.  
    205.    
    206.     }
    207.  
    208. }
    Затем ставлю бряк на точку ba e 1 0x30000 - он нормально отрабатывает в процессе winlogon.exe, тут все хорошо.
    Но!!! затем бряк по виртуальному адресу 0x30000 срабатывает в разных процессах - lsass, csrss, и других, в которых я памать не выделял. Естесвенно процессы падают.

    С чем это может быть связано?
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ntcdm
    Не знаю как это происходит. Измените вручную таблицу экспорта, или вобще любой байт в пределах страницы и помотрите изменится ли он в другом процессе.