Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > VB + asm


Автор: oleg1973 4.4.2004, 02:02
был тут флейм по поводу сабжа smile.gif
был даже прикол по поводу smile.gif (шутка типа )
вот я тоже решил подумать (я в VB баран бараном так что если че не так поправьте, это теоретические предпосылки к реализации)
кароче нада делать так
делаем некий массив с нашим откомпилированым кодом
типа char[] так далее
дальше нам нужна внешняя либа которая собственно и запустит код
тоесть прога на ВБ вызывает эту либу и передает ей в качестве параметра адрес массива
либа в свою очередь делает виртуал протект для того сегмента в котором массив ( сто пудово дата сегмент и не имеет атрибута ехе) и устанавливает ему окромя реад-врите еще и ехе флажок, ну и делает jmp туда
все чики поки smile.gif код будет запущен smile.gif

Автор: cardinal 4.4.2004, 13:27
Цитата
ну и делает jmp туда

Тут не уверен. Было предположение, что она отдельный поток вызывает с этой процедурой. Просто кто-то сказал если я не ошибаюсь, что также можно хуки ставить. Не проверял и не обдумывал, пока не до того...
Цитата
код будет запущен

И к чему это? Конечно будет запущен smile.gif
p.s. как ты понял тоже самое можно провернуть и в любом другом языке, который разрешает вызовы API

Автор: oleg1973 4.4.2004, 13:34
cardinal
да я это давно понял smile.gif
тода уж нада упростить все
в теории нада обработчик исключений на адрес массива переставить
потом ченить на ноль к примеру поделить
smile.gif

Автор: cardinal 4.4.2004, 14:40
Если честно: я ни хрена не понял wink.gif

Автор: oleg1973 4.4.2004, 16:56
cardinal
ну что происходит когда на ноль делиш к примеру? или ud2 делаеш?
вылазит окошко о том что прога выполнила ..... и так далее, тоесть срабатывает вындосовский обработчик
если к примеру адрес этого самого обработчика перенести на адрес массива с нашим кодом
то полсе тогоже самого деления на ноль будет выполнен наш код
smile.gif

Автор: cardinal 4.4.2004, 17:20
Цитата
ну что происходит когда на ноль делиш к примеру?

вылазит ошибка... (это я думаю про себя)...
Цитата
или ud2 делаеш?

не знаю, что такое ud2...
Цитата
вылазит окошко о том что прога выполнила

в смысле выполнила ошибку?
Цитата
то полсе тогоже самого деления на ноль будет выполнен наш код

Ииииии что это нам даст? smile.gif

p.s. извини если сильно торможу - у меня от pn переходов сейчас голова пухнет wink.gif

Автор: bom 4.4.2004, 19:48
Есть прекрасные исходники по этой теме, кто интересуется - http://databack4u.com/snc/vbasic.html#5

Автор: cardinal 4.4.2004, 21:18
Это я изучал, когда писал свою собственную статейку на этот счет. Можешь посмотреть:
http://forum.vingrad.ru/index.php?showtopic=15962
А вообще на том сайте, который ты указал, есть еще пара интересных вещей... Надо будет почитать.

Автор: oleg1973 5.4.2004, 02:39
bom
ну и мы про то же
Цитата
Кроме того в программе есть несложные (уже не на ассемблере, а на API) реализации диалоговых окон отрытия и сохранения файлов,

а это просто изумительная фраза smile.gif

Автор: bom 5.4.2004, 09:15
oleg1973

Цитата
это просто изумительная фраза


Для справки.
Юзанье API функций в VB довольно геморойное дело по сравнению с теми же Дельфями.

Автор: oleg1973 5.4.2004, 15:19
bom
для справки
Цитата
(уже не на ассемблере, а на API)

API не язык програмирования smile.gif

Автор: p0s0l 5.4.2004, 15:35
Цитата(oleg1973 @ 4.4.2004, 02:02)
был тут флейм по поводу сабжа smile.gif
был даже прикол по поводу smile.gif (шутка типа )
вот я тоже решил подумать (я в VB баран бараном так что если че не так поправьте, это теоретические предпосылки к реализации)
кароче нада делать так
делаем некий массив с нашим откомпилированым кодом
типа char[] так далее
дальше нам нужна внешняя либа которая собственно и запустит код
тоесть прога на ВБ вызывает эту либу и передает ей в качестве параметра адрес массива
либа в свою очередь делает виртуал протект для того сегмента в котором массив ( сто пудово дата сегмент и не имеет атрибута ехе) и устанавливает ему окромя реад-врите еще и ехе флажок, ну и делает jmp туда
все чики поки smile.gif код будет запущен smile.gif

И чем это дело-то уростит ? Пару ненужных лишних параметров не придется передавать ?
Цитата
тоесть прога на ВБ вызывает эту либу и передает ей в качестве параметра адрес массива

