Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2016, 09:29   #1
loveln
 
Регистрация: 20.04.2016
Сообщений: 5
По умолчанию Добавить функцию фильтрации в код dll

Код:
using EasyHook;
using Sniffer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace WinSockSpy
{
    public class Main : EasyHook.IEntryPoint
    {
        public Sniffer.InjectorInterface Interface;
        public LocalHook RecvHook;
        public LocalHook SendHook;
        public LocalHook WSASendHook;
        public Stack<Message> Queue = new Stack<Message>();
 
        public Main(RemoteHooking.IContext InContext, String InChannelName)
        {
            Interface = RemoteHooking.IpcConnectClient<Sniffer.InjectorInterface>(InChannelName);
        }
 
        public void Run(RemoteHooking.IContext InContext, String InChannelName)
        {
            try
            {
                RecvHook = LocalHook.Create(
                    LocalHook.GetProcAddress("Ws2_32.dll", "recv"),
                    new DRecv(RecvH),
                    this);
 
                SendHook = LocalHook.Create(
                    LocalHook.GetProcAddress("Ws2_32.dll", "send"),
                    new DSend(SendH),
                    this);
 
                RecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
                SendHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
            }
            catch (Exception ex)
            {
                Interface.Print(ex.Message);
                return;
            }
 
            // Wait for host process termination...
            try
            {
                while (true)
                {
                    Thread.Sleep(500);
 
                    if (Queue.Count > 0)
                    {
                        Message[] messages = null;
                        lock (Queue)
                        {
                            messages = Queue.ToArray();
                            Queue.Clear();
                        }
                        
                        Interface.OnMessages(messages);
                    }
                    else
                    {
                        Interface.Ping();
                    }
                }
            }
            catch (Exception)
            {
                // NET Remoting will raise an exception if host is unreachable
            }
        }
 
        //int recv(
        //  _In_  SOCKET s,
        //  _Out_ char   *buf,
        //  _In_  int    len,
        //  _In_  int    flags
        //);
        [DllImport("Ws2_32.dll")]
        public static extern int recv(
            IntPtr s,
            IntPtr buf,
            int len,
            int flags
        );
 
        //int send(
        //  _In_       SOCKET s,
        //  _In_ const char   *buf,
        //  _In_       int    len,
        //  _In_       int    flags
        //);
        [DllImport("Ws2_32.dll")]
        public static extern int send(
            IntPtr s,
            IntPtr buf,
            int len,
            int flags
        );
 
        [UnmanagedFunctionPointer(CallingConvention.StdCall,
            CharSet = CharSet.Unicode,
            SetLastError = true)]
        delegate int DRecv(
            IntPtr s,
            IntPtr buf,
            int len,
            int flags
        );
 
        [UnmanagedFunctionPointer(CallingConvention.StdCall,
            CharSet = CharSet.Unicode,
            SetLastError = true)]
        delegate int DSend(
            IntPtr s,
            IntPtr buf,
            int len,
            int flags
        );
 
        static int RecvH(
            IntPtr s,
            IntPtr buf,
            int len,
            int flags)
        {
            Main This = (Main)HookRuntimeInfo.Callback;
            lock (This.Queue)
            {
                byte[] message = new byte[len];
                Marshal.Copy(buf, message, 0, len);
                This.Queue.Push(new Message { Buf = message, Len = len, Type = MsgType.Recv });
            }
 
            return recv(s, buf, len, flags);
        }
 
        static int SendH(
            IntPtr s,
            IntPtr buf,
            int len,
            int flags)
        {
            Main This = (Main)HookRuntimeInfo.Callback;
            lock (This.Queue)
            {
                byte[] message = new byte[len];
                Marshal.Copy(buf, message, 0, len);
                This.Queue.Push(new Message { Buf = message, Len = len, Type = MsgType.Send });
            }
 
            return send(s, buf, len, flags);
        }
    }
}
Используется библиотека отсюда https://easyhook.codeplex.com/

помогите кому не сложно и кто разбирается, допилить функционал. Нужно добавить функцию фильтрации/модификации исходящих пакетов (Send).
по шаблону.
например что заменить 00 00 00
на что заменить 00 00 07
loveln вне форума Ответить с цитированием
Старый 22.04.2016, 10:24   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Не могу запустить с протестировать приведенный выше код, но предполагаю, что надо делать как-то так:
Код:
 private static int SendH( IntPtr s, IntPtr buf, int len, int flags )
            {
                var unmanagedPointer = IntPtr.Zero;
                var This = ( Main ) HookRuntimeInfo.Callback;
                lock ( This.Queue )
                {
                    var message = new byte[ len ];
                    Marshal.Copy( buf, message, 0, len );
                    This.Queue.Push( new Message { Buf = message, Len = len, Type = MsgType.Send } );
                    //Изменяем массив
                    var newMessage = message.ToArray();
                    //Что-то делаем с новым сообщением
                    //........
                    unmanagedPointer = Marshal.AllocHGlobal( newMessage.Length );
                    Marshal.Copy( newMessage, 0, unmanagedPointer, newMessage.Length );

                    //Не могу сказать нужно ли освобождать тут память
                    Marshal.FreeHGlobal(buf);
                }
                try
                {
                    return send(s, unmanagedPointer, len, flags);
                }
                finally
                {
                    Marshal.FreeHGlobal( unmanagedPointer );
                }
            }
