Дабы облегчить жизнь себе и потенциально другим мододелам, 
а также в целях повышения совместимости независимых разработок 
состряпал полезную штуку 
перевел на нее ХД 3 
и переводится на нее ХотA
 
готова версия 2.8:
 библиотека + SDK + исходники
изменения:
 
Code: 
 Изменения нарушающие обратную совместимость: [!] 
Исправления багов: [-] 
Расширение функциональности: [+] 
Несущественные изменения/комментарии: [*] 
 
2.8 
 
[-] теперь EXTENDED_ и SAFE_ HiHook хуки могут быть установлены на рекурсивно выполняемый код. 
 
 
 
2.7 
 
[+] patcher_x86 теперь полностью совместим с DEP (Предотвращением выполнения данных) 
 
 
 
2.6 
 
[+] Добавлен метод PatcherInstance::BlockAllExceptVA(_ptr_* va_args) 
    блокирует для данного  PatcherInstance установку патчей для всех адресов кроме указанных. 
      Добавлен метод Patcher::PreCreateInstance(char* name) 
    нужен для применения методов PatcherInstance::BlockAt и PatcherInstance::BlockAllExceptVA 
     до того как PatcherInstance будет полноценно создан с помощью Patcher::CreateInstance 
[-] Исправлена возможность краша на старте из-за DEP. 
 
 
 
2.5 
 
[+] Функциии PatcherInstance::CreateCodePatch и PatcherInstance::WriteCodePatch 
    теперь умеют корректно воспринимать записанные прямо опкоды с относительной адресацией. 
    Например 0x639C40: call 0x447799 раньше можно было записать только в виде 
    WriteCodePatch(0x639C40, "c%", 0x447799); или 
    WriteCodePatch(0x639C40, "E8 ~d", 0x447799); 
    (+ еще можно: WriteDataPatch(0x639C40, "E8  54 DB E0 FF");  чего, в принципе, было достаточно) 
    Теперь можно и прямо WriteCodePatch(0x639C40, "E8  54 DB E0 FF") ;  (т.е. теперь можно просто скопировать патч с OllyDbg и не париться с преобразованием) 
     
 
 
2.4 
 
[-] баг: установка LoHook на длинную последвательность NOP'ов приводила к ошибкам. 
 
 
 
2.3 
 
[+] добавлены функции  
    Patcher::VarInit 
    Patcher::VarFind 
    и тип Variable для работы с общими "переменными" для всех текущих клиентов patcher_x86.dll 
[+] функция SaveDump сохраняет в файл после списка всех установленных патчей список всех "переменных" с их текущими значениями. 
 
 
2.2 
 
[-] LoHook не сохранял регистр флагов 
 
 
2.1 
 
[-] чтение/изменение esp регистра в LoHook хуке работало неверно 
 
[+] добавлены функции 
    PatcherInstance::WriteHexHook 
    PatcherInstance::CreateHexHook 
     
    эти функции позволяют установить самый примитивный хук 
    а именно LoHook без высокоуровневой оболочки-функции. 
    тело хука пишется прямо в вызове WriteHexHook или CreateHexHook 
    таким же образом как пишется патч с помощью WriteCodePatch или CreateCodePatch 
 
[+] В любом LoHook хуке теперь доступен для чтения/изменения регистр флагов процессора (расширена структура HookContext) 
 
[+] LoHook теперь хранит экземляр HookContext в стеке, а не по фиксированному адресу, что позволяет корректно рекурсивно выполнять LoHook хук. 
 
[+] теперь внутри функции сработавшей по LoHook хуку можно использовать операции с помещением данных в стэк контекста хука, аналогичные команде процессора PUSH. 
    размер памяти, доступной для такого помещения в стэк контекста ограничен 128 байтами для хука, созданного с помощью методов PatcherInstance::WriteLoHook и PatcherInstance::CreateLoHook, и произволен для хука, установленного с помощью новых методов  
    PatcherInstance::WriteLoHookEx 
    PatcherInstance::CreateLoHookEx. 
 
[+] добавлена функция: 
    PatcherInstance::BlockAt 
    которая запрещает данному экземпляру PatcherInstance устанавливать по заданному адресу патчи/хуки 
 
[+] добавлены функции 
    HiHook::SetUserData 
    HiHook::GetUserData 
 
[+] расширен функционал PatcherInstance::WriteDataPatch и PatcherInstance::CreateDataPatch 
    - добавлен формат символ %s (string) - копирует си-строку из аргумента 
 
 
1.7 
 
