[DELPHI] Выпадает приложение при перехвате
[SIZE="1"]удалено[/SIZE]
2.
[QUOTE=GRA1N]
Код:
SetCodeHook(GetProcAddress(GetModuleHandle('gameShieldDll.dll'), 'frostSend'), GetProcAddress(GetModuleHandle('lib.m3d'), 'hookfrostsend'), @SystemFunctionBridge)
[/QUOTE]
Возможно, вам удастся меня переубедить, но меня несколько смущает тот факт, что вы пишете старое содержимое функции в адресное пространство библиотеки lib.m3d. Вы пробовали разобраться с механизмом сплайсингом "вручную", без ApiHookTools?
[SIZE="1"]удалено[/SIZE]
[SIZE="1"]удалено[/SIZE]
По правде говоря, сходу та ситуация, которую вы описываете, может напомнить мне две вещи: либо выход за границу доступной памяти при чтении / записи, либо нарушения соглашений о вызовах функций. Не помню, правда, как с последним обстоит дело конкретно в Делфи, надеюсь, более опытные дельфисты поправят меня, если я неправ.
Объясню аккуратнее, что меня смущает. Я специально вкратце ознакомился с ApiHookTools перед тем, как вам отвечать; если правильно помню, SetCodeHook осуществляет выделение памяти по адресу, который был передан в NewProcAddress. Вы туда передаете адрес некоей процедуры hookfrostsend, расположенной внутри lib.m3d. Отсюда вопрос: что там изначально находится? Какая-то заглушка? Или нет? Можете ли вы гарантировать, что там хватает памяти под исходную функцию?
Наконец, почему я начал говорить о "ручном" сплайсинге: если бы вы делали все вручную, то вам бы, скорее всего, не пришлось указывать конкретный адрес, куда копировать старую функцию, вы бы вызвали какую-нибудь VirtualAllocEx, которая бы сама нашла свободное место в нужном объеме и просто вернула бы адрес.
P.S. Прошу меня простить, надо выходить, завтра отпишусь, как буду тут.
P.P.S. Если что, можете писать в ICQ, постараюсь ответить.
[SIZE="1"]удалено[/SIZE]
не учтена мультитредовость.
что возвращается в oldfrostSend ?
[SIZE="1"]удалено[/SIZE]
[SIZE="1"]удалено[/SIZE]
Цитата: GRA1N
Старая функция возвращает число записанных в сокет байт, как и оригинальная winsock-овская send.
Я спрашивал не о результате фукции, а о значении в oldfrostSend. Выведите его и выведите адреса GetProcAddress(GetModuleHandle('gameShieldDll.dll'), 'frostSend'), GetProcAddress(GetModuleHandle('lib.m3d'), 'hookfrostsend' перед установкой хука.
Цитата: GRA1N
Про мультитредовость пожалуйста поподробнее, вы имеете ввиду, что в тот момент, когда я ставлю перехват, эта функция чем-то вызывается? В таком случае мне было бы интересно, как сделать suspend всем потокам, кроме моего, в момент установки хука :)
Это тоже в небольшой степени. Ваш перехватчик - не мультредовый, если он будет вызыватся одновременно из нескольких потоков - жди беды.