адреса функций ZwCreateProcess/ZwCreateProcessEx

Тема в разделе "WASM.BEGINNERS", создана пользователем steelfactor, 14 дек 2007.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Честно говоря, совсем запутался :dntknw: Может ламерский вопрос, но все-таки...
    Как я понял, в экспортах ядра функции ZwCreateProcess/ZwCreateProcessEx нет (прямой вызов в драйвере обламывается, поскольку они экспортируются из ntdll.dll), соответственно MmGetSystemRoutineAddress возвращает NULL.
    Нужно программно в r0 определить адрес, куда они грузятся. Как? Пропарсить SST?
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Нашел вариант решения у Нэббета с подгрузкой ntdll.dll. А есть более красивые решения?
     
  3. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Если я правельно понял вопрос, то:

    Чтоб определить адрес ZwWriteVirtualMemory(она так же не экспортируемая) я делал так

    - Грузил с диска ntdll
    - получал ее RVA по имени
    - переходил к файловому смещению
    - прибовлял полученный адрес к базе ntdll
    - далее *(PULONG)((PUCHAR)(полученый адрес)+1) ее номер в SST
    - потом обращался к SST как к масиву используя номер и получал адрес
    http://wasm.ru/forum/viewtopic.php?id=24179

    Если нужен оригинальный адрес нужно читать с диска ntoskrnl.exe
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    vanilly_cpp
    Да, я видел твой код, только мне нужен не номер, а адрес функции для ее вызова.
    Просто, есть ли более простой вариант? А то каждый байт на счету... ))
     
  5. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    А что если тебе попробовать в r3 загрузить ntdll c диска,
    Код (Text):
    1.    
    2.    HMODULE hntdll_real = LoadLibrary("D:/temp/ntdll.dll");
    3.    VOID* hooked = GetProcAddress(hntdll, "ZwWriteVirtualMemory");      
    4.    DWORD num = *(PULONG)((PUCHAR)hooked+1);
    потом передаешь num драйверу и в r0
    Код (Text):
    1. KeServiceDescriptorTable.ServiceTableBase[num]
    и узнаешь адрес
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    ...я думал над этим вариантом, но если бы все было так просто :)
    в r3 вылезать не могу...
    Ладно, значит, будем подгружать ntdll.dll...