cdecl

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

cdecl

Сообщение 0xy » 27.09.2011 (Вт) 6:23

Как работать с такими dll?

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

Re: cdecl

Сообщение Хакер » 27.09.2011 (Вт) 7:01

Через переходники.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.09.2011 (Вт) 13:58

А в чём собственно проблема?

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 27.09.2011 (Вт) 15:19

Хакер писал(а):Через переходники.

dll-переходники? А есть ли в природе готовые решения для генерации таковых?

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

Re: cdecl

Сообщение Хакер » 27.09.2011 (Вт) 15:26

0xy писал(а):dll-переходники?

Не обязательно DLL, можно на лету в памяти генерировать.

0xy писал(а):А есть ли в природе готовые решения для генерации таковых?

Если о генерации на-лету, то есть, но не доделано и не опубликовано :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 27.09.2011 (Вт) 16:11

Я спрашивал о готовых инструментах для генерации dll-переходников.
Хакер писал(а):Если о генерации на-лету, то есть, но не доделано и не опубликовано :)

Патч msvbvm видать? ;)

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

Re: cdecl

Сообщение Хакер » 27.09.2011 (Вт) 16:41

0xy писал(а):Патч msvbvm видать? ;)

Да нет, он здесь близко не причём.

Просто кирпич, генерирующий в памяти переходники с одного прототипа на другой. Как пару примеров: переходники между соглашениями или переходники, позволяющие использовать метод формы или класса в роли WindowProc-а.

В твоём-то случае вообще достаточно просто убрать за собой параметры из стека.
Всего-то в памяти с x-флагом разместить вот такой 10-байтовый блок: B8XXXXXXXXFFD0C2YYYY
Вместо иксов — адрес оригинальной cdecl-процедуры, а вместо игреков — количество байтов, занимаемых аргументами.

Ну и вызвать этот переходничок например так.

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

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 27.09.2011 (Вт) 22:30

B8XXXXXXXXFFD0C2YYYY

Так ведь Call eax стек подвинет!?

PS
Все же, не проще ли пропатчить msvbvm так, чтобы она сама восстанавливала стек, если этого не сделала вызванная процедура?
Upd
Глянул--так вроде и патчить не надо :) VB ведь при таком вызове не падает, а культурно говорит "Runtime Error 49"--т.е. стек он исправляет. Тогда ыходит, что можно просто идти дальше (по крайней мере, если функция не возвращает параметров типа String). Я прав??

Upd2
Хм, патчить таки надо. Ибо, как я и предполагал, не возвращаются строковые параметры, а также значение самой функции :(

Пока сделал патч для VBA (Офис 97)--там все просто:
Код: Выделить всё
Function PatchVBA4cdecl(Optional Enable As Boolean = True) As Boolean
' для вызовов dll с соглашением cdecl
'!Support only vba332.dll v.3.0.7019!
Const PAGE_EXECUTE_READWRITE = &H40
Const pCRC = &HD8, CRC = &H1928EA, pPatch1 = &H155E26, pPatch2 = &H155E6B
Const Original = "3B FC 0F 85 BB 6D 00 00", Patch = "8B E7 90 90 90 90 90 90"
Dim p&, i&, S$, er&
p = GetModuleHandle("vba332")
CopyMemory ByVal VarPtr(i), ByVal (p + pCRC), 4
If i <> CRC Then PatchVBA4cdecl = True: Exit Function
If Enable Then S = Hex2Bin(Patch) Else S = Hex2Bin(Original)
er = VirtualProtect(ByVal p + pPatch1, 77, PAGE_EXECUTE_READWRITE, i)
CopyMemory ByVal p + pPatch1, ByVal S, 8
CopyMemory ByVal p + pPatch2, ByVal S, 8
er = VirtualProtect(ByVal p + pPatch1, 77, ByVal i, i)
End Function

А с VB6 несколько сложнее...
Последний раз редактировалось 0xy 30.03.2013 (Сб) 3:20, всего редактировалось 1 раз.

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

Re: cdecl

Сообщение Хакер » 28.09.2011 (Ср) 5:53

0xy писал(а):Так ведь Call eax стек подвинет!?

Глупость. Call положит адрес возврата, оригинальная функция его уберёт. Останутся аргументы, наш переходник его уберёт. Всё гладко, все довольны.

0xy писал(а):Все же, не проще ли пропатчить msvbvm так, чтобы она сама восстанавливала стек, если этого не сделала вызванная процедура?

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


А выложенный тобою код — пугающий непрофессиональный блек-кодинг :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 28.09.2011 (Ср) 7:50

Хакер писал(а):
0xy писал(а):Все же, не проще ли пропатчить msvbvm так, чтобы она сама восстанавливала стек, если этого не сделала вызванная процедура?

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

Ну, в крайнем случае, как раз этой функцией можно и заняться ;)
Но, похоже, до этого дело не дойдет: оказывается, после компиляции, On Error Resume Next таки РУЛИТ!!! :alien: :)
А под IDE, видимо, можно сделать по аналогии с VBA.
А выложенный тобою код — пугающий непрофессиональный блек-кодинг :)

Ну да. Зато дешево и практично :)

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

Re: cdecl

Сообщение Хакер » 28.09.2011 (Ср) 7:56

0xy писал(а):Ну, в крайнем случае, как раз этой функцией можно и заняться ;)

Зачем??? По-моему, тебе кажется, что ты что-то хорошее придумал, но на деле, совершенно ничего хорошего.

0xy писал(а):Но, похоже, до этого дело не дойдет: оказывается, после компиляции, On Error Resume Next таки РУЛИТ!!! :alien: :)

Не рулит. Будет непредсказуемо падать.

0xy писал(а):А под IDE, видимо, можно сделать по аналогии с VBA.

