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

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

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    т.е. NtUserSendInput и SendInput отличаются только "лишним" call.
     
  2. punxer

    punxer Андрей

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

    Код (Text):
    1. int NtUserSendInputServiceCall (Count,Input,Size)
    2. {
    3.   __asm
    4. {
    5.      MOV EAX,11F6                          
    6.      MOV EDX,7FFE0300
    7.      mov edx, esp
    8.      sysenter
    9.      retn
    10. }
    11.  
    12.  
    13. }
    ??????????????????????
    естественно для фиксированного сервис пака
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Да это верная замена (только MOV EDX,7FFE0300 перед mov edx, esp естественно лишняя), изменится ли номер сервиса (mov eax, 11F6) при смене версии win не знаю.
     
  4. punxer

    punxer Андрей

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А нет торможу :) - этот "лишний" call смещает положение параметров SendInput в стеке (в sysenter же передаётся вершина стека) значит это нужно учесть. Порядок параметров естественно как SendInput.
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Y_Mur
    и как будет прально? я не силен в асме?
    никак не догоню
    тот вариант не работат хоть и не падает
    esp-4?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    например:
    mov eax, 11F6
    push edx ; не важно что помещать в стек вместо того call
    mov edx, esp
    sysenter
    pop edx ; вместо ret после call
    ret

    можно конечно и sub esp, 4 вместо push и add esp, 4 вместо pop
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Y_Mur
    1>vkbd.cpp(2081): error C2400: inline assembler syntax error in 'opcode'; found 'newline'
    на sysenter((
    может int 2eh?
    Забить sysenter опкодами чтоле?0F34 вроде
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    замени sysenter на двухбайтный код 0х0f, 0x34
     
  10. punxer

    punxer Андрей

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

    {
    Код (Text):
    1.     _asm
    2.     {
    3.         mov eax, 11F6h
    4.         push edx        ; не важно что помещать в стек вместо того call
    5.         mov edx, esp
    6.         db 0х0fh
    7.         db 0x34h
    8.         pop edx          ; вместо ret после call
    9.         ret
    10.     }
    1>vkbd.cpp(2080): error C2400: inline assembler syntax error in 'opcode'; found 'constant'
    1>vkbd.cpp(2081): error C2059: syntax error : 'bad suffix on number'
    1>vkbd.cpp(2081): error C2400: inline assembler syntax error in 'opcode'; found 'constant'
    или через емит?
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    конечно emit и вместо суффикса h префикс 0х
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Y_Mur
    Код (Text):
    1.     _asm
    2.     {
    3.         mov eax, 11F6h
    4.             push edx        ; не важно что помещать в стек вместо того call
    5.             mov edx, esp
    6.             _emit 0х0f
    7.             _emit 0x34
    8.             pop edx          ; вместо ret после call
    9.             ret
    10.  
    11.     }
    1>vkbd.cpp(2080): error C2400: inline assembler syntax error in 'first operand'; found 'newline'
    на первом емите в студии
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    я уже расшиб лоб об клаву((
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    _asm
    {
    mov eax, 11F6h
    push edx ; не важно что помещать в стек вместо того call
    mov edx, esp
    }
    _emit 0х0f
    _emit 0x34
    _asm
    {
    pop edx ; вместо ret после call
    ret

    }
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    с MSDN:
    пользуйте YASM, там нет никаких навязанных майкрософт проблем))))
     
  16. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Rel 'невозможно' во вставках
    Y_Mur
    1>vkbd.cpp(2081): error C2065: '_emit' : undeclared identifier


    Код (Text):
    1. #pragma region LINKER
    2. #   pragma comment(lib, "ImageHlp")
    3. #ifndef _DEBUG
    4. #   pragma comment(linker,"/SECTION:.txt,EWR")
    5. #   pragma comment(linker, "/merge:.rdata=.txt")
    6. #   pragma comment(linker, "/merge:.data=.txt")
    7. #   pragma comment(linker, "/merge:.text=.txt")
    8. #   pragma check_stack(off)
    9. #   pragma optimize( "gsy", on )
    10. //# pragma comment(linker, "/ENTRY:DllMain")
    11. //# pragma comment(linker, "/nodefaultlib")
    12.  
    13. #endif // _DEBUG
    14.  
    15.  
    16. #pragma endregion
    это может быть праблемой?
     
  17. punxer

    punxer Андрей

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Я собственно обычно асм без С юзаю, но щас проверил в студии компилится вот такое извращение :)
    Код (Text):
    1.     #define sysenter __asm _emit 0x0f __asm _emit 0x34
    2.  
    3.     __asm
    4.     {
    5.             mov eax, 11F6h
    6.             push edx        ; не важно что помещать в стек вместо того call
    7.             mov edx, esp
    8.             sysenter
    9.             pop edx          ; вместо ret после call
    10.             ret
    11.  
    12.     };
     
  19. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Y_Mur
    [1504] In Unhandled Exception Filter
    [1504] ExCode=c0000005

    ((

    но компилется

    вот полная функция
    Код (Text):
    1. int __stdcall  NtUserSendInputServiceCall (UINT Count,LPINPUT Input,int Size)
    2. {
    3.     #define sysenter __asm _emit 0x0f __asm _emit 0x34
    4.            #define NtUserSendInput     11F6h
    5.     __asm
    6.     {
    7.         mov eax,NtUserSendInput
    8.         push edx        ; не важно что помещать в стек вместо того call
    9.         mov edx, esp
    10.         sysenter
    11.         pop edx          ; вместо ret после call
    12.         ret
    13.  
    14.     };
    15.  
    16. }
    жду гуру.
    отладить просто невозможно. длл клеится в импорт к полноэкранной игре в виртуальной машине с диском в сто метров
    хрен что поставишь/
     
  20. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    punxer
    указатель загулял
    отлаживай