Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват и модификация исходящих tcp пакетов, возможно ли ? ("на лету") 
:(
    Опции темы
lifer
Дата 30.5.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 17.1.2004
Где: Kiev, Ukraine

Репутация: нет
Всего: нет



Нужно в реальном времени изменять некоторые исходящие пакеты, передающиеся приложением.

Это выполнимо на Delphi ?
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 31.5.2005, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



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


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
lifer
Дата 31.5.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 17.1.2004
Где: Kiev, Ukraine

Репутация: нет
Всего: нет



Я так понял что мне надо перехватывать ф-цию send. Я прав?

Это сообщение отредактировал(а) lifer - 31.5.2005, 12:28
PM MAIL WWW ICQ   Вверх
RA
Дата 31.5.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Сразу дам пример перехвата входящих и исходящих пакетов.

необходим юнит madCodeHook из библы madCollection.
http://madshi.net/madCollection.exe



Внедрение hook.dll в нужный тебе процесс
Код


procedure TForm1.Button1Click(Sender: TObject);
var
  SInfo: TStartupInfo;
  PInfo: TProcessInformation;
begin
      ZeroMemory(@SInfo, SizeOf(TStartupInfo));
      ZeroMemory(@PInfo, SizeOf(TProcessInformation));
      SInfo.dwFlags := STARTF_USESHOWWINDOW;
      SInfo.wShowWindow := SW_SHOW;
      CreateProcess(PChar( Edit1.text ), nil, nil, nil, False, 0, nil, nil, SInfo, PInfo);
      Sleep(3000);
      // Лутше было бы использовать InjectLibrarySession но так как это пример перехвата а не внедрения то так ....
      InjectLibrary(PInfo.hProcess, IncludeTrailingPathDelimiter( ExtractFilePath(Application.ExeName) ) + 'hook.dll' );
end;




А вот так выглядит Hook.dll .

Код


library Hook;

uses
  Windows,
  Winsock,
  SysUtils,
  madCodeHook;

var
  sendNextHook: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  recvNextHook: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

function recvHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
  Result := recvNextHook(s, Buf, len, flags);
end;

function sendHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
  Result := sendNextHook(s, Buf, len, flags);
end;

procedure EntryPoint(Ac: dword); stdcall;
begin
  if Ac = DLL_PROCESS_ATTACH then
  begin
      HookCode(@send, @sendHookProc, @sendNextHook);
      HookCode(@recv, @recvHookProc, @recvNextHook);
  end;
end;

begin
  DLLProc := @EntryPoint;
  EntryPoint(DLL_PROCESS_ATTACH);
end.
 





ЗЫ: надеюсь принцип ясен.

PM   Вверх
Guest
Дата 2.6.2005, 16:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Разобрался с madCollection...
Несколько вопросов:

1.
Код

CreateProcess(PChar( Edit1.text ), nil, nil, nil, False, 0, nil, nil, SInfo, PInfo);
Зачем запускать процесс?
У меня ведь будет уже запущенное приложение из которого надо будет перехватывать пакеты.

2.
Код

function sendHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
  Result := sendNextHook(s, Buf, len, flags);
end; 



Я так понял что при вызове ф-ции send будет выполняться сначала ф-ция sendHookProc. А в переменных s; var ; len, flags будет нужный мне пакет?

  Вверх
RA
Дата 2.6.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Цитата(Guest @ 2.6.2005, 16:57)
Зачем запускать процесс?


Ну запуская процесс мы получаем TProcessInformation каторый потом используем для того что бы внедрить в чужой процесс свою dll. (просто так проще).

Ну если процесс уже запущен то внедряйся в запущенный процесс...
{Пример дать ?}



Цитата(Guest @ 2.6.2005, 16:57)
Я так понял что при вызове ф-ции send будет выполняться сначала ф-ция sendHookProc. А в переменных s; var ; len, flags будет нужный мне пакет?


Именно так.

Это сообщение отредактировал(а) RAdmin - 2.6.2005, 17:48
PM   Вверх
haword
Дата 3.6.2005, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.10.2004

Репутация: нет
Всего: 3



RAdmin
если не трудно тай примерчик внедрения smile или вообщем инфу где насчет этого можно почитать? smile
PM MAIL   Вверх
RA
Дата 3.6.2005, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Цитата(haword @ 3.6.2005, 06:46)
если не трудно тай примерчик внедрения


Не трудно, только ты создай про это отдельную тему в разделе winapi или общие вопросы.
правила тут такие: один вопрос один топик. smile
PM   Вверх
lifer
Дата 5.6.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 17.1.2004
Где: Kiev, Ukraine

Репутация: нет
Всего: нет



Цитата
Ну запуская процесс мы получаем TProcessInformation каторый потом используем для того что бы внедрить в чужой процесс свою dll. (просто так проще).


Это понятно, только вот приложение при запуске через CreateProcess не хочет работать так, как нужно... так что лучше запускать его вручную...

Цитата
The function "InjectLibrary" is able to inject your DLL into any already running 32bit process. You can specify one specific target process or any of the special flags.


Можете привести небольшой примерчик по внедрению в конкретный процесс? а то в хелпе по MadCodeHook рассматривается внедрение во все работающие проуессы.

Это сообщение отредактировал(а) lifer - 5.6.2005, 12:30
PM MAIL WWW ICQ   Вверх
RA
Дата 5.6.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Код

function GetProcessID (FileName: string) : DWORD;
var
 wnd1, wnd2 : THandle;
 Pe32 : TProcessEntry32;
 Me32 : TModuleEntry32;
  tmp  : boolean;
begin
  tmp := false;
 FileName := AnsiUpperCase(FileName);
 wnd1 := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
 Pe32.dwSize := SizeOf(pe32);
 Me32.dwSize := SizeOf(me32);
 if Process32First(wnd1, pe32) then
 repeat
   tmp:= FileName = AnsiUpperCase(pe32.szExeFile);
   if not tmp then
     if ExtractFileName(FileName) = AnsiUpperCase(ExtractFileName(pe32.szExeFile)) then
     begin
       wnd2 := CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, pe32.th32ProcessID);
       if Module32First(wnd2, me32) then
       repeat
         if (FileName = AnsiUpperCase(me32.szExePath)) then
         begin
           tmp := true;
           Break;
         end;
       until not Module32Next(wnd2, me32);
       CloseHandle(wnd2);
     end;
   if tmp then
   begin
     Result :=  pe32.th32ProcessID;
   end;
 until not Process32Next(wnd1, pe32);
 CloseHandle (wnd1);