[+] для HiHook добавлен новый subtype: SAFE_ = 2 
    - то же самое что и EXTENDED_, однако перед вызовом GetDefaultFunc() восстанавливаются (только на время вызова) 
    значения регистров процессора EAX, ECX (если не FASTCALL_ и не THISCALL_), 
    EDX (если не FASTCALL_), EBX, ESI, EDI, бывшие на момент вызова замещенной функции 
 
1.6 
 
[+] Добавлены функции: 
 
    PatcherInstance::Write 
    PatcherInstance::CreatePatch 
 
    (см. SDK) 
 
1.5 
 
[-] критический баг при попытке поставить CALL_ HiHook на неверный опкод при выключенном логировании 
 
 
1.4 
 
[-] баг из-за которого невозможно было использовать FUNCPTR_ EXTENDED_ HiHook 
 
 
1.3 
 
[-] Исправлены ошибки: 
    - отмена хуков во время выполнения их хук-функций приводила к непредвиденным результатам 
    - неверно работал формат-символ %a в функции Patcher::WriteComplexData 
 
[+] Функция Patcher::CreateInstance теперь, принимая в качестве аргумента нулевую и пустую строки, 
    создает PatcherInstance с именем модуля вызвавшего функцию. 
 
[+] Функции Patcher::GetInstance можно передавать в качестве аргумента не только 
    уникальое имя PatcherInstance, но так же имя модуля, создавшего PatcherInstance. 
    Однако, имейте ввиду что в одном модуле можно создать несколько экземпляров PatcherInstance, 
    в этом случае Patcher::GetInstance с именем модуля в качестве аргумента будет 
    возвращать первый созданный PatcherInstance в этом модуле. 
 
[!] Теперь невозможно создавать патчи посредством экземпляра PatcherInstance созданным не в вашем модуле. 
    Возможность отменять и применять эти патчи сохранена. 
 
[!] Функция Patch::Apply() теперь возвращает индекс (c 0) патча/хука в последовательности примененных патчей по данному адресу 
    в случае успеха, -2 если патч/хук уже применен и -1 в случае неуспеха из-за неведомой хрени. 
 
[!] Функция Patcher::DestroyAllAt заменена на Patcher::UndoAllAt 
 
[*] Функции  
    PatcherInstance::WriteComplexPatch 
    PatcherInstance::CreateComplexPatch 
    переименованы в 
    PatcherInstance::WriteCodePatch 
    PatcherInstance::CreateCodePatch 
    для лучшего отражения сути их работы 
 
[!] Теперь все патчи разделены на 2 типа: DATA_ и CODE_ 
    DATA_ патчи устанавливаются посредством простого копирования памяти 
    CODE_ - посредством MemCopyCode 
    произвольно выбрать тип патча нельзя, он устанавливается автоматически. 
    DATA_ : BytePatch, WordPatch, DwordPatch, HexPatch, FUNCPTR_ HiHook, DataPatch 
    CODE_:  JmpPatch, CodePatch (бывший ComplexPatch), LoHook, CALL_ и SPLICE_ HiHook 
    ОЧЕНЬ ВАЖНО понимать разницу! 
 
[+] Добавлены/реализованы функции: 
 
    Patch::ApplyInsert 
 
    PatcherInstance::WriteDataPatch 
    PatcherInstance::CreateDataPatch 
      PatcherInstance::GetLastPatchAt, 
     PatcherInstance::UndoAllAt, 
     PatcherInstance::GetFirstPatchAt. 
 
    Patcher::GetFirstPatchAt,  
     Patcher::MemCopyCodeEx, 
 
  
[!] Теперь невозможно уничтожить неотмененный Хук (т.е. чтобы уничтожить, нужно сначала отменить). 
[!] Возможность корректно уничтожить хук во время выполнения хук-функции ликвидированна 
    (из-за бага ее и так не было, но теперь ее нет официально) 
 
[*] Теперь Хук любого типа можно безопасно отменить в любой момент во время выполнения 
    его хук-функции (соответственно исключая т.н. FIXED хуки, которые вообще нельзя отменить). 
    Хук отменяется сразу (т.н. понятие отложенной отмены теперь неактуально). 
 
[+] Функция Patcher::MemCopyCode теперь помимо CALL (E8) и JMP (E9) опкодов корректно копирует 
    опкоды 0F 80 - 0F 8F (длинные условные прыжки);  
[!] теперь в функции Patcher::MemCopyCode переходы E8, E9, 0F 80 - 0F 8F трансформируются 
    только если направляют за границы копируемого блока. 
 
