Конференция "Сети" » Как перехватить API функции (Connect, Bind) и изменить их парамет [D7, WinXP]
 
  • MALAN © (25.02.09 14:25) [0]
    Некий процесс в системе хочет соединиться с 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, а оригинальную отправлять программе перехватчику?
  • Anatoly Podgoretsky © (25.02.09 15:04) [1]
    > MALAN  (25.02.2009 14:25:00)  [0]

    Это называется файрвол.
    Говоришь не сложная задача, ну-ну.
  • Сергей М. © (25.02.09 15:41) [2]

    > MALAN ©   (25.02.09 14:25)  


    Клиент где находится, в корп. лок.сети или подключен непосредственно к сети провайдера ?
  • Rouse_ © (25.02.09 17:33) [3]
    Тут пример перехвата recv, wsarecv и wsarecvex через правку таблицы импорта, переделай на сплайсинг и на connect

    http://forum.sources.ru/index.php?showtopic=86903
  • MALAN © (25.02.09 18:20) [4]
    >Сергей М. ©   (25.02.09 15:41) [2]

    >Клиент где находится, в корп. лок.сети или подключен непосредственно к >сети провайдера ?

    всё находится на локальной машине, топология сети значения не имеет

    >Anatoly Podgoretsky ©   (25.02.09 15:04) [1]

    >Это называется файрвол.
    >Говоришь не сложная задача, ну-ну.

    Скорее уж прокси-сервер
  • Сергей М. © (25.02.09 19:55) [5]

    > топология сети значения не имеет
    >


    Да ты что ?
    А мужики-то и не знали ..

    Как же не имеет, если, например, есть возможность доступа к интересующему трафику на подконтрольном шлюзе или прокси-серверу сети ?
  • MALAN © (25.02.09 20:12) [6]
    >Сергей М. ©   (25.02.09 19:55) [5]

    меня интересует только трафик идущий от/к программам запущенным на локальной машине, если ещё точнее, то почта
  • Сергей М. © (25.02.09 20:20) [7]
    Вот я и спрашиваю - идет ли этот трафик непосредственно через интерфейс провайдера или на пути к интерфейсу провайдера в сети имеется подконтрольный тебе шлюз и/или прокси ?
  • MALAN © (25.02.09 20:35) [8]
    >Сергей М. ©   (25.02.09 20:20) [7]

    А какая собственно разница? Перехват-то должен происходить на сеансовом уровне модели OSI и на той же самой локальной машине, структура сети не должна влиять на работу программы... работа программы-перехватчика должна быть похожа на реализацию атаки "человек-посередине" (ну т.е. посередине будет не человек, а программа, но принцип вообщем-то тот же)
  • Сергей М. © (25.02.09 20:53) [9]

    > MALAN ©   (25.02.09 20:35) [8]


    > какая собственно разница?


    Ты действительно тупой или прикидываешься ?)

    Одно дело - совершенно штатным и легальным образом задействовать SMTP/POP3/IMAP-фильтр на хосте-шлюзе в своей ЛВС, мимо которого не пройдет ни один байт внешнего трафика, и совсем другое дело - заниматься ректальным внедрением всякого рода "шпионских" DLL во вс е подряд процессы, не имея при этом никакой гарантии успешности начатой кампании !

    И если тебе нужно просто подслушать трафик на лок.машине, то что-то куда-то внедрять нет никакой необходимости - есть готовая легальная проверенная WinPCap, она чудесно справляется со шпионскими делами
  • MALAN © (25.02.09 21:14) [10]
    Сергей М. ©   (25.02.09 20:53) [9]

    >Ты действительно тупой или прикидываешься ?)

    >Одно дело - совершенно штатным и легальным образом задействовать SMTP/>POP3/IMAP-фильтр на хосте-шлюзе в своей ЛВС

    >И если тебе нужно просто подслушать трафик на лок.машине, то что-то >куда-то внедрять нет никакой необходимости - есть готовая легальная >проверенная WinPCap, она чудесно справляется со шпионскими делами

    А я где-то написал что мне нужно просто "подслушать траффик"? Я же русским по белому пишу, нужно модифицировать информацию (заметьте, не пакеты, а саму информацию, в частности текст письма, добавлять заголовки) причём, прозрачно для почтовых программ, а для этого перехват лучше осуществлять на сеансовом уровне просто перенаправляя соединение, и программа эта должна находится не на шлюзе, а на локальной машине
  • Сергей М. © (26.02.09 08:31) [11]

    > не пакеты, а саму информацию


    Информацию эту несут как раз те самые пакеты.

    http://www.wasm.ru/article.php?article=netfilter
  • Сергей М. © (26.02.09 08:32) [12]

    > как должна выглядеть эта DLL


    Что значит "как" ?
    Обычно должна выглядеть - DLL она и есть DLL..
  • MALAN © (26.02.09 08:42) [13]
    >Сергей М. ©   (26.02.09 08:31) [11]

    >Информацию эту несут как раз те самые пакеты.

    Кто бы мог подумать:))

    >Что значит "как" ?
    >Обычно должна выглядеть - DLL она и есть DLL..

    Насколько я знаю обычная DLL состоит из набора вызываемых функций, и загрузочного кода, который исполняется автоматически при подключении DLL, вот меня и интересует что должен содержать этот исполняемый код
  • Сергей М. © (26.02.09 09:16) [14]

    > кода, который исполняется автоматически при подключении
    > что должен содержать этот исполняемый код


    Подготовить все необходимое для гарантированного получения управления при вызове впоследствии тех или иных требуемых API-функций, что же еще ?
  • Сергей М. © (26.02.09 09:18) [15]

    > что должен содержать этот исполняемый код


    Вот это самое все необходимое для подготовки он и должен содержать.
  • Anatoly Podgoretsky © (26.02.09 12:28) [16]
    > MALAN  (25.02.2009 18:20:04)  [4]

    При (http) прокси сервере ни о каком интернете и речи нет, и даже об локалке, все заканчивается прокси сервером, клиент никуда кроме этой машиные не подключается.
  • Сергей М. © (26.02.09 12:36) [17]

    > Anatoly Podgoretsky ©   (26.02.09 12:28) [16]


    Его почтовый трафик заботит, а не гипертекстовый..

    Причем так до сих пор и партизанит : непонятно как этот хост ходит в тырнет - то ли прямиком к провайдеру маршрут лежит, то ли через корпоративный прокси и/или шлюз ..
  • MALAN © (26.02.09 20:54) [18]
    Сергей М. ©   (26.02.09 12:36) [17]

    >Причем так до сих пор и партизанит : непонятно как этот хост ходит в >тырнет - то ли прямиком к провайдеру маршрут лежит, то ли через >корпоративный прокси и/или шлюз ..

    Ну хорошо, напрямую провайдеру... что дальше?:)
  • brother © (27.02.09 06:18) [19]
    > Ну хорошо, напрямую провайдеру... что дальше?:)

    пиши программу!
  • Сергей М. © (27.02.09 09:03) [20]

    > MALAN ©   (26.02.09 20:54) [18]


    > Ну хорошо, напрямую провайдеру


    Вот теперь понятно, что локальный перехват трафика остается единственным решением.

    Долго же ты ломался)


    > что дальше?


    Дальше либо надежное, но сложное в реализации решение с NDIS Miniport-драйвером  либо ненадежное и не менее сложное решение с драйвером, инжектирующим dll-перехватчик.
  • Anatoly Podgoretsky © (27.02.09 09:51) [21]

    > Его почтовый трафик заботит, а не гипертекстовый..

    Так, но вот что он написал в [4]

    > Скорее уж прокси-сервер

    На самом деле именно так и нужно, а файрволом надо запретить выход на XXX.XXX.XXX.XXX:25, только на zzz.zzz.zzz.zzz:25 при том обязательно с аутентификацией. Именно почти так у меня и сделано, мне просто не нужно изменение.
  • MALAN © (27.02.09 11:54) [22]
    Сергей М. ©   (27.02.09 09:03) [20]

    >Дальше либо надежное, но сложное в реализации решение с NDIS Miniport->драйвером  либо ненадежное и не менее сложное решение с драйвером, >инжектирующим dll-перехватчик.

    Гора родила мышь;)

    Anatoly Podgoretsky ©   (27.02.09 09:51) [21]
    >На самом деле именно так и нужно, а файрволом надо запретить выход на >XXX.XXX.XXX.XXX:25, только на zzz.zzz.zzz.zzz:25 при том обязательно с >аутентификацией. Именно почти так у меня и сделано, мне просто не >нужно изменение.

    Что то мне подсказывает что почтовые программы в этом случае необходимо будет перенастраивать.

    P.S.Если уж на то пошло то прокси-сервер это и есть фаерволл уровня приложений
  • MALAN © (27.02.09 11:54) [23]
    Удалено модератором
    Примечание: дубль
  • Сергей М. © (27.02.09 14:06) [24]

    > прокси-сервер это и есть фаерволл


    Прокси это прокси, а файрвол это файрвол.
    У них очень разные задачи.


    > Гора родила мышь


    А ты что хотел ?)
  • Palladin © (27.02.09 14:09) [25]

    > Если уж на то пошло то прокси-сервер это и есть фаерволл
    > уровня приложений

    Ага, а сыр - это сметана )
  • MALAN © (27.02.09 14:18) [26]
    Palladin ©   (27.02.09 14:09) [25]
    >> Если уж на то пошло то прокси-сервер это и есть фаерволл
    >> уровня приложений

    >Ага, а сыр - это сметана )

    А ты попробуй ввести в поиск "брандмауэр сетевого сеансового прикладного уровня", узнаешь много нового:)
  • Сергей М. © (27.02.09 14:51) [27]

    > MALAN ©   (27.02.09 14:18) [26]


    А не надо нам тут америки открывать)

    Да, по мере продвижения к вершине OSI-модели грани разничий в функциональности файрволов и прокси-сервисов становятся все более малоразличимы.

    Только в твоем случае тебя это уже никак не касается - интересующая тебя приблуда не имеет отношения к межсетевому взаимодействию.
  • Palladin © (27.02.09 15:25) [28]

    > MALAN ©   (27.02.09 14:18) [26]

    Я спорю что ли? )
    Сыр и сметана - оба продукта молочные. ) Однако ни кто же не утверждает, что сыр это по сути сметана, на уровне исходных материалов )

    Если два чего то растут из одного места - низя утверждать что одно есть, по сути, второе и наоборот.
  • MALAN © (27.02.09 15:34) [29]
    Сергей М. ©   (27.02.09 14:51) [27];

    Может тогда всё-таки поможешь?:)

    Нарыл библиотеку для перехвата, но вот как запустить одну из функций (вообщем-то самую главную, установка зука методом сплайсинга) не понял:
    function SetProcedureHook(ModuleHandle:HMODULE;ProcedureName:PChar;NewProcedureAddress:Po inter;   RestoreDATA:PFunctionRestoreData):Boolean;
    Что в параметрах писать? ProcedureName вроде как "Connect", а остальное?
  • MALAN © (27.02.09 15:37) [30]
    Palladin ©   (27.02.09 15:25) [28]

    >> MALAN ©   (27.02.09 14:18) [26]

    >Я спорю что ли? )
    >Сыр и сметана - оба продукта молочные. ) Однако ни кто же не >утверждает, что сыр это по сути сметана, на уровне исходных материалов )

    >Если два чего то растут из одного места - низя утверждать что одно есть, >по сути, второе и наоборот.

    Короче "медведь и панда"(c).... я тебя понял:)
  • Сергей М. © (27.02.09 15:55) [31]

    > а остальное?


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

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

    RestoreDATA - это, видимо, указатель на область данных в твоей DLL, куда при сплайсинге будет сохранен оригинальный фрагмент контекста перехватываемой тобой функции
  • Сергей М. © (27.02.09 16:02) [32]

    > MALAN


    При прочих равных условиях в твоем случае я бы предпочел не сплайсинг, а модификацию EAT/IAT.
  • MALAN © (27.02.09 22:31) [33]
    >Сергей М. ©   (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;

    но как узнать или присвоить ей указатель? А также как передать ей старую команду с параметрами, которые нужно проверить???
  • Сергей М. © (27.02.09 23:05) [34]

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


    GetModuleHandle()


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


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


    > OpenThread


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


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


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

    p.s.

    Рано тебе заниматься "перехватами" - ты азов не знаешь. Обычных дельфийских.
  • MALAN © (03.03.09 21:11) [35]
    ну 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'.
    Вообщем что я упускаю?
  • Сергей М. © (03.03.09 21:33) [36]

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


    Самую малость - наличие в Делфи встроенного отладчика
  • MALAN © (03.03.09 21:55) [37]
    Сергей М. ©   (03.03.09 21:33) [36]

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

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

    А можно поподробнее? Почему dll якобы внедряется в процесс, но загрузочный код библиотеки не исполняется?
  • Сергей М. © (03.03.09 21:58) [38]
    Ты программист или где ?)
    Что значит "якобы" ?
    Ты вообще в курсе про отладчик ?
  • Сергей М. © (03.03.09 22:07) [39]

    > MALAN


    Тоже мне - "рассуждалкин" на "высокие материи" нашелся)
    Сначала азы отладки Делфи-кода освой !
  • MALAN © (03.03.09 22:08) [40]
    >Ты программист или где ?)

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

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

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

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

    Видимо нет
  • Сергей М. © (03.03.09 22:26) [41]

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


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

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

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


    > Видимо нет


    И что ?

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

    А ты не припух ли, а ?
    Гнешь здесь про какой-то там "перехват", не зная и не владея обязательными элементарными общими знаниями и навыками ?
  • _bass (03.03.09 22:27) [42]
    MALAN, библиотекой для перехвата поделитесь плз. Тоже интересует данный вопрос
  • MALAN © (03.03.09 22:50) [43]
    Сергей М. ©   (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

    свою библиотеку не выкладываю ибо ещё не доделана, если вопросы будут пиши
  • Сергей М. © (03.03.09 23:16) [44]

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


    Т.е. это эксклюзивный пирог, испеченный сапожником ?)
    Или эксклюзивный сапог, который тачал пирожник ?)
  • MALAN © (03.03.09 23:44) [45]
    На безрыбье и лебедь раком:)
  • _bass (04.03.09 22:27) [46]
    А вот если, например, приложение вызывает bind/listen несколько раз (на разные порты - рандомные). Как параметры каждого из них изменить на определенный статистический порт?
    т.е. для каждой функции другой порт.
  • MALAN © (04.03.09 23:28) [47]
    ну вроде также, в функции-перехватчике пишешь дополнительное условие типа: if (name.sin_port>10000 and name.sin_port<20000) then name.sin_port:=111;
  • MALAN © (04.03.09 23:28) [48]
    ну вроде также, в функции-перехватчике пишешь дополнительное условие типа: if (name.sin_port>10000 and name.sin_port<20000) then name.sin_port:=111;
  • _bass (04.03.09 23:35) [49]
    Можно с вами как-то приватно пообщаться?
    Сори за оффтоп.
  • MALAN © (05.03.09 08:51) [50]
    _bass   (04.03.09 23:35) [49]
    ну по мылу: malan-x@yandex.ru
    или по аське: 306177482
  • имя (17.09.09 14:18) [51]
    Удалено модератором
 
Конференция "Сети" » Как перехватить API функции (Connect, Bind) и изменить их парамет [D7, WinXP]
Есть новые Нет новых   [134435   +34][b:0][p:0.002]