end;
InjectLibrary(GetProcessID('c:\myfile.exe'),'c:\myDll.dll'   );


Вроде так должно работать, но не проверял.

Это сообщение отредактировал(а) RAdmin - 5.6.2005, 14:04
PM   Вверх
lifer
Дата 5.6.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 17.1.2004
Где: Kiev, Ukraine

Репутация: нет
Всего: нет



Код

Result := false;

[Error] Unit1.pas(34): Incompatible types: 'Cardinal' and 'Boolean'

тут что-то не так...

Это сообщение отредактировал(а) lifer - 5.6.2005, 13:57
PM MAIL WWW ICQ   Вверх
RA
Дата 5.6.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Подредактировал, но всёравно не проверял.
PM   Вверх
Guest
Дата 6.6.2005, 16:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я уже сделал вот так:

Код

Function GetProcessId(exename:string):integer;
var
 hSnap:THandle; 
 pe:TProcessEntry32; 
 procid:integer;
 procexe:string; 
begin 
 pe.dwSize:=SizeOf(pe);
 hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
 If Process32First(hSnap,pe) then begin
   While Process32Next(hSnap,pe) do begin 
   procexe:=pe.szExeFile;procid:=pe.th32processid;
   if uppercase(procexe)<>uppercase(exename) then continue;
   result:=procid; 
   closehandle(hSnap);
   exit;
   end;
 end;
 result:=0;
 closehandle(hSnap);
end;


Теперь буду разбираться с dll smile
  Вверх
RA
Дата 6.6.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Цитата(Guest @ 6.6.2005, 16:01)
Я уже сделал вот так:


Окинув это своим взглядом я пришел к выводу, что такая модификация в XP приведёт к получению ID рандомного процесса имеющего сходное имя файла но другую директорию запуска.
PM   Вверх
lifer
Дата 6.6.2005, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 17.1.2004
Где: Kiev, Ukraine

Репутация: нет
Всего: нет



Код

library hook;

uses
  Windows,
  Messages,
  Winsock,
  SysUtils,
  madCodeHook;

var
  sendNextHook: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
  recvNextHook: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

function recvHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
  Result := -1;
end;

function sendHookProc(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
   Result := -1;
end;



begin
  HookCode(@send, @sendHookProc, @sendNextHook);
  HookCode(@recv, @recvHookProc, @recvNextHook);
end.


Захотел протестировать dll, по идее Result := -1; должен блокировать передачу данных. Я правильно понял?

Вот код инжекта в исполняемом файле:
Код

InjectLibrary(GetProcessID('mirc.exe'),IncludeTrailingPathDelimiter( ExtractFilePath(Application.ExeName) ) + 'hook.dll'   );


Такая конструкция у меня не работает smile Причем ф-ция GetProcessID определяет ID нормально). hook.dll в каталоге тоже присутствует. Не подскажете в чем может быть проблема?

Цитата
Окинув это своим взглядом я пришел к выводу, что такая модификация в XP приведёт к получению ID рандомного процесса имеющего сходное имя файла но другую директорию запуска.


У меня windows 2000 smile Но тема не об этом. Эту функцию я доделаю, сейчас же у меня нету двух процессов с одинаковыми именами.

Это сообщение отредактировал(а) lifer - 6.6.2005, 17:56
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.