[!] Функция Patcher::MemCopyCode теперь копирует всегда целое количество опкодов.  
    (т.е. размер скопированного блока кода теперь >= size (был строго = size, т.е последний опкод мог быть обрезан). 
 
[*] Функция Patcher::MemCopyCodeEx отличается от Patcher::MemCopyCode тем что если  
    в копируемом блоке короткие прыжки EB, 70 - 7F направляют за границы копируемого блока, 
    то они замняются на соответсвующие длинные прыжки (E9, 0F 80 - 0F 8F) 
 
[*] Таким образом, теперь появилась возможность устанавливать SPLICE_ хуки и низкоуровневые хуки на код, 
    содержащий любые корткие и длинные относительные переходы. 
    А еще очевидна возможность скопировать целую функцию или ее часть от начала 
    и вызывать копию как оригинал. 
 
[+] Низкоуровневый хук теперь не сбивает содержимое регистров флагов, соответственно его  
    теперь можно ставить на любой код в функции. 
 
[!] Jmp патч, созданный посредством PatcherInstance::CreateJmpPatch и PatcherInstance::WriteJmp 
    теперь закрывает целое количество опкодов, т.е. размер патча теперь >= 5 (был строго = 5), 
    разница заполнятеся NOP'ами.  
 
[+][!] Расширена функциональность Patcher::WriteComplexData, PatcherInstance::WriteCodePatch и PatcherInstance::CreateCodePatch 
    - добавлена возможность ставить метки (до 10) и осуществлять переход к ним 
      с помощью всех длинных и коротких относительных переходов (E8, E9, 0F 80 - 0F 8F, EB, 70 - 7F)  
      (формат символы #0: , #1: , ... , #9: и #0 , #1 , ... , #9) 
    - добавлен формат символ ~b - берет из аргументов абсолютный адрес и  
      пишет относительное смещение до него размером в 1 байт для опкодов EB, 70 - 7F 
    - добавлен формат символ ~d - берет из аргументов абсолютный адрес и  
      пишет относительное смещение до него размером в 4 байта для опкодов E8, E9, 0F 80 - 0F 8F 
    - добавлен формат символ %o (offset) - помещает по адресу из аргумента смещение позиции в Complex коде, 
      относительно начала Complex кода. 
    - добавлен формат символ %n (nop) - пишет nop опкоды, количеством указанным в аргументе 
    - формат символ %m теперь копирует посредством MemCopyCodeEx а не MemCopyCode, 
      то есть размер скопированного кода может оказаться больше копируемого 
      из-за трансформации коротких прыжков в длинные. 
    - формат символы %a и %h будут оставлены для обратной совместимости, но упоминания о них будут убраны из SDK; 
      вместо этих символов рекомендуется использовать %o и %%
  
Code: 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 
// ОПИСАНИЕ. 
// 
// ! библиотека предоставляет: 
//        - удобные унифицированные централизованные  
//          инструменты для установки патчей и хуков 
//          в код целевой программы. 
//        - дополнительные инструменты: дизассемблер длин опкодов и функцию 
//          копирующую код с корректным переносом опкодов jmp и call c  
//          относительной адресацией 
// ! библиотека позволяет 
//        - устанавливать как простые так и сложные патчи. 
//          с методами по установке сложных патчей почти так же удобно работать 
//          как с ассемблером (пока не хватает только меток и прыжкам к меткам) 
//        - устанавливать высокоуровневые хуки, замещая оригинальные функции в 
//          в целевом коде на свои, не заботясь о регистрах процессора, 
//          стеке, и возврате в оригинальный код. 
//        - устанавливать высокоуровневые хуки один на другой 
//          не исключая а дополняя при этом функциональность хуков 
//          установленных раньше последнего, тем самым реализуется идеология сабклассинга 
//        - устанавливать низкоуровневые хуки с высокоуровневым доступом к 
//          регистрам процессора, затертому коду и адресу возврата в код 
//        - отменять любой патч и хук, установленный с помощью этой библиотеки. 
//        - узнать задействован ли определенный мод, использующий библиотеку 
//        - узнать какой мод (использующий библиотеку) установил определенный патч/хук 
//        - получить полный доступ ко всем патчам/хукам, установленным из других модов  
//          с помощью этой библиотеки 
//        - легко и быстро обнаружить конфликтующие патчи из разных модов 
//          (использующих эту библиотеку) 1) отмечаяв логе такие конфликты как: 
//                                - устанавливаются патчи/хуки разного размера на один адрес 
//                                - устанавливаются патчи/хуки перекрывающие один другого со смещением 
//                                - устанавливаются патчи поверх хуков и наоборот 
//          а так же 2) давая возможность посмотреть дамп (общий листинг) всех патчей  
//          и хуков установленных с помощью этой библиотеки в конкретный момент времени и лог использования библиотеки. 
////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
			 
			
			
			
				
(This post was last modified: 21.08.2015 11:23 by baratorch.)
 
			 
		 |