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

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

  1. punxer

    punxer Андрей

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

    Код (Text):
    1. ; UINT __stdcall SendInput(UINT cInputs, LPINPUT pInputs, int cbSize)
    2. public SendInput
    3. SendInput proc near
    4.  
    5. cInputs= dword ptr  4
    6. pInputs= dword ptr  8
    7. cbSize= dword ptr  0Ch
    8.  
    9. mov     eax, 11F6h
    10. mov     edx, [b]7FFE0300h[/b]
    11. call    dword ptr [edx]
    12. retn    0Ch
    13. SendInput endp
    Не могу разобрать куда идет колл, или все таки лучше взять отладчик и копать в нем?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    конечно отладчик. По адресу 7FFE0300h ты увидишь указатель на функцию. Без отладчика ты ж не посмотришь, что это за указатель и чему он равен
     
  3. punxer

    punxer Андрей

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

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    насколько я помню, нтдлл грузится всегда по одному и тому же адресу, т.к. загружается самым первым и никто не занимает его базу. Так что можешь наверное даже в ида про посмотреть этот адрес. Ну или в отладчике любого процесса. Жаль, что я такой же спец по недрам, как и ты :)
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    MSoft
    в х32
    в x64 рандомная загрузка. при двух запусках проги все либы будут по разным адресам не из-за коллизий.
    и нтдлл кажется это тоже касается
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    помогите узнать нубу куда уходит SendInput в ntdll? По какому адресу? Потом в shadow-service?
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Мне нужно вызвать самую последнюю инстанцию перед ядром, то есть sysenter из приложения на сервис что обслуживает SendInput
    Можете перенести в Beginers. Только помогите, дайте толчок.
     
  8. punxer

    punxer Андрей

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

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    punxer
    как сказал MSoft отладчик тебе поможет.
    откуда ты знаеш, что он костантен, дальше твоего билда?
     
  10. punxer

    punxer Андрей

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

    punxer Андрей

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Olly говорит:
    Код (Text):
    1.   MOV EAX,11F6                             ; INT user32.SendInput(Count,Input,Size)
    2.   MOV EDX,7FFE0300
    3.   CALL DWORD PTR DS:[EDX]            ; ntdll.KiFastSystemCall
     
  13. wsd

    wsd New Member

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

    punxer Андрей

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

    punxer Андрей

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    punxer
    Это комментарии Olly, но в sysenter скрывающийся под ntdll.KiFastSystemCall она зайти есно не может ;)
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. typedef struct tagMOUSEINPUT {
    2.     LONG    dx;
    3.     LONG    dy;
    4.     DWORD   mouseData;
    5.     DWORD   dwFlags;
    6.     DWORD   time;
    7.     ULONG_PTR dwExtraInfo;
    8. } MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT;
    9.  
    10. typedef struct tagKEYBDINPUT {
    11.     WORD    wVk;
    12.     WORD    wScan;
    13.     DWORD   dwFlags;
    14.     DWORD   time;
    15.     ULONG_PTR dwExtraInfo;
    16. } KEYBDINPUT, *PKEYBDINPUT, FAR* LPKEYBDINPUT;
    17.  
    18. typedef struct tagHARDWAREINPUT {
    19.     DWORD   uMsg;
    20.     WORD    wParamL;
    21.     WORD    wParamH;
    22. } HARDWAREINPUT, *PHARDWAREINPUT, FAR* LPHARDWAREINPUT;
    23.  
    24. #define INPUT_MOUSE     0
    25. #define INPUT_KEYBOARD  1
    26. #define INPUT_HARDWARE  2
    27.  
    28. typedef struct tagINPUT {
    29.     DWORD   type;
    30.  
    31.     union
    32.     {
    33.         MOUSEINPUT      mi;
    34.         KEYBDINPUT      ki;
    35.         HARDWAREINPUT   hi;
    36.     };
    37. } INPUT, *PINPUT, FAR* LPINPUT;
    38.  
    39. VOID mouse_event(
    40.     DWORD dwFlags,
    41.     DWORD dx,
    42.     DWORD dy,
    43.     DWORD dwData,
    44.     ULONG_PTR dwExtraInfo)
    45. {
    46.     INPUT ms;
    47.  
    48.     BEGINCALLVOID()
    49.  
    50.         ms.type           = INPUT_MOUSE;
    51.         ms.mi.dwFlags     = dwFlags;
    52.         ms.mi.dx          = dx;
    53.         ms.mi.dy          = dy;
    54.         ms.mi.mouseData   = dwData;
    55.         ms.mi.time        = 0;
    56.         ms.mi.dwExtraInfo = dwExtraInfo;
    57.  
    58.         NtUserSendInput(1, &ms, sizeof(INPUT));
    59.  
    60.     ENDCALLVOID()
    61. }
    62.  
    63. VOID keybd_event(
    64.     BYTE  bVk,
    65.     BYTE  bScan,
    66.     DWORD dwFlags,
    67.     ULONG_PTR dwExtraInfo)
    68. {
    69.     INPUT kbd;
    70.  
    71.     BEGINCALLVOID()
    72.  
    73.         kbd.type           = INPUT_KEYBOARD;
    74.         kbd.ki.dwFlags     = dwFlags;
    75.         kbd.ki.wVk         = bVk;
    76.         kbd.ki.wScan       = bScan;
    77.         kbd.ki.time        = 0;
    78.         kbd.ki.dwExtraInfo = dwExtraInfo;
    79.  
    80.         NtUserSendInput(1, &kbd, sizeof(INPUT));
    81.  
    82.     ENDCALLVOID()
    83. }
    что за ENDCALLVOID() и BEGINCALLVOID()?
    и как понимать это:
    откуда?

    кстате спасибо за отзывчивость, это стало редкостью тут((

    ЗЫ какойто чудокод клерка
     
  18. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    int NtUserSendInputServicCall (Count,Input,Size)
    {
    __asm
    {
    MOV EAX,11F6
    MOV EDX,7FFE0300
    mov edx, esp
    sysenter
    retn
    }


    }??????????????????????
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В olly видно что SendInput идёт в ntdll.KiFastSystemCall напрямую, а не через NtUserSendInput (win xp sp3)
    ntdll.KiFastSystemCall
    это
    mov edx, esp
    sysenter
    retn
    т.е. параметры от SendInput там доступны по ссылке на стек.
     
  20. punxer

    punxer Андрей

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