Ох :cry:

0xy писал(а):Ну да. Зато дешево и практично :)

Я не понимаю. Ты противишься применить предложенное мною, потому что... почему? Чёрт возьми, я предложил 10-байтовый переходник, в который нужно вписать два числа. Это гениальное и простое решение, и ОНО ВСЕГДА РАБОЧЕЕ. Вне зависимости от версии, от того, отладка ли под IDE, или скомпилировано, скомпилировано ли в Native-код или скомпилировано в P-код. Это единственное правильное, суперстабильное решение, и оно к тому же самое простое из всех упомянутых.

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

Почему так?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 28.09.2011 (Ср) 9:12

Ну, не силен я во всяких высокоуровневых наворотах. От слов "апплеты" и "субклассинг" вообще под стол прячусь :) А осиливать это все некогда, да, пожалуй, и не за чем.
А по-сему, вкуривать твой код мне намного сложнее, чем писать подобные патчи.
Да и под VBA он вряд ли будет работать. А для меня важна если не совместимость, то хотя бы легкость адаптации кода между VB и VBA.

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

Re: cdecl

Сообщение Хакер » 28.09.2011 (Ср) 9:14

Что за глупости? Причём здесь вообще апплеты и субклассинг?
Что осиливать? Вызвать HeapAlloc, выделить 10 байтовый блок памяти, записать туда переходник и потом вызывать его?
Патчи пишешь не ты.
То, что я тебе сказал, будет работать хоть под VBA, хоть под Си++, хотя никакой необходимости там в этом нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 01.10.2011 (Сб) 23:58

Апплеты упоминались в примере к твоей приблуде (FuncPtrExample.vbp), причем у меня этот пример падает--вот я под строл и спрятался :D

Да и разбираться в твоем коде на тот момент не было времени (а как заюзать его, не разобравшись--то ли крупными буквами не написано, то ли плохой из меня копи-пастер :) )
По-сему набросал я этот патч под VBA (а не Пушкин, как ты подумал ;) ) и успокоился.

Сейчас гляжу твой код... Любопытно, что и я собирался ковырять именно эту функцию :) Вот только ты ее почему-то не патчишь, а с немалым трудом перехватываешь :?: И, как я понял, пакованные файлы работать не будут?

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

Re: cdecl

Сообщение Хакер » 02.10.2011 (Вс) 17:59

0xy писал(а):Апплеты упоминались в примере к твоей приблуде (FuncPtrExample.vbp), причем у меня этот пример падает--вот я под строл и спрятался :D

Не приблуда, а кирпич. Блуд здесь не причём. Отпишись в тему о кирпиче с подробностями падения.

0xy писал(а):Да и разбираться в твоем коде на тот момент не было времени (а как заюзать его, не разобравшись--то ли крупными буквами не написано, то ли плохой из меня копи-пастер :) )

Разбираться не обязательно. Использовать легко:
  • Добавить модуль в проект
  • Включить волшебные указатели (вызвать функцию, которая это делает, читай топик)
  • Инициализировать (присвоить значение, то есть адрес) объявленному указателю.
  • Вызвать через указатель любой нужный код.

0xy писал(а):Любопытно, что и я собирался ковырять именно эту функцию :)

Нелюбопытно. У нас с тобой совершенно разные задачи. У тебя — сделать вызов cdecl-функций, а у меня — привнести указатели на функции как явление.

0xy писал(а):Вот только ты ее почему-то не патчишь, а с немалым трудом перехватываешь

Потому что незачем её патчить, потому что нужно подменить адрес. Подмена адреса тебе не поможет. И никакого труда в её перехватывании не было.

0xy писал(а):И, как я понял, пакованные файлы работать не будут?

Пакеры — бесполезные (могу обосновать почему) утилиты, которые портят файл, сохраняя его работоспособность. Если работоспособность сохранена не полностью, это проблема пакера.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 03.10.2011 (Пн) 16:43

Хакер писал(а):Пакеры — бесполезные (могу обосновать почему) утилиты

Любопытно: как ты обоснуешь "бесполезность" пакеров как средства защиты софта? :D

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

Re: cdecl

Сообщение Хакер » 03.10.2011 (Пн) 18:13

0xy писал(а):Любопытно: как ты обоснуешь "бесполезность" пакеров как средства защиты софта? :D

Не путай пакеры и крипторы.
Идея криптеров — сокрыть исходный код.
Идея пакеров — сжать исходный код, и опционально слить все библиотеки в один файл.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: cdecl

Сообщение 0xy » 04.10.2011 (Вт) 20:16

Вообще-то, в наше время, в природе чаще встречаются проты, обладающие функционалом и криптеров, и пакеров, и еще кое-чем. Основная их задача--затруднить модификацию кода защищенного приложения, и, в рамках этой стратегии, практически асе они портят импорт ;)

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

Re: cdecl

Сообщение Хакер » 04.10.2011 (Вт) 20:19

Наше время не интересует. Есть крипторы, есть пакеры. Хорошая прямая терминология. И вот крипторы выполняют совсем другую цель. Они могут даже увеличить файл в 100 раз, если это нужно для их задачи. А у пакеров задача — уменьшить объём.

Я собирался обосновать бесполезность пакеров. Бесполезность крипторов я обосновывать не буду.

По теме есть вопросы?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.10.2011 (Вт) 22:57

Хакер писал(а):Я собирался обосновать бесполезность пакеров.

Ну так обоснуй, раз собирался. Интересно послушать.

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

Re: cdecl

Сообщение Хакер » 04.10.2011 (Вт) 23:27

Это будет оффтопик. Поищи, где-то tyomitch писал, собственно я напишу то же самое.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49

    TopList