Исследование SendInput

Тема в разделе "WASM.RESEARCH", создана пользователем punxer, 20 сен 2010.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    A сама SendInput с этими параметрами работает? тогда запость их сюда мне сейчас лень разбираться как их корректно задавать. кстати непонятно что мешает просто SendInput использовать.
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. void GenerateKeyService ( WORD vk)
    2. {
    3.     KEYBDINPUT  kinpt={0};
    4.     INPUT       inpt={0};
    5.     // generate down
    6.     inpt.type=INPUT_KEYBOARD;
    7.     kinpt.wVk=vk;
    8.     kinpt.time=NULL;
    9.     kinpt.dwExtraInfo=NULL;
    10.     kinpt.wScan=NULL;
    11.     kinpt.dwFlags=NULL;
    12.     inpt.ki=kinpt;
    13.  
    14.     NtUserSendInputServiceCall(1,&inpt,sizeof(inpt));
    15.     kinpt.dwFlags=KEYEVENTF_KEYUP;
    16.     NtUserSendInputServiceCall(1,&inpt,sizeof(inpt));
    17.     return;
    18. }
     
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    wsd
    нет возможности без огромных трудностей
    это самый последний вариант отлаживать там так как ядерной отладкой системы я не владею
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    все пашет, если руки оттуда растут...

    WinDbg на локальной машине, виртуалка в сети, гугл в руки и вперед...
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Y_MurSendInput работала но нестабильно как и все остальное почему и пришлось прибегнуть к более низкоуровневым версиям
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Rel
    в той версии что ты привел не скомпилилось/
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    может кто нить привести рабочий пример для икспи сп3
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Посмотрел - забавно, но возврат из sysenter происходит не на следующую после него команду retn, а на тот адрес что заносится в стек при вызове ntdll.KiFastSystemCall, значит нужно писать свою
    KiFastSystemCall состоящую из
    mov edx, esp
    sysenter
    retn ; <- лишняя команда :))

    Хотя непонятно как это может увеличить стабильность - ведь поседовательность действий та-же самая ;)
     
  9. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Это троллинг?
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Проверил - самопальная KiFastSystemCall тоже не работает, похоже дело в том что сервис проверяет по адресу возврата чтобы использовалась именно KiFastSystemCall из ntdll, подробнее проверить не могу, ядерный отладчик у меня не установлен.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    чем это:
    отличается от этого:
    интересно мне знать...
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Rel
    Собственно по аналогии с первым второе и сделано не понятно к чему это...

    punxer
    нет дело не в проверке, а в том, что хитрый компилятор просто "видит" что функция явно не использует параметры и игнорирует их. Значит либо отключать оптимизацию, либо довольствоваться SendInput.
     
  13. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Y_Mur
    это в релизе, делай дебаг
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    IceCrashLdrэто ты к чему б***Ь?
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    этот вопрос адресован не вам, а ТС... не берите в голову...

    вполне возможно, но чтобы убедиться наверняка можно сделать вывод асм-листинга, компилятор студии это умеет делать...
     
  16. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Так скажет кто нибуди как вызвать сервис напрямую NtUserSendInput через int 2e or syscall
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Rel
    прости,там просто тупанул, но влоб копия не скомпилелась
    почему не знаю
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    wsd
    Собственно если разными ухищрениями вроде компиляции в дебаге или при выключенной оптимизации удастся повторить всё что делает SendInput это не даст ответ на главный вопрос "как увеличить стабильность работы кода?" простой перенос тех же команд из системных dll в свою прогу явно стабильности не добавит.

    punxer
    Возможно сбои при SendInput связаны с тем что компилятор при занесении структуры в стек разрушает регистр xmm0, тогда нужно бороться не с самой SendInput а с тем как перед её вызовом данные копируются в стек, хотя это только версия.
     
  19. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    после 'sysenter' даже без UnhandledFilter падает, точнее на нем
    да не верю я блин что нельзя напрямую вызвать этот сервис
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Rel
    asm листинг не нужен, всё и так смотрю в olly, там и видно и выкидывание "ненужных" параетров в самопальном варианте и разрушение xmm0 при вызове SendInput, а в этом случае (dll подгружаетс к навороченному приложению) это может оказаться критичным.