· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Переадресация и установка ординала на экспортируемую функцию...

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Апр 25, 2004 14:00:19

Я тут решил поиграться с переадресацией.... то бишь делаю фальшивый .. предположим wsock32.dll .... экспортирую функции с такими же именами и ординалами .... и при вызове ... программой ... функции из моей библиотеки переадрисовываю этот вызов реальной библиотеке а результат соотсвенно передаётся... в вызывающую программу ну вот естьп пару проблем...

После того как будет вызвана библиотека я загружаю реальную всок32 и получаю адрес той процедуры которую подменять собрался... после того как получил адрес и сохранил его например в realsuckaddr ... в функции с таким же именем ... как в и реальной ... пушаю параметры в стек и call realsuckaddr ... так вот тут первый вопрос можно ли как нибудь это сделать быстрее (проще)... второй вопрос в том что когда в DEF файле прописываю экспорт функции ну вот так например

bind @2 ... то .. ординал у bind почему то всё ровно 1... а не 2... =(.. в чём может быть проблема?


Дата: Апр 25, 2004 19:34:52 · Поправил: rst

в том то и дело, что ординалы могут быть (и есть) разные в разных версиях библиотек.
Как вариант - не делать прокси-либу (то, что ты предлагаешь - переадресация вызовов).
Лучше - загрузить либу, и настроить импорты в модулях на неё. Я почти так делал (только я делал хуки, а не фейк-либу)


Дата: Апр 25, 2004 20:08:45

А не проще попробовать готовые решения, например Dll Wrapper Wizard..


Дата: Апр 25, 2004 20:31:49 · Поправил: Quantum

Fallout
пушаю параметры в стек и call realsuckaddr ... так вот тут первый вопрос можно ли как нибудь это сделать быстрее (проще)...
Можно. Например так:
include wsock32.inc
; ...
xbind PROC a:DWORD,b:DWORD,c:DWORD
 invoke bind,a,b,c
 ; ...
xbind ENDP

А потом в DEF прописать так:
EXPORTS xbind = bind

bind @2 ... то .. ординал у bind почему то всё ровно 1... а не 2... =(.. в чём может быть проблема?
EXPORTS accept @1
EXPORTS bind @2


Дата: Апр 26, 2004 21:12:30

EXPORTS accept @1
EXPORTS bind @2

а способ прикольный +))) а вот еслиб такая проблема действительна была ...а ассемпт был бы не нужен +)) ?
с этим оказалось всё ок просто ПЕ вьювер был не нормальный....

EXPORTS xbind = bind если так экспортировать то будет экспортироваться xbind +) а не bind надо вот так
EXPORTS bind = xbind
а в моём случаи
EXPORTS bind = xbind @2


