Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > дубликат длл


Автор: bass 4.4.2012, 06:29
Такая ситуевина решил написать дллку подложу Ws2_32 Что бы подкинуть программе в корень и отлавливать сетевую активность....
Экспортировал все функции .... Но когда вызов проходит wsock32 в мою длл вызов попадает на совершенно другую функцию..... Че за бред.... Она лезет в дллл и по порядковому номеру чтоли ищет???? Вот тоже не задача экспортировал также вернее в томже порядке кроме жвух функций.... А попадает через 50 функций...... Куда копнуть...???

Заранее спасибо...

Автор: 500mhz 4.4.2012, 11:27
ну вполне , если по ординалам импортировать

а почему готовыми решениями не воспользоватся

Автор: bass 5.4.2012, 12:49
Так и оказалось что обращение  идет по порядковому номеру.... 
Вопрос такой экпортирую функцию вот так
Код

extern "C" __declspec(dllexport)__stdcall    WSAEnumProtocolsW     ()
{.....}


Как компилятору сказать что эта функция с порятковым номером таким......(builder)

Готовыми решениями не могу пользоваться по определенным обстоятельствам(Прога на винапи должна быть).

Автор: GremlinProg 5.4.2012, 12:55
Цитата(bass @  5.4.2012,  14:49 Найти цитируемый пост)
Как компилятору сказать что эта функция с порятковым номером таким......(builder)

http://msdn.microsoft.com/en-us/library/hyx1zcd3.aspx
ordinal - и есть порядковый номер

Добавлено через 1 минуту и 28 секунд
хотя, builder, хз, не использую

Автор: 500mhz 5.4.2012, 13:26
bass
там другая засада, если ехе ипортирует по ординалам из ws2_32 то твой враппер должен экспортировать функ точно в том же порядке и точно так же импортировать из ws2_32

Автор: bass 5.4.2012, 17:00
Не обращение едет только по индексу... Пришел к этому потому что хекс редактором скопировал таблицу импорта и потом обрабатывал текстовым редактором и функции идут как в оригинале а вот индексы что то не совпадают... 

Автор: 500mhz 5.4.2012, 20:16

bass
тебе что нужно перехватить? вызовы сокета? грузи в процесс свою дллку и делай патч импортов ехешника, самое простое и эффективное.

Автор: bass 6.4.2012, 04:05
Сначало так и сделал.... Но есть три приложения которые надо слушать ..... В одном вызовы шли через длл пришлось править ее импорты..... Во втором вызовы идут уже из распределенного кода в памяти...... (И вот здеся тупик.....) даже не из модуля .... ПОходу при загрузке этот код распаковываеться....((( До третьего не добрался.... Вот и начал писать вайпер...... Сейчас засада в том что Билдер ну не как не реагирует на деф файл.....

Код

LIBRARY     WS2_32.DLL

EXPORTS
    FreeAddrInfoW                  @3   ; FreeAddrInfoW
    GetAddrInfoW                   @4   ; GetAddrInfoW
    GetNameInfoW                   @5   ; GetNameInfoW


Меняю цифорки местами после компиляции не какого результата.... Посмотрел PE Експлоером.... 
Фильтр драйвер засадно для этого писать.......((((((((

Автор: 500mhz 6.4.2012, 09:53
значит надо идти другим путем, патч точку входа в процедуру в ws32 а не импорты и экспорты

Автор: bass 6.4.2012, 11:21
Пока желание идти до конца..... Должно же решиться.... Пробую скомпилить на вижуал студии но как то пока безуспешно... Еее вообще незнаю.... Скопмпилил длл при загрузке олька видает мессадж что точка входа хз. где... И не могу ей нати не одну функцию которую экспортировал smile  smile  smile 

Автор: 500mhz 6.4.2012, 11:41
5 минутные раздумья )))
хукаем send в своем процессе, точно также хукаеться и в чужом из дллки

Код

format PE
include 'win32ax.inc'



start:


    invoke LoadLibrary,"ws2_32.dll"
    mov [ws32],eax
    invoke GetProcAddress,eax,"send"
    mov [send_addr],eax

    mov eax,[ws32]
    add eax,[eax+0x3c]
    mov eax,[eax+0x50]
    invoke VirtualProtect,dword[ws32],eax,PAGE_READWRITE,esp

----------------------------------------перезаписываем начало функ send своим кодом для перехода на fake_send
    mov edi,[send_addr]
    mov esi,c1
    mov ecx,6
    repnz movsb
----------------------------------------
    stdcall dword[send_addr],0,0,0,0             вызываем как бы send а попадаем на fake_send
    invoke ExitProcess,0




c1:
    push dword fake_send
    ret




fake_send:
    invoke MessageBox,0,"Hello","Fake Send",0

----------------------------------  кусок начала функции send который мы перезаписали своим кодом
    mov edi,edi
    push ebp
    mov ebp,esp
    sub esp,10
----------------------------------
    mov eax,[send_addr]
    add eax,8
    jmp eax           а тут вызываем настоящий send


send_addr:
    dd    ?
ws32:
    dd    ?
.end start


Автор: bass 6.4.2012, 12:50
Иногда первые байты функции почему то не перезаписываються правда я пробовал копимемори и виртуалаллок.....    Спайсингом не хочу я считаю что это криво......

Автор: 500mhz 6.4.2012, 12:58
Цитата

Иногда первые байты функции почему то не перезаписываються

ну правильно, обычно секция кода имеет read only атрибут, для этого я и делаю VirtualProtect что бы можно было писать туда.

Автор: bass 6.4.2012, 13:12
Ой перепутал я тоже это делал но как то безуспешно...

Автор: 500mhz 6.4.2012, 13:28
Тут фигня вот в чем, мы инжектим дллку в процесс уже после его инициализации, процесс вполне могу получить адреса функ в ws32 и теперь ему совсем не нужны и иморты свои ни экспорты из ws32.
В таком случае сплайсинг наш друг ).

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