Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Билилиотека для Hook'a в NET'e


Автор: megel 8.9.2010, 21:35
Хотел вам показать свою разработку, позволяет перехватывать экспортируемые и виртуальные функции.
сначала по имени окна, названию процесса, перехватывается процесс и в него загружается созданная пользователем библиотека.

отличие этой библиотеки в том что загружаемая библиотека может быть написана на С# или на Boo( что желательнее т.к. в библ. включены макросы которые облегчают работу)
скорость работы hook'нутой функции примерно в 8 раз медленнее чем обычной(при условии что функции пустые)


пример запуска библеотеки( на Boo) : 

Код

process = RemoteProcess()
process.StartProcess( "C:/Games/Counter-Strike/hl.exe -game cstrike", true) //запуск процесса


process.RegisterComAssembly( LoadingLib.RunClass) // регистрация com типов
pointer = processs.CreateCom( LoadingLib.RunClass, LoadingLib.IRunBase) // создание класса в процессе
processs.ComInvokeFirst( pointer) //  вызов первого метода в классе "LoadingLib.RunClass"
process.ResumeProcess()


код самой библиотеки

Код

[Guid( "d7ef7c2a-8c50-424d-84af-36e380320835"), 
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IRunBase :
    
    def RunHook() :
        pass


[Guid( "d96ce0d8-3264-4d72-a1f7-bc1dd3574033")]
class RunClass( IRunBase) :
    
    
    hook as GlClear

    public def RunHook() :
        
        hook = GlClear()
        hook.SetData( "opengl32.dll", "glClear")
        hook.DoHook()

[ DllImport( "user32.dll", EntryPoint : "GetKeyState")]
static def GetKeyState( key as Keys) as short :
    pass

[ DllImport( "opengl32.dll", EntryPoint : "glLineWidth")]
static def glLineWidth( value as single) :
    pass

[ DllImport( "opengl32.dll", EntryPoint : "glPolygonMode")]
static def glPolygonMode( type as int, value as int) :
    pass
    
static def IsKeyDown( key as Keys) :
    return GetKeyState( key) < 0

[ GenerateHook()] // аттрибут который автоматически создает нужный класс
static def GlClear( mode as int) :
    

    mode = 0x1B02
    if IsKeyDown( Keys.ShiftKey) :
        mode = 0x1B01

    glLineWidth( 2.0)
    glPolygonMode( 0x0408, mode)
    GlClear( 0x00004000 | 0x00000100)


кстати это код wallhack'a для couter-strike


библиотека еще довольно сырая, но на windows 7 работает нормально
название библиотеки такое странное т.к я еще не выбрал название( и еще лучше не использовать слово Hook в названии)
естественно работать с библиотекой надо внимательно т.к при неправильной записи
функции вы даже не увидите сообщение об ошибке( например при перехвате функции интерфейса надо добавлять праметр IntPtr thisValue)

библиотеку я буду еще дорабатывать,
буду рад если кто-то заинтерисуется, я могу объяснить подробнее как с ней работать



Автор: 56illusion 12.9.2010, 10:49
А с ней значет можно перехватывать нажатые клавиши???

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