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


Автор: ASGDeveloper 24.7.2006, 08:00
Кто знаком с этой статьей:
http://www.rsdn.ru/article/delphi/kmdelphi.xml
и пытался сделать subj? 

Автор: bazzzman 24.7.2006, 08:05
Наверное, всю интересующую тебя информацию найдешь в комментариях к статье:
http://www.rsdn.ru/forum/?mid=876459 

Автор: ASGDeveloper 24.7.2006, 09:40
Цитата(bazzzman @  24.7.2006,  08:05 Найти цитируемый пост)
Наверное, всю интересующую тебя информацию найдешь в комментариях к статье:

Видел. И даже пытался списать с автором статью.
Плюс пытаюсь разобраться с DDDK. 

Автор: Alexeis 24.7.2006, 09:57
Цитата(ASGDeveloper @  24.7.2006,  09:40 Найти цитируемый пост)
Видел. И даже пытался списать с автором статью.Плюс пытаюсь разобраться с DDDK. 

А в чем собственно вопрос? 

Автор: ASGDeveloper 24.7.2006, 10:49
Цитата(alexeis1 @  24.7.2006,  09:57 Найти цитируемый пост)
А в чем собственно вопрос?

Не знаю как ставить хуки на функции.
В какую сторону рыть - тоже непонятно. 

Автор: drkot 24.7.2006, 11:17
бррр. может я чего не понимаю но какие хуки ты (ASGDeveloper) собираешся ставить?
и собственно драйвер чего пишеш.
имхо надо сначала с задачами определится, а то непонятно о чем разговор. 

Автор: Alexeis 24.7.2006, 12:19
Цитата(ASGDeveloper @  24.7.2006,  10:49 Найти цитируемый пост)
Не знаю как ставить хуки на функции.

Для установки хуков, драйвер не нужен, достаточно dll.
Драйвер обычно пишут для прямого обращения к портам различных устройств. 

Автор: BUGOR 24.7.2006, 12:30
Цитата

Для установки хуков, драйвер не нужен, достаточно dll.


А для установки хука на NativeAPI ядра? Куда ж тут без драйвера?
 

Автор: ASGDeveloper 24.7.2006, 13:01
Цитата(alexeis1 @  24.7.2006,  12:19 Найти цитируемый пост)
Для установки хуков, драйвер не нужен, достаточно dll.

Да, dll injectiing пробовал.
Теперь конкретно задача: перехват, проверка и модификация (если надо) POP3-трафика 
Метод внедрения не катит. Ставил хуки и на WSARecv и на recv, В обоих вариантах на последних версиях бата выпадает ошибка. Посмотрел список загруженных батом модулей - ни wsock32.dll,  ни ws2_32.dll нету  smile  

Автор: BUGOR 24.7.2006, 13:10
ASGDeveloper, бат загружает эти модули после того, как уже непосредственно начинает соединяться с сервером, до этого их там нет. Что касается апи, то бат передаёт с помощью send, а принимает с помощью WSARecv. Ошибка скорее всего где-то в твоей длл.  

Автор: dumb 24.7.2006, 13:20
Цитата(ASGDeveloper @  24.7.2006,  13:01 Найти цитируемый пост)
Посмотрел список загруженных батом модулей - ни wsock32.dll,  ни ws2_32.dll нету

плохо смотрел. wsock32.dll, ws2_32.dll, ws2help.dll, mswsock.dll - все там.

Цитата(ASGDeveloper @  24.7.2006,  13:01 Найти цитируемый пост)
Метод внедрения не катит. Ставил хуки и на WSARecv и на recv, В обоих вариантах на последних версиях бата выпадает ошибка.

плохо ставил... smile 

Автор: ASGDeveloper 24.7.2006, 13:33
Цитата(dumb @  24.7.2006,  13:20 Найти цитируемый пост)
плохо смотрел. wsock32.dll, ws2_32.dll, ws2help.dll, mswsock.dll - все там.

Версия бата? На САМОЙ последней нету.

Цитата(dumb @  24.7.2006,  13:20 Найти цитируемый пост)
плохо ставил...   

Пробовал и madCodeHook и AdvAPIHook.

Цитата(BUGOR @  24.7.2006,  13:10 Найти цитируемый пост)
Ошибка скорее всего где-то в твоей длл.  

Как же тогда хук ставить? Отлавливать LoadLibrary и только затем грузить? smile  

Автор: BUGOR 24.7.2006, 13:39
Цитата

Версия бата? На САМОЙ последней нету.


Их в не на самой последней нет, я же говорю они при соединеиии грузятся.

Цитата

Как же тогда хук ставить? Отлавливать LoadLibrary и только затем грузить? 


Да, как вариант сначала перехватывай LoadLibarary и смотри, что передаётся в его параметр, если это ws2_32.dll, то после выполнения LoadLibrary снимай с неёё хук и ставь хуки на send и WSARecv в ws2_32.dll, остальные сокетные библиотеки все ссылаются на функции из ws2_32.dll, их трогать незачем.
 

Автор: dumb 24.7.2006, 13:43
Цитата(ASGDeveloper @  24.7.2006,  13:33 Найти цитируемый пост)
Версия бата? На САМОЙ последней нету.

3.62. значит сделали подгрузку, что, в общем, правильно - прога жирная, и отправка/получение почты занимает малую часть времени работы в ней.

Цитата(ASGDeveloper @  24.7.2006,  13:33 Найти цитируемый пост)
Как же тогда хук ставить? Отлавливать LoadLibrary и только затем грузить?

именно. хукай LoadLibrary и после подгрузки расставляй хуки по функциям. 

Автор: bems 24.7.2006, 14:44
Цитата(ASGDeveloper @  24.7.2006,  13:33 Найти цитируемый пост)
Как же тогда хук ставить? Отлавливать LoadLibrary и только затем грузить?
madCHook это уже делает. Если библиотека не загружено, и ты ставишь хук на функцию, она захучит ее при загрузке библиотеки. Кроме того, если бы хука не было, то счего это проге крашиться? Внедряемый код (callback) у тебя кривой
 

Автор: drkot 24.7.2006, 15:22
Вобще, если касаться перехвата трафика, то написаный драйвер ставится в цепочку NDIS  и весь трафик через него идет. 
А чтоб не мучится с драйверами можно и winpcap использовать.

PS: чето я непойму откуда у народа такая любовь к хукам на сокеты. 
http://www.wasm.ru/article.php?article=netfilter 

Автор: ASGDeveloper 24.7.2006, 17:06
Вот код перехватчика. Бага в том, что данные не сразу попадают в буфер. Не знаете в чем проблема?

Код

library injmod;

uses
  WinSock2,
  WinDows,
  madCodeHook;

var
  WSARecvNextHook: function(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD;
    lpOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;

function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar; assembler;
asm
        PUSH    EDI
        PUSH    ESI
        PUSH    EBX
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EBX,ECX
        XOR     AL,AL
        TEST    ECX,ECX
        JZ      @@1
        REPNE   SCASB
        JNE     @@1
        INC     ECX
@@1:    SUB     EBX,ECX
        MOV     EDI,ESI
        MOV     ESI,EDX
        MOV     EDX,EDI
        MOV     ECX,EBX
        SHR     ECX,2
        REP     MOVSD
        MOV     ECX,EBX
        AND     ECX,3
        REP     MOVSB
        STOSB
        MOV     EAX,EDX
        POP     EBX
        POP     ESI
        POP     EDI
end;

function StrPCopy(Dest: PChar; const Source: string): PChar;
begin
  Result := StrLCopy(Dest, PChar(Source), Length(Source));
end;

function AnsiLowerCase(const S: string): string;
var
  Len: Integer;
begin
  Len := Length(S);
  SetString(Result, PChar(S), Len);
  if Len > 0 then CharLowerBuff(Pointer(Result), Len);
end;

function WSARecvHookProc(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD; var lpNumberOfBytesRecvd: DWORD; var lpFlags: DWORD;
  lpOverlapped: LPWSAOVERLAPPED; lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE): Integer; stdcall;
var
  str: string;
begin
  Result := WSARecvNextHook(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
  str := PChar(lpBuffers.buf);

  if Pos('subject: ', AnsiLowerCase(str)) > 0 then
  begin
    //str := 'X-Application: Test' + #13#10 + str;

    StrPCopy(lpBuffers.buf, str);
    lpBuffers.len := Length(str);
     lpNumberOfBytesRecvd := Length(str);
  end;
end;

procedure EntryPoint(Ac: dword); stdcall;
begin
  if Ac = DLL_PROCESS_ATTACH then
  begin
    HookAPI('ws2_32.dll', 'WSARecv', @WSARecvHookProc, @WSARecvNextHook);
  end;
end;

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

 

Автор: dumb 24.7.2006, 17:42
гы... smile почитай http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsarecv_2.asp.

посмотри что возвращает WSARecv - WSA_IO_PENDING? smile
тут одним хуком не отделаешься. в данном случае WSARecv только инициирует прием, непосредственно получение данных сопровождается либо вызовом lpCompletionRoutine(если она не NULL при вызове), либо "выставлением" эвента(lpOverlapped.hEvent).
похукать lpCompletionRoutine не проблема. а вот если получение ожидается на эвенте, тогда сложнее. никаких "простых" решений в голову не приходит... 

Автор: ASGDeveloper 25.7.2006, 09:04
Цитата(dumb @  24.7.2006,  17:42 Найти цитируемый пост)
никаких "простых" решений в голову не приходит... 

Угу. Кроме драйвера.  smile 

Хм, какие еще будут предложения? Желательно для дельфы или борландовского билдера. 

Автор: drkot 25.7.2006, 10:12
Насколько я понимаю в нт системах можно написать сервис и установить его как драйвер без хитрых манипуляций описаных на МАСМе.
И перехватывать думаю надо не вызовы функций, а непосредственно поток пакетов в стеке протоколоа TCP\IP. 
Цитата(ASGDeveloper @  24.7.2006,  13:01 Найти цитируемый пост)
 перехват, проверка и модификация (если надо) POP3-трафика

ето как раз та задача которая решается NDIS фильтрами. 

Автор: ASGDeveloper 25.7.2006, 10:47
Цитата(drkot @  25.7.2006,  10:12 Найти цитируемый пост)
ето как раз та задача которая решается NDIS фильтрами.

а примерчик не знаешь где можно взять?

ЗЫ ВинПКап не подходит в виду того, что автор хочет его платным сделать  smile (мы с ним списывались) 

Автор: drkot 25.7.2006, 11:21
Цитата(ASGDeveloper @  25.7.2006,  10:47 Найти цитируемый пост)
ЗЫ ВинПКап не подходит в виду того, что автор хочет его платным сделать

таки исходники есть. В любом случае платным он станет с какойто конкретной версии, а все предудущие должны распространятся GNU, как и было.

http://www.wasm.ru/article.php?article=netfilter
http://www.wasm.ru/comment.php?artcode=netfilter
Встречал статью по реализации фильтра на си тока ссылочку не помню.
примеров сервисов на форуме полно. 

Автор: ASGDeveloper 25.7.2006, 11:24
Цитата(drkot @  25.7.2006,  11:21 Найти цитируемый пост)
таки исходники есть.

хм, не уточнишь где?


Цитата(drkot @  25.7.2006,  11:21 Найти цитируемый пост)
должны распространятся GNU

К сожалению GNU/GPL меня не устраивает.


Цитата(drkot @  25.7.2006,  11:21 Найти цитируемый пост)
примеров сервисов на форуме полно.

На каком форуме? Васмовском или этом? 

Автор: drkot 25.7.2006, 12:59
Цитата(ASGDeveloper @  25.7.2006,  11:24 Найти цитируемый пост)
хм, не уточнишь где?

http://www.winpcap.org/archive/

Цитата(ASGDeveloper @  25.7.2006,  11:24 Найти цитируемый пост)
К сожалению GNU/GPL меня не устраивает.

жал

Цитата(ASGDeveloper @  25.7.2006,  11:24 Найти цитируемый пост)
На каком форуме?

на этом 

Автор: bems 25.7.2006, 17:12
Цитата(dumb @  24.7.2006,  17:42 Найти цитируемый пост)
похукать lpCompletionRoutine не проблема. а вот если получение ожидается на эвенте, тогда сложнее. никаких "простых" решений в голову не приходит...

lpCompletionRoutine можно и не хукать. А в хуке на WSARecv использовать свою lpCompletionRoutine, в ней делать обработку и вызывать переданную вызывающим кодом. 

И с событием поступать аналогично. При вызове использовать свое, отлавливать его и манипулировать с тем, которого ожидает вызывающий код 

Автор: dumb 25.7.2006, 17:34
тупим-с... smile  

Автор: ASGDeveloper 25.7.2006, 17:47
Цитата(drkot @  25.7.2006,  12:59 Найти цитируемый пост)
http://www.winpcap.org/archive/

Дык WinPCap не пойдет. Или можно по-другому?  smile 


Цитата(dumb @  25.7.2006,  17:34 Найти цитируемый пост)
тупим-с... smile   

Это ты о чем? 

Автор: dumb 25.7.2006, 17:52
Цитата(ASGDeveloper @  25.7.2006,  17:47 Найти цитируемый пост)
Это ты о чем? 

это я о том, что решение, лежащее на поверхности(которое указал bems), мне в голову не пришло.  smile smile 

Автор: bems 25.7.2006, 18:02
Цитата(dumb @  25.7.2006,  17:52 Найти цитируемый пост)
решение, лежащее на поверхности
это оно в принципе на поверхности. Конкретная реализация будет не слишком простой, если учитывать возможное количество одновременных вызовов WSARecv из разный потоков/прцессов. Мой вариант этого кода уже почти всегда корректно работает, но не дам, тк автор темы мне конкурент smile Уж извини
 

Автор: ASGDeveloper 25.7.2006, 18:05
Цитата(bems @  25.7.2006,  18:02 Найти цитируемый пост)
тк автор темы мне конкурент smile 

Да ладно тебе! Поделись! smile
Чего у тебя в подписи? Мы за свободный рынок!  smile  

Автор: bems 25.7.2006, 18:11
я могу сходу назвать 10 отличий того, что у меня в подписи и того о чем ты просишь. Но это будет оффтоп. 

Просто "нет". 

Автор: ASGDeveloper 25.7.2006, 18:16
Цитата(bems @  25.7.2006,  18:11 Найти цитируемый пост)
Просто "нет". 

Ну почему? Да и какие мы конкуренты? Софтинка "заказная". Если хочешь могу поделиться.  smile 


M
Girder
А может через РМ?
PS: Хватит оффтопить!
  

Автор: drkot 25.7.2006, 18:18
Цитата(ASGDeveloper @  25.7.2006,  17:47 Найти цитируемый пост)
Дык WinPCap не пойдет. Или можно по-другому?

береш исходник смотриш что к чему и по образу и подобию ваяеш.
чем не подходит? 
сам же ссылочку просил. 

Автор: bems 25.7.2006, 18:19
ASGDeveloper, на данный момент я не пишу Open Source. Когда начну, сообщу. А если я тебе туда накидаю багов, которые проявляются только в редких случаях, но найти которые невозможно? Короче я призываю тебя кончать флейм - мы идем по кругу.
 

Автор: ASGDeveloper 25.7.2006, 22:26
И так. Просмотрев еще раз топик я выделил три метода решения проблемы.

1) Перехват функций WinSock.
2) Написание NDIS-фильтра
3) Создание драйвера

