XP->Vista. Сплайсинг.

Тема в разделе "WASM.NT.KERNEL", создана пользователем haxorart, 22 июн 2009.

  1. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Здравствуйте. Перешел с ХР на Vista и решел перенести свой старый код. Перехват идет на 2х уровнях на уровне пользователя и на уровне ядра. Соответственно возникло несколько проблем.
    1)Начнем с ядра. Суть проблемы: не загружается драйвер по ZwLoadDriver(код 100% рабочий на ХР). Что я делал:
    а)отключил подпись драйверов(ф8 при загрузке винды)
    б)отключил UAC
    в)добавил манифест к загрузчику(загрузчик на делфи, так что пришлось делаьб ручками)
    г)делал различные ф-ии, для получения привелегий(пример enabledebugprivilage из мс рема, только для драйверов)
    д)даю права администратора(правая кнопка-> совместимость-> запустить от имени администратора)
    при загрузке всё время получаю ошибку о том, что мне не хватает привелегий. Что странно программы Руссиновича работают нормально. Обратил внимание, что при работавшем UAC моё приложение и проги Руссиновича выдают разные запросы разрешения. Пробовал комбинировать варианты. НИЧЕГО НЕ ПОМОГЛО. В висте только осваиваюсь - мог сделать нубскую ошибку.
    2)Уровень пользователя. Решил также запустить старый код перехвата в ринг 3. Опять всё получилось совсем не так как я планировал.
    a) Инжект длл методом удаленных процессов
    function InjectDll(PID:lol: WORD;DllName:string):boolean;
    var
    hProcess:THandle;
    hRemoteThread:THandle;
    NameBufPtr:pointer;
    LoadLibraryPtr:pointer;
    NumberOfBytesWritten,ThreadId:lol: WORD;
    begin
    result:=false;
    hprocess:=0;
    hRemoteThread:=0;
    NameBufPtr:=nil;
    try
    //1
    hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if hprocess=0 then
    exit;
    //2
    NameBufPtr:=VirtualAllocEx(hProcess,nil,length(DllName)+1,MEM_COMMIT,PAGE_READWRITE);
    if NameBufPtr=nil then
    exit;
    //3
    if not(WriteProcessMemory(hProcess,NameBufPtr,PChar(DllName),length(DllName)+1,NumberOfBytesWritten)) then
    exit;
    //4
    LoadLibraryPtr:=GetProcAddress(GetModuleHandle('kernel32.dll'),'LoadLibraryA');
    if LoadLibraryPtr=nil then
    exit;
    //5
    hRemoteThread:=CreateRemoteThread(hProcess,nil,0,LoadLibraryPtr,NameBufPtr,0,ThreadId);
    if hRemoteThread<>0 then
    begin
    //WaitForSingleObjectEx(hRemoteThread,500);
    result:=true;
    end;
    finally
    if NameBufPtr<>nil then
    VirtualFreeEx(hProcess,NameBufPtr,0,MEM_RELEASE);
    if hRemoteThread<>0 then
    CloseHandle(hRemoteThread);
    if hProcess<>0 then
    CloseHandle(hProcess);
    end;
    end;
    Внедрение идет в 5 этапов. На 3ем сыпется(WriteProcessMemory). Покопался в интернете, есть несколько ветов на эту тему, но ответов на мои вопросы я не нашел. Что странно, при отключенном UAC внедрение в процесс самого загрузчика возможно.
    б)У меня есть несколько глобализаторов(те способов раздачи моё длл всем процессам). Метод основанный на широковещательных сообщениях работает железобетонно(возрадуйтесь троянописатели, тк его достаточно для перехвата почти всех оконных приложений). Метод основанный на установке системных ловушек заработал только после отключения UAC. Метод основанный на перехвате ntdll так и не заработал по приведённым в пункте 1 причинам.

    Из выше изложенного возникает несколько вопросов:
    1)Есть ли у кого-нибудь работающий пример по загрузке драйвера методом zwLoadDriver? Именно полный пример, а не кусок кода. Т.к. у меня или очень странная или очень тупая ошибка. Для её поиска мне потребуется чуть ли не построчное сравнение кода.
    2)Возможно ли сделать старый-добрый инжект длл в 1 чужой процесс(метод удалённых процессов)?
    3)Возможно ли сделать так чтобы при включенном UAC программа работала нормально?
    4)Вообще очень интересует вопрос как было изменено ядро висты и 7 по сравнению с ХР(в области безопасности)?
     
  2. ant0xa

    ant0xa New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2009
    Сообщения:
    29
    попробуй заменить
    hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    на
    hProcess = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD , FALSE, PID);

    В XP SP3 помогло
     
  3. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Проблема была решина.