![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить API функции (Connect, Bind) и изменить их парамет [D7, WinXP]
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.