Как раз то и делается в примере, внешняя либа - это user32.dll, вызывает CallWindowProcA, и в качестве параметра передаёт адрес массива, а также и доп. параметры, которые могут понадобится в функции...
Добавлено @ 15:39
Насчет виртуал протекта - можно 1 раз вначале проги это сделать на все данные и всё. Но раз Cardinal ничего не делал, значит и так доступно для исполнения...

Добавлено @ 15:43
Или же, Олег, я тебя не понял ? smile.gif

Автор: cardinal 5.4.2004, 15:43
biggrin.gif
oleg1973, ну хватит тут прикалываться tounge.gif . Лучше бы объяснил, что ты выше имел в виду с делением на ноль и т.д. и смысл сего...

Автор: p0s0l 5.4.2004, 16:04
cardinal, он имеет в виду, что надо поставить обработчик исключений.
Например, поделил ты на 0 - и управление передастся этому обработчику. А в обработчике, например, сидит твоя асм-функция, или же происходит её вызов.
В Delphi это выглядит так:
Код

try // - тут устанавливается адрес нового обработчика ошибок
 ...
 a := b / 0; // происходит исключение
except
 < обработчик >; // при исключении (ошибке) это выполняется
end; // - восстанавливается адрес старого обработчика

Только не знаю, насколько это дело упростит, по-моему, даже усложнит, т.к. Васик может и сам время от времени ставить свои обработчики Exception'ов...

Автор: Mephisto 5.4.2004, 17:26
Код
try // - тут устанавливается адрес нового обработчика ошибок
...
a := b / 0; // происходит исключение
except
< обработчик >; // при исключении (ошибке) это выполняется
end; // - восстанавливается адрес старого обработчика

Если это так, то я не пойму зачем. Чем не устраивает:
Код
CallWindowProc pLShiftCode, VarPtr(value), shift, 3&, 4&

Лично я так юзаю. Меня вполне устраивает. Даже больше.

P.s.
Обработчик ошибок в барсике
Код
Sub Tratata()
    On Error Goto Eric
    ..........
    ..........
    ..........
    Exit Sub
Eric:
    'Obravbotka oshibki
end sub


Че-то я даже http://forum.vingrad.ru/index.php?showtopic=20511 ничего не понял по поводу UD2! withstupid.gif

Автор: oleg1973 5.4.2004, 20:25
согласен господа что путей передачи управления асм коду многа
но с ехцепшином прикольней smile.gif
Mephisto
ud2 эт команда есть такая в асме которая нихрена не делает кроме вызова исключения (ошибку генерит)

Автор: cardinal 6.4.2004, 00:31
Цитата
cardinal, он имеет в виду, что надо поставить обработчик исключений...

ну я понимаю, что он хочет его поставить, но ЗАЧЕМ? Объясните мне тупому, зачем енто тут надо делать? На примере с LShift если можно. Вы хотите сдвигать число влево если происходит ошибка? smile.gif Нет, серьезно... ничего не понимаю smile.gif
Цитата
согласен господа что путей передачи управления асм коду многа
но с ехцепшином прикольней

Если ошибка, то управление передается asm коду, а он что делает? ud2? Зачем?
Mephisto:
Цитата
Лично я так юзаю.

Уже стырил и пользуешься smile.gif

Автор: oleg1973 6.4.2004, 00:42
cardinal
ну просто пример с ексцепшином как один из вариантов активации кода на асме и все

Автор: p0s0l 6.4.2004, 09:49
Зато так можно набацать прогу в VB так, что потом если кто-то посмотрит на неё, то ничо не поймёт wink.gif
какие-то char'ы, деления на нуль и т.п. - как это работает ? wow.gif
Чисто для прикола новичков пугать... tounge.gif

Автор: cardinal 6.4.2004, 12:14
Ну так бы сразу и сказали smile.gif Я же спрашивал зачем, а вы все вокруг да около - надо было сразу сказать: для того, чтобы новичков пугать. biggrin.gif
Чисто для прикола можно было много чего написать
см. например здесь:
http://forum.vingrad.ru/index.php?showtopic=16186
Ту функцию GetFileName можно также переписать так:
Код
Private Function GetFileName(ByVal strFileName As String)
  If Right(strFileName, 1) = "\" Or strFileName = "" Then GetFileName = "" _
  Else GetFileName = GetFileName(Left(strFileName, Len(strFileName) - 1)) & Right(strFileName, 1)
End Function

tounge.gif

Автор: Mephisto 13.4.2004, 16:46
Цитата
Уже стырил и пользуешься

biggrin.gif biggrin.gif biggrin.gif
А шо поделаешь, уж очень к серцу припало.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)