Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перехватить API функции (Connect, Bind) и изменить их парамет [D7, WinXP]


Страницы:   1 2 3

MALAN ©   (2009-02-25 14:25:00) 

Некий процесс в системе хочет соединиться с XXX.XXX.XXX.XXX:YYYYY (IP:PORT), а для этого вызывает команду Connect с IP адресом и номером порта. Необходимо чтобы программа перехватчик изменила параметры команды Connect так чтобы если YYYYY = 25, то соединение перенаправлялось на локальный порт который слушает программа перехватчик, а отттуда уже изменённые данные отправлялись бы куда надо.

Перерыл много инфы, и хотя задача вроде бы не сложная, но в силу своей тупости и малого опыта ничего конкретного сделать не смог.
Насколько я понял есть несколько вариантов (изменение  Winsock.dll, сплайсинг), наиболее вменяемый это внедрение специальной DLL во все создаваемые процессы ( http://www.rsdn.ru/article/baseserv/InjectDll.xml).
Но как должна выглядеть эта DLL, чтобы она могла модифицировать комманду Connect, а оригинальную отправлять программе перехватчику?


  (2009-09-17 14:18:00) [1]

Удалено модератором


MALAN   (2009-03-05 08:51:00) [2]

_bass   (04.03.09 23:35) [49]
ну по мылу: malan-x@yandex.ru
или по аське: 306177482


_bass   (2009-03-04 23:35:00) [3]

Можно с вами как-то приватно пообщаться?
Сори за оффтоп.


MALAN   (2009-03-04 23:28:00) [4]

ну вроде также, в функции-перехватчике пишешь дополнительное условие типа: if (name.sin_port>10000 and name.sin_port<20000) then name.sin_port:=111;


MALAN   (2009-03-04 23:28:00) [5]

ну вроде также, в функции-перехватчике пишешь дополнительное условие типа: if (name.sin_port>10000 and name.sin_port<20000) then name.sin_port:=111;


_bass   (2009-03-04 22:27:00) [6]

А вот если, например, приложение вызывает bind/listen несколько раз (на разные порты - рандомные). Как параметры каждого из них изменить на определенный статистический порт?
т.е. для каждой функции другой порт.


MALAN   (2009-03-03 23:44:00) [7]

На безрыбье и лебедь раком:)


Сергей М.   (2009-03-03 23:16:00) [8]


> MALAN ©   (03.03.09 22:50) [43]


Т.е. это эксклюзивный пирог, испеченный сапожником ?)
Или эксклюзивный сапог, который тачал пирожник ?)


MALAN   (2009-03-03 22:50:00) [9]

Сергей М. ©   (03.03.09 22:26) [41]

>Гнешь здесь про какой-то там "перехват", не зная и не владея >обязательными элементарными общими знаниями и навыками ?

Успокойся, разобрался я с этим перехватом уже, и т.н. эмпирический подход в моём случае быстрее, чем изучение твоих т.н. "азов" (всё-таки чтобы прибить полку архитектурный институт заканчивать не обязательно), щас речь о другом:)

_bass   (03.03.09 22:27) [42]

>MALAN, библиотекой для перехвата поделитесь плз. Тоже интересует >данный вопрос

я при создании своей библиотеки пользовался этой http://www.codenet.ru/progr/delphi/stat/apihook2.zip
а это статья где она описывается: http://www.codenet.ru/progr/delphi/stat/api-hook.php

свою библиотеку не выкладываю ибо ещё не доделана, если вопросы будут пиши


_bass   (2009-03-03 22:27:00) [10]

MALAN, библиотекой для перехвата поделитесь плз. Тоже интересует данный вопрос


Сергей М.   (2009-03-03 22:26:00) [11]


> не учили меня системному


А системному(а не эмпирическому) подходу к анализу результатов применения знаний тебя учили ?

Причем здесь вообще "системное программирование" ?

Ты какого вообще лешего не анализируешь результат выполнения функцииWriteProcessMemory ?


> Видимо нет


И что ?

Тебя в "Сетях" (а не в "Начинающих" !!) учить элементарнымосновам пользования встроенного дельфийского отладчика ?

А ты не припух ли, а ?
Гнешь здесь про какой-то там "перехват", не зная и не владея обязательными элементарнымиобщими знаниями и навыками ?