Другое дело, что я не могу сказать как тут следует управлять памятью. Т.е. Marshal.FreeHGlobal выставлял на чутье, но возможно так делать нельзя. Если работать не будет, то можно попробовать их убрать, но может выйти memoryleak. Плюс, мне совсем не нравиться в этом коде lock, но исправлять это не возьмусь.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 22.04.2016, 16:11   #3
loveln
 
Регистрация: 20.04.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Скарам Посмотреть сообщение
Не могу запустить с протестировать приведенный выше код, но предполагаю, что надо делать как-то так:
Код:
 private static int SendH( IntPtr s, IntPtr buf, int len, int flags )
            {
                var unmanagedPointer = IntPtr.Zero;
                var This = ( Main ) HookRuntimeInfo.Callback;
                lock ( This.Queue )
                {
                    var message = new byte[ len ];
                    Marshal.Copy( buf, message, 0, len );
                    This.Queue.Push( new Message { Buf = message, Len = len, Type = MsgType.Send } );
                    //Изменяем массив
                    var newMessage = message.ToArray();
                    //Что-то делаем с новым сообщением
                    //........
                    unmanagedPointer = Marshal.AllocHGlobal( newMessage.Length );
                    Marshal.Copy( newMessage, 0, unmanagedPointer, newMessage.Length );

                    //Не могу сказать нужно ли освобождать тут память
                    Marshal.FreeHGlobal(buf);
                }
                try
                {
                    return send(s, unmanagedPointer, len, flags);
                }
                finally
                {
                    Marshal.FreeHGlobal( unmanagedPointer );
                }
            }
Другое дело, что я не могу сказать как тут следует управлять памятью. Т.е. Marshal.FreeHGlobal выставлял на чутье, но возможно так делать нельзя. Если работать не будет, то можно попробовать их убрать, но может выйти memoryleak. Плюс, мне совсем не нравиться в этом коде lock, но исправлять это не возьмусь.
Спасибо, это все очень замечательно, но дело в том что мне нужен уже полностью завершенный вид кода (с тыканьем носом на ключеывые моменты) т.к. в c# я не силен, но нужна подключаемая dll'ка (пишу оболочку на другом яп), вот и прошу помощи, у тех кто реально может и кому не жалко помочь. Я так понимаю, этот участок кода, который вы привели, нужно включить в тело основного, в конец после
Код:
            return send(s, buf, len, flags);
И если не составит особого труда, приведите пожалуйста пример, как можно отфильтровать сообщение(00 00 заменить на 11 11, к примеру)
Код:
                    var newMessage = message.ToArray();
                    //Что-то делаем с новым сообщением
                    //........
Есть ли возможность забраковать сообщение по шаблону? т.е. если есть вхождение (например если в теле сообщения по определенным оффсетам будут присутствовать байты 00 11 22 (1,2 и 3 оффсеты, к примеру) - заблокировать сообщение)

Последний раз редактировалось loveln; 22.04.2016 в 16:22.
loveln вне форума Ответить с цитированием
Старый 23.04.2016, 14:49   #4
loveln
 
Регистрация: 20.04.2016
Сообщений: 5
По умолчанию

up.
loveln вне форума Ответить с цитированием
Старый 23.04.2016, 14:55   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Маловероятно, что у кого-то будет желание заниматься написанием "полностью завершенного кода" за вас.
С таким лучше обращаться во Фриланс за вознаграждение.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.04.2016, 19:59   #6
loveln
 
Регистрация: 20.04.2016
Сообщений: 5
По умолчанию

.up
loveln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить функцию в компилятор krox Фриланс 1 10.04.2015 07:20
Требуется создать функцию фильтрации MATLAB YoYa Фриланс 3 12.04.2012 08:49
Добавить функцию в поток vandrouny Win Api 3 07.11.2010 17:41
Пытаюсь понять код user32.dll и gdi32.dll Beermonza Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 43 13.07.2010 15:09
добавить функцию, С xalex17 Помощь студентам 3 12.11.2008 03:39