1) С первым частично разобрались, но вдруг bems заявляет, что в принципе такой вариант может начать глючить при какой-то ситуации.
Кроме того этот вариант привязан к фиксированному списку почтовиков.
2) Второй вариант весьма перспективен, но у него есть один важный минус - для его реализации необходим MS Dev Studio + DDK. А это не есть гуд, так как самый простой способ получить и то и другое - это подписка на MSDN. Стоимость подписки - ~3000$. no comments...
3) Третий вариант перекликается с первым, но благодаря этому топику: http://forum.vingrad.ru/index.php?showtopic=70952 некоторые вопросы пропадают и этот вариант становится наиболее перспективным.

Или я что-то не доглядел? 

Автор: bems 26.7.2006, 07:56
Цитата(ASGDeveloper @  25.7.2006,  22:26 Найти цитируемый пост)
но вдруг bems заявляет, что в принципе такой вариант может начать глючить при какой-то ситуации
Первый в твоей жизни драйвер будет глючить в значительно большем числе ситуаций. А относительно "такого" варианта: просто нужно сделать это тред-сейф и для разных процессов. Кроме того очень хорошо задумываться о правах доступа к всем своим/чужим объектам ядра. И вообще - я не заявляю, я говорю что лично у меня получилось не сразу. Может оказаться, что ты лучше.
Цитата(ASGDeveloper @  25.7.2006,  22:26 Найти цитируемый пост)
Кроме того этот вариант привязан к фиксированному списку почтовиков.
Нет, он привязан к четырем апишкам. Но вариантов вызова много, поэтому если остановишся на этом, то при написании кода забудь о там как что делают конкретные почтовики и работай по описанию функций. 

Есть разные там экзотические случаи - например вызывает функцию, передавая ей эвент один процесс, а ожидает его другой (первый к тому времени может уже и завершиться). Первый понастоящему трудный баг во всем этом перехвате я поймал на такой "архитектуре". (Слава Богу это писалось на заказ и не имело широкого распространения) Получилось так, что когда завершается процесс, вызывающий функцию, то исчезают все выделенные мной для этого вызова данные, в том числе и хэндл эвента, которого ждет другой процесс. То есть или у него завершиться таймаут, или (если ждет INFINITE милисекунд) получаем зависшую прогу (не мою!!).

Есть и просто некорректное поведение вызывающего кода.

и об этом всем нужно подумать. Тогда глюков не будет. Ну а потом уже пробывать на почтовиках. (Популярные вроде вышеписаной фигни не творят). Парочку глючных но полурабочих прог, работающих с сокетами сам нацарапай, посмотри как твой перехват - не усугубляет ли.


А если дров ты раньше не писал, то там среда еще менее дружелюбная, чем то, что описал я. Но в конце концов тебе решать 

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