так ну ладно ... весь код переписал по твоему совету который по логике.... логичен... всё остальное стёр... не оставил не бекапа ничего (предыдущая версия работала и занимала 5.5 кб) тут переделал всё откомпилил .... получилось 4.5 Ура! +) всё экспортирвоано нормально .... и тд итп но когда приложение загружается то .. ОШИБКа! =((( обидно даже... может поможет кто .. использовать ... такой... же принцып который по логике правилен... но почему то не работает =(((


Дата: Апр 27, 2004 00:56:40

Fallout
а вот еслиб такая проблема действительна была ...а ассемпт был бы не нужен +)) ?
Даже не знаю, но ординалы можно править в хекс-редакторе.

с этим оказалось всё ок просто ПЕ вьювер был не нормальный....
Юзай PE Tools!

надо вот так EXPORTS bind = xbind
Точно. Это я напутал, когда делал copy/paste.

ОШИБКа!
Что за ошибка? Можешь приаттачить приложение?


Дата: Апр 27, 2004 10:22:01

xbind PROC a:DWORD,b:DWORD,c:DWORD
invoke bind,a,b,c
xbind ENDP

Хм.. поздно вчера прсото пришёл ... не помню уже что за ошибка но она критическая была...(приатачить не могу так как всё дома а я на работе... работаем мы +)) так вот если просто обмазговать вот что тут написано ... впринцыпи возвращение в точку вызова то тут нет (ret) .. хм.. а если нет то код так и политит.. всё дальше и дальше... так что я думаю ret тут .. решит проблему... так как ВСок АПИ уже сама стек очитстит от параметров... то нам надо будет просто возвратится в точку вызова... хм. вот.


Дата: Апр 27, 2004 11:29:57

Может, я и глупость спрашиваю, но учел ли ты тот факт, что под Win2K все экспортируемые из wsock32.dll функции перенаправляются в ws2_32.dll, а в wsock32.dll "лежат" только имена функций, и вызывать их не имеет смысла?


Дата: Апр 27, 2004 12:22:29

Программа которая использует функции из всок32 вызывает их...из wsock32.... хочешь првоерить попробуй дизассемблируй всок и погляди что там....


Дата: Апр 27, 2004 12:26:56

Я это уже сделал, потому и задаю вопрос.
.text:74FE2D5B ; Exported entry   1. accept
.text:74FE2D5B                 public accept
.text:74FE2D5B ; SOCKET __stdcall accept(SOCKET s,struct sockaddr *addr,int *addrlen)
.text:74FE2D5B accept          db 'ws2_32.accept',0
.text:74FE2D69 ; Exported entry   2. bind
.text:74FE2D69                 public bind
.text:74FE2D69 ; int __stdcall bind(SOCKET s,const struct sockaddr *name,int namelen)
.text:74FE2D69 bind            db 'ws2_32.bind',0
...ну и так далее. Догадайся, что будет, если ты передашь управление на одну из таких функций?


Дата: Апр 27, 2004 14:04:38

Это не важно самое главное... я получаю аргументы при вызове всок32... и перенаправляю вызов в реальную сок32... а вот что дальше будет меня не волнует ... + заодно и совместимость с 9х +))) так что я всё вроде верно делаю....


Дата: Апр 27, 2004 14:31:13

Fallout
Смотря как перенаправляешь.

Если сам "ходишь" по таблице экспорта, то должен учитывать вот такие "перенаправления". Учтешь - совместимость будет и с Win9x, и с Win2K+, не учтешь - получишь совместимость только с Win9x.

А если пользуешься GetProcAddress, тогда, конечно, неважно. Но если ты "все делаешь верно", то откуда у тебя берется ОШИБКа, о которой ты все еще ничего внятного не сказал?

All
Я смутно помню (могу и ошибаться), что была какая-то проблема, связанная именно с перехватом функций winsock. Якобы дело в том, что, в отличие от стандартных API-функций, winsock использует не __stdcall, а __cdecl. Сейчас пытаюсь посмотреть, и (по крайней мере с первого взгляда) ничего такого не замечаю.

Кто знает, напомните - было ли что-то такое?


Дата: Апр 27, 2004 14:45:08

Помнится, некто mamaich с reversing.net писал что-то для перехвата функций winsock. Кажется это есть на mamaich.fuckru.net, не помню точно.
И вообще, исходники винсок "зарелизили" вместе с сырцами win2k


Дата: Апр 27, 2004 16:10:11

xbind PROC a:DWORD,b:DWORD,c:DWORD
invoke bind,a,b,c
xbind ENDP 

Если это заменить на:
xbind:
jmp  bind ;; или jmp  [bind] 

Параметры все равно в стеке. Так же могут решиться проблемы с stdcall / cdecl.
Только надо учесть, что после jmp нет смысла писать код, в отличае от invoke


Дата: Апр 27, 2004 16:35:40

Через ГетПроцессАдрес ничего не ошибалось (не в момент написания первого поста. а через два часа после него).... ошибка появилась после того как я инвокал ... по примеру.. уважаемого Квантума... который логичен обсалютно ... я прсото хочу по возможности уменьшить всё...

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078