Прототип функции SetForegroundWindow

Тема в разделе "WASM.BEGINNERS", создана пользователем niro, 3 ноя 2009.

  1. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Возникла необходимость использовать в своей программе фу-ию SetForegroundWindow, НО БЕЗ использывания WinApi, т.е. нужен прототип на ассемблере. Может есть у кого готовое решение или хотябы идеи где эту функцию можно раздабыть?
     
  2. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    http://www.google.com/search?q=SetForegroundWindow
     
  3. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    - ЭТО как??????
     
  4. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Искал, но ничего конкретного не нашлось :dntknw:
     
  5. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Ну грубо говоря, например, взять DLL в которой находится эта функция и выдрать от туда код этой функции и всех к оторым она обращается, а затем вставить все это в свою программу:

    function my_SetForegroundWindow;
    asm
    ....
    end;

    Наверно как то так, но как конкретно это сделать, у меня знаний не хватает :dntknw:
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну раз не хватает знаний, то используй то, на что их хватает - WinAPI!!!
     
  7. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Нет не катит. Нужен ассемблер!
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    niro
    нет катит. вы не знаете чего хотите!
     
  9. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    niro:
    Тогда уж обращайся сразу к теневым сервисам =D
     
  10. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Для тех кто ни как не поймет чего я хочу, пример для фу-ии keybd_event, что в user32.dll находится, выглядит эта функция так:

    user32.dll ↓FRO -------- a32 PE.
    .77E59B3B| 55 push ebp
    .77E59B3C: 8BEC mov ebp,esp
    .77E59B3E: 83EC1C sub esp,01C ;"∟"
    .77E59B41: 8B4D10 mov ecx,[ebp][10]
    .77E59B44: 8365F000 and d,[ebp][-10],000
    .77E59B48: 894DEC mov [ebp][-14],ecx
    .77E59B4B: 6A01 push 001
    .77E59B4D: 660FB64D08 movzx cx,b,[ebp][08]
    .77E59B52: 66894DE8 mov [ebp][-18],cx
    .77E59B56: 58 pop eax
    .77E59B57: 660FB64D0C movzx cx,b,[ebp][0C]
    .77E59B5C: 66894DEA mov [ebp][-16],cx
    .77E59B60: 8B4D14 mov ecx,[ebp][14]
    .77E59B63: 894DF4 mov [ebp][-0C],ecx
    .77E59B66: 8D4DE4 lea ecx,[ebp][-1C]
    .77E59B69: 6A1C push 01C
    .77E59B6B: 51 push ecx
    .77E59B6C: 50 push eax
    .77E59B6D: 8945E4 mov [ebp][-1C],eax
    .77E59B70: E81560FCFF call SendInput ---↑
    .77E59B75: C9 leave
    .77E59B76: C21000 retn 00010 ;" ►"

    как видно она обращается к SendInput , которая в свою очередь выглядит так:

    user32.dll ↓FRO -------- a32 PE.7
    .77E1FB8A| B8E1110000 mov eax,0000011E1 --
    .77E1FB8F: 8D542404 lea edx,[esp][04]
    .77E1FB93: CD2E int 02E
    .77E1FB95: C20C00 retn 0000C ;" ♀"
    .77E1FB98| B891110000 mov eax,000001191 --
    .77E1FB9D: 8D542404 lea edx,[esp][04]
    .77E1FBA1: CD2E int 02E
    .77E1FBA3: C20800 retn 00008 ;" ◘"

    Вот собственно и все, рабочий код в итоге собирается из трех процедур:

    procedure SendInput;
    asm
    mov eax,0000011F6h //хп сп2
    // mov eax,0000011E1h //для венды2000
    lea edx,[esp][04]
    // int 1
    int 02Eh
    ret 0000Ch // ;" "
    end;
    procedure keybd_event(bVk: Byte; bScan: Byte; dwFlags, dwExtraInfo: DWORD); stdcall;
    asm
    // push ebp
    // mov ebp,esp
    sub esp,01Ch //;""
    mov ecx,[ebp][10h]
    and dword ptr [ebp][-10h],0
    mov [ebp][-14h],ecx
    push 001
    movzx cx,byte ptr [ebp][08h]
    mov [ebp][-18h],cx
    pop eax
    movzx cx, byte ptr [ebp][0Ch]
    mov [ebp][-16h],cx
    mov ecx,[ebp][14h]
    mov [ebp][-0Ch],ecx
    lea ecx,[ebp][-1Ch]
    push 01Ch
    push ecx
    push eax
    mov [ebp][-1Ch],eax
    call SendInput
    leave
    ret 00010h
    end;
    procedure KeyB (key:byte; press:boolean);
    begin
    press := not press;
    inc (press,integer(press));
    keybd_event (key,MapVirtualKey(key,0),integer(press),0);
    end;

    И как я понимаю, WinApi здесь не используется... Поправте если не так. Вот что то подобное мне нужно для SetForegroundWindow.
     
  11. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Ну так что мешает посмотреть, что вызывает SetForegroundWindow под отладчиком?
     
  12. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    niro
    я понял! вы хотите чтобы роботоподобную роботу сделали за вас, извините я пас
     
  13. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Дак мешает какраз то, что я не знаю как и каким отладчиком это сделать, ну нет у меня опыта, а научиться очень хочется. Я буду очень признателен если мне ктонибудь разжует как енто сделать! :)
     
  14. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Пробывал ковыряться отладчиком hiew7.10 fullLen, но так и не понял как находить код нужных мне функции...:dntknw:
     
  15. razor

    razor Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    40
    niro а чем IDA не устраивает ?
     
  16. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Это тоже отладчик? Может дадите небольшой алгоритм как с помощю IDA выдрать из библиотеки какую-нибудь функцию??
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Классика отладки http://www.ollydbg.de/
    Пишешь простенькую прогу создающую окно и вызывающую SetForegroundWindow открываешь её в отладчике листаешь и сразу видишь нужную функцию (api красным помечены), ставишь бряк (F2) на функции, жмёшь F9 - прога доработает до бряка. Затем F7 - пошаговое выполнение и любуйся что она делает.
     
  18. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Благадарю, все разобрался таки :)
     
  19. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Топик довольно-таки старый, но я позволю себе отписаться.

    niro
    А какова будет переносимость программы, использующей такой подход? В следующем сервиспаке изменится чуток SetForegroundWindow() или номер соответствующего сервиса в ядре и код твой будет вместо своего предназначения пытаться отправлять письма в мелкософт.

    Так же не ясны цели. Скрыть вызов этой функции или написать программу работающую "самостоятельно, без системы"? И в том, и в другом случае поспешу разочаровать - SetForegroundWindow() корнами своими уходит в Win32k.sys, в ядро. Так что скопипастив из дизассемблера код юзермодного переходника ни одной из этих целей добиться не выйдет.

    Мой совет: не занимайся ерундой. Если нужно вызвать ядерный сервис без использования WinAPI, то _динамически_ найди нужный номер сервиса (в ntdll) и вызывай с помощью int 02eh.
     
  20. niro

    niro New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2009
    Сообщения:
    35
    Да, Вы судя по всему знающий человек, может распишите суть идеи по подробней?