asm.dll от Approximator-а для вызова функций по указателю

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

asm.dll от Approximator-а для вызова функций по указателю

Сообщение arthur2 » 21.03.2014 (Пт) 19:20

В общем, длл выложена вот в этом топике вместе с примером использования:
viewtopic.php?p=58170#p58170

сам файл: download/file.php?id=1077

В библиотеке всего одна единственная функция, которую можно как угодно задеклариовать - с любым количеством параметров любых типов и с любым типом возвращаемых значений. Первым параметром передается адрес функции, на которую будет перенаправлен вызов, а всё остальное произвольно! Единственное - та функция, на которую будет перенаправлен вызов должна быть с теми же типами параметров и количеством параметров и тем же типом возвращаемого значения. Точнее, на сколько я понял, должны только совпадать размеры данных у вызываемой и продекларированной функции.

Я задекларировал разными способами её же через тлб - всё так же работает.

Вопрос: как это возможно? В чем фокус?
Артур
 
   

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение ger_kar » 21.03.2014 (Пт) 20:14

Ну насколько я могу судить почитав тему по ссылке и не имея исходного кода самой библиотеки, то вызываемая функция из библиотеки - это так называемый переключатель описанный в топике, но сделанный в виде экспортируемой библиотечной функции. Сам процесс при этом выглядит так: VB пакует аргументы в стек согласно объявлению функции, а уже вызываемая функция-переходник просто делает переадресацию вызова таким образом, что реальная функция, которую вызывает переходник просто получает упакованные в стек аргументы в нужном виде.
arthur2 писал(а):Вопрос: как это возможно? В чем фокус?
Ну по сути в самой библиотечной функции написанной на чистом асме можно практически сотворить все что угодно. Я что-то подобное уже делал, но совсем для другого (в процессе взлома в отладчике одной вредной проги :) ).
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение The trick » 21.03.2014 (Пт) 21:18

Вот ее код:
Код: Выделить всё
POP ECX  ; Вытаскиваем адрес возврата
POP EAX  ; Вытаскиваем адрес функции, переданный первым параметром
PUSH ECX ; Кладем адрес возврата вместо адреса функции
JMP EAX  ; Прыгаем по адресу переданным первым аргументом

Т.е. просто переделываем стек, убирая первый переданный параметр, т.к. соглашение STDCALL то функция корректно почистить стек за собой сама.
UA6527P

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение arthur2 » 21.03.2014 (Пт) 21:55

Круто! Я даже понял :) И всё предельно просто! Даже появилось ощущение, что я слегка начал понимать асм...

А можно этот же код последовательностью лонгов?
Артур
 
   

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение The trick » 21.03.2014 (Пт) 22:26

Изображение
Код: Выделить всё
Asm(0) = &HFF515859
Asm(1) = &HE0

' Хотя байтами рациональней
Asm(0) = &H59
Asm(1) = &H58
Asm(2) = &H51
Asm(3) = &HFF
Asm(4) = &HE0
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение The trick » 21.03.2014 (Пт) 22:39

Или так
Код: Выделить всё
Dim C As Currency
C = 96635619.5417@
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение Хакер » 22.03.2014 (Сб) 2:02

А зачем вообще подобная библиотека нужна при том, что есть мой кирпич?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение ger_kar » 22.03.2014 (Сб) 5:33

Ну вообще насколько можно судить из постов Артура последнего времени, то он пытается понять "как это работает" и понять устройство многих вещей выходящих за рамки обычного. Наверное такой период бывает у каждого, у меня по крайней мере он тоже был.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение Хакер » 22.03.2014 (Сб) 6:38

Так а в чём вопрос-то. В упор не вижу и не понимаю.

arthur2 писал(а):В чем фокус?

Где фокус-то?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение arthur2 » 22.03.2014 (Сб) 7:20

Кривоус Анатолий
Спасибо!
ger_kar писал(а):Ну вообще насколько можно судить из постов Артура последнего времени, то он пытается понять "как это работает"

Ага :) И в этом смысле, кстати, функция очень просветляющая!

Хакер писал(а):А зачем вообще подобная библиотека нужна при том, что есть мой кирпич?
По меньшей мере, функцию из неё можно импортировать через тлб. Значит можно вызывать по указателю до рантайма - например, в хуках. Или в экспортируемыех функциях, где не поднят рантайм. Ну и - как уже сказал - в голове многие вещи встали на место.

В чем фокус?
Внутри никакого фокуса. А снаружи - выглядит как чудо. Декларируй как хочешь, возвращай чё хочешь, параметров сколько угодно и каких угодно - ляпота.
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение arthur2 » 22.03.2014 (Сб) 11:13

Код: Выделить всё
POP ECX  ; Вытаскиваем адрес возврата
POP EAX  ; Вытаскиваем адрес функции, переданный первым параметром
PUSH ECX ; Кладем адрес возврата вместо адреса функции
JMP EAX  ; Прыгаем по адресу переданным первым аргументом
Хочу понять принципиальную вещь. Хотя вопрос, скорее всего, глупый. Вот мы берем что-то из стека, кладем в стек или ещё что-нибудь делаем, используя регистры. За счет чего есть уверенность, что именно те регистры, которые мы задействуем, не используются в это же время подо что-то другое?
Артур
 
   

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение The trick » 22.03.2014 (Сб) 13:13

За счет чего есть уверенность, что именно те регистры, которые мы задействуем, не используются в это же время подо что-то другое?
Смотри соглашение вызова StdCall - EAX, ECX и EDX используются внутри функции, поэтому мы их можем менять как угодно.
UA6527P

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: asm.dll от Approximator-а для вызова функций по указател

Сообщение arthur2 » 22.03.2014 (Сб) 19:16

Кривоус Анатолий
Понятно :) Спасибо!
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 53

    TopList