Содержание материала

С чего все начиналось:

 С начала. Мне нужно было написать перехватчик вызовов WinSock. Дабы любая программа могла работать через SOCKS5-проксик. Я посчитал, что перехват вызовов DLL'ки проще, чем судорожные попытки написать драйвер (да и сейчас так считаю). Енота, правда, ехидно улыбалась и говорила "ну-ну", но я-таки справился. SOCKS сниффер еще пишу, но в принципах перехвата уже разобрался :-) [Енота: разобраться-то он действительно разобрался, а соксифиера нет до сих пор...]

 Как все будет:

 

Я предпочитаю не писать сухие статьи с кучей теории. Поскольку я люблю читать работающий исходный код, то и здесь будет только исходный код. Все пояснения я буду вставлять прямо в исходник - в виде комментариев. Впрочем, не надейтесь, что вам будет достаточно выдрать отсюда исходник, и он скомпилится. :-) Это не потому, что я специально что-то скрыл, а потому, что я вырезал кучу вспомогательных процедур, которые каждый может написать сам. Если вы, все же, паталогически ленивы - скачайте архив с полными рабочими исходниками. Оттуда точно заработает.

 

Исходники:

Наконец-то... начнем.

 

Code:

procedure DoDebugLoop;

{ собственно, это главная процедура перехватчика.

большую часть времени он крутится именно в ней }

var

Event: TDebugEvent;

{ стандартная Win32 структура. для интересующихся:}

ЕDebugEvent = record

   dwDebugEventCode: DWORD; // тип пришедшего события

   dwProcessId: DWORD;   // Id прерванного процесса

   dwThreadId: DWORD; // Id прерванного потока

   case Integer of

     0: (Exception: TExceptionDebugInfo);

     1: (CreateThread: TCreateThreadDebugInfo);

     2: (CreateProcessInfo: TCreateProcessDebugInfo);

     3: (ExitThread: TExitThreadDebugInfo);

     4: (ExitProcess: TExitThreadDebugInfo);

     5: (LoadDll: TLoadDLLDebugInfo);

     6: (UnloadDll: TUnloadDLLDebugInfo);

     7: (DebugString: TOutputDebugStringInfo);

     8: (RipInfo: TRIPInfo);

     // эти части смотрите сами - не могу же я все разжевывать! :-)

end;

 

следует добавить, что Microsoft - ребята странные. Функция GetThreadContext, при помощи которой реализуется пошаговая отладка и просмотр регистров, требует на входе хэндл процесса. а нам дают только его Id. после безуспешных поисков функции типа ConvertThreadIdToHandle [Енота: мечтатель, однако...] я решил, что придется заводить список запущенных потоков. в событии CREATE_THREAD_DEBUG_EVENT нам дают-таки хэндл. придется запоминать все созданные потоки (не забывая их забывать ( сорри :-) в EXIT_THREAD_DEBUG_EVENT). позже Sleepyhead сказал, что я все придумал очень правильно (ай да Кэтмар! ай да сукин сын! простите, классика :-) - так люди и делают. ну он большой, ему виднее :-) }

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить