Возникла необходимость использовать в своей программе фу-ию SetForegroundWindow, НО БЕЗ использывания WinApi, т.е. нужен прототип на ассемблере. Может есть у кого готовое решение или хотябы идеи где эту функцию можно раздабыть?
Ну грубо говоря, например, взять DLL в которой находится эта функция и выдрать от туда код этой функции и всех к оторым она обращается, а затем вставить все это в свою программу: function my_SetForegroundWindow; asm .... end; Наверно как то так, но как конкретно это сделать, у меня знаний не хватает
Для тех кто ни как не поймет чего я хочу, пример для фу-ии 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.
Дак мешает какраз то, что я не знаю как и каким отладчиком это сделать, ну нет у меня опыта, а научиться очень хочется. Я буду очень признателен если мне ктонибудь разжует как енто сделать!
Пробывал ковыряться отладчиком hiew7.10 fullLen, но так и не понял как находить код нужных мне функции...
Это тоже отладчик? Может дадите небольшой алгоритм как с помощю IDA выдрать из библиотеки какую-нибудь функцию??
Классика отладки http://www.ollydbg.de/ Пишешь простенькую прогу создающую окно и вызывающую SetForegroundWindow открываешь её в отладчике листаешь и сразу видишь нужную функцию (api красным помечены), ставишь бряк (F2) на функции, жмёшь F9 - прога доработает до бряка. Затем F7 - пошаговое выполнение и любуйся что она делает.
Топик довольно-таки старый, но я позволю себе отписаться. niro А какова будет переносимость программы, использующей такой подход? В следующем сервиспаке изменится чуток SetForegroundWindow() или номер соответствующего сервиса в ядре и код твой будет вместо своего предназначения пытаться отправлять письма в мелкософт. Так же не ясны цели. Скрыть вызов этой функции или написать программу работающую "самостоятельно, без системы"? И в том, и в другом случае поспешу разочаровать - SetForegroundWindow() корнами своими уходит в Win32k.sys, в ядро. Так что скопипастив из дизассемблера код юзермодного переходника ни одной из этих целей добиться не выйдет. Мой совет: не занимайся ерундой. Если нужно вызвать ядерный сервис без использования WinAPI, то _динамически_ найди нужный номер сервиса (в ntdll) и вызывай с помощью int 02eh.