Здравствуйте, в исследовании недр винды я новичок, подскажите как быть: Код (Text): ; UINT __stdcall SendInput(UINT cInputs, LPINPUT pInputs, int cbSize) public SendInput SendInput proc near cInputs= dword ptr 4 pInputs= dword ptr 8 cbSize= dword ptr 0Ch mov eax, 11F6h mov edx, [b]7FFE0300h[/b] call dword ptr [edx] retn 0Ch SendInput endp Не могу разобрать куда идет колл, или все таки лучше взять отладчик и копать в нем?
конечно отладчик. По адресу 7FFE0300h ты увидишь указатель на функцию. Без отладчика ты ж не посмотришь, что это за указатель и чему он равен
но он константный и поидеее принадлежит ntdll думал если дополнительно ее подгрузить то можно( поставлю сисер
насколько я помню, нтдлл грузится всегда по одному и тому же адресу, т.к. загружается самым первым и никто не занимает его базу. Так что можешь наверное даже в ида про посмотреть этот адрес. Ну или в отладчике любого процесса. Жаль, что я такой же спец по недрам, как и ты
MSoft в х32 в x64 рандомная загрузка. при двух запусках проги все либы будут по разным адресам не из-за коллизий. и нтдлл кажется это тоже касается
Мне нужно вызвать самую последнюю инстанцию перед ядром, то есть sysenter из приложения на сервис что обслуживает SendInput Можете перенести в Beginers. Только помогите, дайте толчок.
punxer как сказал MSoft отладчик тебе поможет. откуда ты знаеш, что он костантен, дальше твоего билда?
как я понял управление потом идет в NtUserSendInput сервис. но как его вызвать? 0x11f6-это номер сервиса/ а параметры? где узнать?
Olly говорит: Код (Text): MOV EAX,11F6 ; INT user32.SendInput(Count,Input,Size) MOV EDX,7FFE0300 CALL DWORD PTR DS:[EDX] ; ntdll.KiFastSystemCall
punxer Это комментарии Olly, но в sysenter скрывающийся под ntdll.KiFastSystemCall она зайти есно не может
Код (Text): typedef struct tagMOUSEINPUT { LONG dx; LONG dy; DWORD mouseData; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; } MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT; typedef struct tagKEYBDINPUT { WORD wVk; WORD wScan; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo; } KEYBDINPUT, *PKEYBDINPUT, FAR* LPKEYBDINPUT; typedef struct tagHARDWAREINPUT { DWORD uMsg; WORD wParamL; WORD wParamH; } HARDWAREINPUT, *PHARDWAREINPUT, FAR* LPHARDWAREINPUT; #define INPUT_MOUSE 0 #define INPUT_KEYBOARD 1 #define INPUT_HARDWARE 2 typedef struct tagINPUT { DWORD type; union { MOUSEINPUT mi; KEYBDINPUT ki; HARDWAREINPUT hi; }; } INPUT, *PINPUT, FAR* LPINPUT; VOID mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo) { INPUT ms; BEGINCALLVOID() ms.type = INPUT_MOUSE; ms.mi.dwFlags = dwFlags; ms.mi.dx = dx; ms.mi.dy = dy; ms.mi.mouseData = dwData; ms.mi.time = 0; ms.mi.dwExtraInfo = dwExtraInfo; NtUserSendInput(1, &ms, sizeof(INPUT)); ENDCALLVOID() } VOID keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo) { INPUT kbd; BEGINCALLVOID() kbd.type = INPUT_KEYBOARD; kbd.ki.dwFlags = dwFlags; kbd.ki.wVk = bVk; kbd.ki.wScan = bScan; kbd.ki.time = 0; kbd.ki.dwExtraInfo = dwExtraInfo; NtUserSendInput(1, &kbd, sizeof(INPUT)); ENDCALLVOID() } что за ENDCALLVOID() и BEGINCALLVOID()? и как понимать это: откуда? кстате спасибо за отзывчивость, это стало редкостью тут(( ЗЫ какойто чудокод клерка
int NtUserSendInputServicCall (Count,Input,Size) { __asm { MOV EAX,11F6 MOV EDX,7FFE0300 mov edx, esp sysenter retn } }??????????????????????
В olly видно что SendInput идёт в ntdll.KiFastSystemCall напрямую, а не через NtUserSendInput (win xp sp3) ntdll.KiFastSystemCall это mov edx, esp sysenter retn т.е. параметры от SendInput там доступны по ссылке на стек.