Как прыгнуть на [GetProcAddress]?

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 10.02.2010 (Ср) 22:20

Хакер писал(а):Так тебя исключительно сабклассинг волнует, который является чистейшей воды частным случаем использования callback-ов? Или все случае использования callback-ов?

Нет, субклассинг - для примера :) Ещё есть хуки и таймеры. Другие случаи callback-ов, вроде как, более безопасны в ИДЕ.

И как всё же перехватить Addressoff? и как выяснить, что именно это за addressof (скажем, callback, безопасная для субклассинга и callback, безопасная для хука будут совсем не одинаковыми, у них даже количество параметров разное)
Хакер писал(а):А если SetWindowLong перехвачена правкой адреса в таблице экспорта user32.dll
Я предполагаю аддин, который просто делает безопасной отладку для некоторых случаев, для которых она опасна. Причём, ничего не меняя в коде. Если юзеру аддина нужно выйти за рамки этих случаев, кто ж ему помешает?
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 10.02.2010 (Ср) 22:32

Безопасных callback-ов не бывает.

И как всё же перехватить Addressoff?

В Native-кодной программе выражение с квазиоператором AddressOf компилируется в константу-адрес (адерс указанной функции). В P-кодной программе оно компилируется в константу-адрес Native-кодного переходника на P-кодную функцию.

В IDE компиляции всегда происходит в P-код. И в IDE генерацией всех переходников (включая переходники, занимающиеся вызовом DllFunctionCall для поиска) занимается одна и та же функция, которую я прозвал «клонировщик динамического кода». Перехватываешь её внутри работающей IDE и в путь.

Собственно говоря, я тебя обрадую: там уже имеется защитный механизм на случай вызова callback-функций после остановки проекта (проверка на EbMode, там, в частности, есть). Но в этом механизме косяк: если проект остановлен, и функция обратного вызова уже не существует, осуществляется мгновенный возврат из функции (так и должно быть), но такой возврат, как будто callback принимает 0 параметров. Если у callback-а не 0 параметров, защитный механизм портит стек и всё идёт к чертям. К слову, не всегда идёт, у вызывающей стороны всегда есть возможность сделать следующее:
Код: Выделить всё
push ebp
mov ebp, esp
call <...>
mov esp, ebp
pop ebp

Тогда нарушение стека не страшно.

Собственно, какую идею я тебе предлагаю: add-in смотрит, сколько реально параметров у функции, и правит её переходник-делегат так, чтобы он не портил стек. Классная вещь будет. Возьмёшься?
—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: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 10.02.2010 (Ср) 22:57

Смеёшься? я даже близко не потяну :oops: И если я абстрактно понял твоё объяснение (кажется, понял), то даже приблизительно не представляю, как это можно реализовать... особенно - ассемблерные вставки... б-р-р-р...

Впрочем, какую функцию нужно ловить? Как зовут «клонировщика динамического кода»? И как узнать, сколько у callback-a параметров? Поковыряться всё равно интересно
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 10.02.2010 (Ср) 23:11

Как зовут «клонировщика динамического кода»?

Никак не зовут, это внутрення функция, она не экспортируется. Исходников vbaX.dll я не видел, чтобы знать, как в них называлась эта функция.

Но найти её легко: это единственное в vbaX.dll место, откуда вызывается FlushInstructionCache.

И как узнать, сколько у callback-a параметров?

Что значит как? Ты же — Add-in. Если ты Add-in, тебе доступен исходный код проектов. И я не помню, доступно ли там через объектную модель получить эту информацию, но даже если нет, это легко получить из исходного кода функции.
—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: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 10.02.2010 (Ср) 23:27

Хакер писал(а):Что значит как? Ты же — Add-in.
Точно :D Вот, блин, туплю :oops:
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 13.02.2010 (Сб) 10:01

Я наврал. Другая функция занимается генерацией AddressOf-переходников.
—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: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 15.02.2010 (Пн) 13:50

Ждешь, чтобы переспросили? Пожалуйста: ну и какая? Впрочем, если она-таки не экспортируемая, то всё равно вряд ли я её поймаю :oops:
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 15.02.2010 (Пн) 14:20

Не жду. Как я тебе могу сказать, какая? Они безымянные. У первой был отличительный признак, у второй таких нет. Я не заметил, но я и не приглядывался.

Но я другое заметил: изначально переходник содержит число 0x1111, как число байт, занимаемых аргументов функции. А потом клонировщик заменяет эту константу нулём, причём ноль берётся откуда-то из структур, описывающих функцию. Мысль в том, что это не клонировщике косяк (и его не надо перехватывать), а косяк в структурах данных: вместо числа байт, который должен удалить переходник из стека, там всегда ноль. Возможно, они тупо забыли написать код, который сохраняет эту величину. Тогда его надо написать самому :)
—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: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 16.02.2010 (Вт) 11:16

Хакер писал(а):Мысль в том, что это не клонировщике косяк (и его не надо перехватывать), а косяк в структурах данных: вместо числа байт, который должен удалить переходник из стека, там всегда ноль. Возможно, они тупо забыли написать код, который сохраняет эту величину. Тогда его надо написать самому
Хакер писал(а):Классная вещь будет. Возьмёшься?
Поскольку я не потяну, а вещь может получится классная, может тогда ты возьмешься? Как наиболее разобравшийся в вопросе (да, видимо, и единственный, кто в эти дебри залезал так глубоко :) )

И, кстати, как там кирпич? Или ты его забросил?
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 16.02.2010 (Вт) 11:24

Поскольку я не потяну, а вещь может получится классная, может тогда ты возьмешься?

Может быть.

У меня сейчас нет ни времени, ни сил (болею) его доделывать. Но вот его-то ты сам смог бы доделать, разве нет? Ведь я все детали описал.
—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: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 16.02.2010 (Вт) 20:52

Хакер писал(а):а кирпич так и не дописан в плане нерешённых вопросов.
Хакер писал(а):Но вот его-то ты сам смог бы доделать, разве нет? Ведь я все детали описал.
ты описал в деталях то, что у тебя уже готово и упомянул о нескольких путях решения того, что пока не готово :) Ту часть, которая для ИДЕ с патчерами и вставками, я даже приблизительно не представляю
Артур
 
   

Пред.

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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 27

    TopList