MALAN   (2009-03-03 22:08:00) [12]

>Ты программист или где ?)

Ну не учили меня системному программированию, не вешаться же теперь из-за этого.

>Что значит "якобы" ?

ЯКОБЫ частица
Употр. при обозначении мнимости, несоответствия действительности; соответствует по значению сл.: будто бы, как будто.

>Ты вообще в курсе про отладчик ?

Видимо нет


Сергей М.   (2009-03-03 22:07:00) [13]


> MALAN


Тоже мне - "рассуждалкин" на "высокие материи" нашелся)
Сначала азыотладки Делфи-кода освой !


Сергей М.   (2009-03-03 21:58:00) [14]

Ты программист или где ?)
Что значит "якобы" ?
Ты вообще в курсе про отладчик ?


MALAN   (2009-03-03 21:55:00) [15]

Сергей М. ©   (03.03.09 21:33) [36]

>> что я упускаю?

>Самую малость - наличие в Делфи встроенного отладчика

А можно поподробнее? Почему dll якобы внедряется в процесс, но загрузочный код библиотеки не исполняется?


Сергей М.   (2009-03-03 21:33:00) [16]


> что я упускаю?


Самую малость - наличие в Делфи встроенного отладчика


MALAN   (2009-03-03 21:11:00) [17]

ну DLL'ку вроде написал осталось внедрить в чужой процесс и тут о5 возникла проблема. Внедрение происходит при помощи функции:

function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean;
var
 pLL,pDLLPath:Pointer;
 hProcess,hThr:THandle;
 LibPathLen,_WR,ThrID:DWORD;
begin
 Result:=False;
 LibPathLen:=Length(string(LibName));
 hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
 if hProcess=0 then exit;
 pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
 if DWORD(pDLLPath)=0 then exit;
 pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA');
 WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
 hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);
 if hThr=0 then exit;
 Result:=CloseHandle(hProcess);
end;


При попытке внедрения в чужой процесс функция работает без ошибок, но эффекта нет. Функция работает как надо только если внедряет библиотеку в свой собственный процесс.
Поясню: допустим есть два процесса pr1.exe, pr2.exe и библиотека lib1.dll которая при внедрении должна выдать сообщение, типа, 'Hello World'.
если процесс pr1.exe попытается внедрить lib1.dll в pr2.exe, то ничего не происходит, если же он пытается внедрить его в самого себя, то библиотека успешно грузится и выдаёт сообщение 'Hello World'.
Вообщем что я упускаю?


Сергей М.   (2009-02-27 23:05:00) [18]


> как получить-то хендл этого модуля?


GetModuleHandle()


> какой командой?


Никакой.
В Делфи нет "команд" - есть операторы.


> OpenThread


Эта т.н. "команда" не имеет ни малейшего отношения к хэндлу модуля.


> dwThreadID - это тоже самое что и ProcessID?


Нет, это две совершенно разные разницы.

p.s.

Рано тебе заниматься "перехватами" - ты азовне знаешь. Обычных дельфийских.


MALAN   (2009-02-27 22:31:00) [19]

>Сергей М. ©   (27.02.09 15:55) [31]

>ModuleHandle - хэндл модуля ws2_32.dll в АП процесса-жертвы.

ясно, но как получить-то хендл этого модуля? какой командой?
OpenThread(dwDesiredAccess: DWORD;bInheritHandle: BOOL;
     dwThreadID: DWORD)? Если да, то что прописывать в параметрах?
dwDesiredAccess - желаемый уровень доступа к процессу? Какой необходимо для внедрения библиотеки и перехвата API?
bInheritHandle - я так понял это опция наследования... она имеет принципиальное значение?
dwThreadID - это тоже самое что и ProcessID?

>NewProcedureAddress - адрес твоей собственной функции, куда будет >передано управление в рез-те вызова жертвой ф-ции Connect

Вот это мне вообще непонятно, допустим где-то у меня написана функция-перехватчик, например:
Procedure NewConnect(IP,Port:Integer);
var
...
begin
end;

но как узнать или присвоить ей указатель? А также как передать ей старую команду с параметрами, которые нужно проверить???


Сергей М.   (2009-02-27 16:02:00) [20]


> MALAN


При прочих равных условиях в твоемслучае я бы предпочел не сплайсинг, а модификацию EAT/IAT.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо