Hook–FAQ: Розбираємось у старих та нових способах встановлення системних хуків. Hook–FAQ: Розбираємось у старих та нових способах встановлення системних хуків Різні типи лівого бокового удару




Павутина в cs1.6 або hook для cs 1.6, називайте як хочете, але це вже досить поширений плагін у вашій контрі. Сам плагін павутини в cs, дає вам можливість здійснювати переміщення по карті, як ніби ви павук і літаєте мережею. Тобто переміщаєтеся павутиною. Саме налаштування плагіна павутина в cs1.6 дозволяє зробити її не тільки для адмінів або інших осіб, але і для всіх гравців. Звичайно ж, якщо ви злісний адмін, то плагін павутиння в cs ви можете налаштувати тільки для себе. Тим самим відгородивши нубів літати картою як живе м'ясо. За ідеєю цей плагін павутини в cs, давно використовується ще й у quake2, далекого 2001 року. І це hook - плагін hook для cs 1.6 був запроваджений вже пізніше. Але від цього сам настрій не змінюється.

Як використовувати павутину в cs:
Щоб пускати павутину в cs1.6, вам потрібно в консолі прописати прив'язку до клавіші. На прикладі візьмемо "r"

Bind "r" "+rope"

Після цього натискаємо на «r», і можемо літати як павук павутинням.

Квари для плагіна павутиння в cs:

amx_rope - Вмикати | вимикати плагін павутини.
amx_rope_count — Скільки разів можна користуватися павутинням за раунд.

Як і було вище, помічено, що є й інший плагін для вашого сервера кс. Це hook плагін для cs.
В основному він використовується для prokreedz мода, щоб вчитися стрибати правильно.

Як встановити плагін hook для cs:
1) Копіюємо файли плагіна prokreedz_hook.amxxу категорію plugins cstrike/addons/amxmodx/.
2) Далі відкриваємо файл плагінів ( plugins.ini cstrike/addons/amxmodx/configs/) і прописуємо туди prokreedz_hook.amxx, щоб він працював.

Як використовувати hook в cs:
Біндим кнопку до хука і літаємо.

Bind "r" "+hook"

На цьому все. Ви можете вибрати будь-який з двох плагінів і вже за допомогою них переміщатися по карті.

В архіві файли плагіна павутини для cs1.6, та файли плагіна hook для cs

Ми раді вітати вас на сайті, присвяченому одній з найпопулярніших ігор у світі. Counter Strike. Наш сайт містить безліч різних файлів для цієї гри, різні моди, свіжі патчі, плагіни.
Павутина в Контр Страйк 1.6 – це дуже популярний плагін. Сам плагін павутини дозволяє вам переміщатися картою, начебто ви павук і переміщаєтеся павутиною. Плагін павутина для cs 1.6 може стати доступним не тільки для адмінів, але і для звичайних гравців, за умови його правильного налаштування. Звичайно, якщо ви злісний адміністратор, то плагін павутина ви налаштуєте тільки для себе, тим самим не даючи нубам літати по карті, наче м'ясо. Ідею цього плагіна використовує вже давно, ще у quake 2 (2001 рік). Плагін hook для cs 1.6 був впроваджений трохи згодом, але сам настрій від цього не змінюється.
Як правильно використовувати павутину в cs? У своєму оповіданні ми намагатимемося дати точну відповідь на це запитання.
Щоб пускати павутину cs 1.6, необхідно в консолі прописати прив'язку до певної клавіші. Наприклад візьмемо кнопку «А».
bind "А" +rope
Після цього натисканням на клавішу «А» ви можете літати як павук.
Представляємо вашій увазі квари для плагіна павутина в cs:
amx_rope – включає та вимикає плагін;
amx_rope_count – показує скільки разів ви можете використовувати павутину за один раунд.
Існує ще один плагін для вашого КС – hook. Як правило, він використовується для prokreedz-мода, щоб навчитися правильно (за мірками гри) стрибати.
Для встановлення hook для КС, потрібно:
1) Скопіювати prokreedz_hook.amxx в plugins cstrike/addons/amxmodx/.
2) Відкрити (plugins. ini cstrike/addons/amxmodx/configs/) і щоб він працював, прописати туди prokreedz_hook.amxx.
Чи не вмієте використовувати hook? Все просто, біндім кнопку до хука і літаємо, як павук - bind "А" "+hook".
Сподіваємося, ми дали виразну відповідь для всіх сайтів та власників ігрових серверівна дуже популярне питання про те, як правильно використовувати павутину для КС, як на ній літати. Цей плагін відкриває нові можливості гри і робить її ще цікавішою, тим більше, що користуватися ним так просто! Відкривайте нові можливості, стежте за новинками Контр Страйк і дізнавайтеся багато нового і цікавого.

Перед вами - повне керівництвоправильного нанесення лівого бокового удару (лівий хук). Ця стаття допоможе тим боксерам-початківцям, яким не подобається їхній лівий хук, і, можливо, навіть експертам, які бажають посилити і підправити вже поставлений удар. Вивчіть 4 різних видівлівого хука та потренуйтеся правильно вибирати момент для його нанесення.

Я пропрацював із боксерами достатньо для того, щоб зрозуміти, що для деяких поставити лівий бічний удар не є проблемою, а для інших – це дуже важко. Це як біг чи танці. Деякі люди мають вроджені дані і їхнє тіло має чудову механіку і рухається красиво, а інші «дерев'яні» від природи. Хороша новинау тому, що поставити лівий хук можна.

Різні типилівого бічного удару

Багатьом може здатися сюрпризом, що є кілька типів лівих бічних ударів. Якийсь тип поставити легше, а якийсь важче. Я рекомендую попрактикуватися і вивчити всі типи для власної користі.

  1. Силовий лівий хук- Ви нахиляєтеся (вкладаєте корпус) в удар, голова рухається трохи назад і праворуч, все тіло знаходиться в русі і його вага переноситься на задню ногу. Це я називаю силовим хуком.
  2. Проникаючий лівий хук- під час удару голова йде вперед, але залишається поряд із противником; корпус обертається (скручується). Зазвичай цей удар завдається по тулубу супротивника в ближньому бою (ваша голова знаходиться поруч із супротивником і тому йому важко завдати контрудару). Проникаючий хук хороший тим, що його можна повторювати знову і знову, тому що ваш корпус майже втрачає вихідної позиції для повторного удару. (Деякі боксери завдають цього удару у формі «хукеркоту» — тобто як щось середнє між лівим хуком та лівим аперкотом)
  3. Хук на обертанні– при нанесенні цього удару боксер обертає корпус довкола своєї лівої стопи – тобто. зміщується за годинниковою стрілкою, йдучи з лінії удару у відповідь противника. Цей удар може бути дуже сильним і водночас дозволить уникнути контрудара. Це чудовий зустрічний удар, який допоможе вам закрутити опонента в рингу.
  4. Хук у випадом– при нанесенні цього удару ви робите випад уперед і витягуєте тіло у напрямку противника, а ваша ліва рука летить краєкторією петлі. Ліва рука починає рух від вашого обличчя, потім швидко зміщується вліво і вилітає у бік особи опонента. Особливість цього удару полягає в тому, що ваша ліва рука випрямляється якнайсильніше, щоб дістати супротивника. Цей лівий хук більше нагадує лівий крос. Деякі боксери при виконанні цього удару роблять невеликий нахил вперед і використовують свою спину як пружину, що виштовхує ліву руку. Цей удар не відноситься до ударів, яким навчають у залах, однак при хорошому розрахунку часу він дуже небезпечний і ефективний.

Ідеальним прикладом силового лівого хука є удари Майка Тайсона чи Артуро Гатті. Подивіться, як вони вкладають у лівий хук усе своє тіло.

Ідеальний приклад проникаючого лівого хука можна побачити у Марко Антоніо Баррери, Міккі Уорда або Ріккі Хаттона. Зверніть увагу, що голова залишається на місці при обертанні корпусу під час удару.

Ідеальним прикладом лівого хука на обертанні може бути удар Мігеля Котто (він взагалі добре володіє трьома типами хука), Володимира Кличка, Флойда Мейвезера Молодшого.

Ідеальні приклади лівого хука з випадом можна побачити у Ріккі Хаттона, Роя Джонса Молодшого, Принца Нассима.

Для тих, кому важко чи боляче бити лівий хук по корпусу

Причина, за якою вам боляче або некомфортно бити лівий хук по корпусу в тому, що у вас ліва рука набрала необхідну форму.

Спробуйте наступне:

  • Не бийте хук горизонтально. Спробуйте бити напівхук та напіваперкот. Нехай при ударі буде деякий рух вгору («хукеркот»).
  • Розслабтеся та опустіть плече та лікоть під час удару по корпусу.
  • Обидві ноги при ударі повинні повернутись і дивитися праворуч.
  • У вас надто сильно рухається рука. Робіть більше рух корпусом (скручування), а не рукою.
  • На початку удару не відводьте руку назад, а припустіть її перед собою і завдавайте удару з цього положення.

Порядок нанесення лівого хука (для потужного удару по корпусу)

  1. Стати у свою звичайну стійку.
  2. Ледве зігніть коліна, голова і ліва рука зміщуються трохи вліво і вниз.
  3. Швидко переверніть корпус праворуч, одночасно викидаючи ліву руку.
  4. Все тіло повернеться праворуч разом із вашим гаком.
  5. Ваша права п'ята має бути на підлозі, а ліва підніметься від підлоги, виштовхуючи руку.
  6. Кулак стискається практично в момент контакту з противником і зупиняється відразу після удару.
  7. Зупиніть свій удар до того, як ваш корпус перекрутить, інакше нарветесь на контрудар. Не треба бити із максимальною амплітудою.
  8. Наприкінці удару ваша голова, лівий кулак та ноги повинні «дивитися» праворуч.

Примітка: удар робиться на видиху, скручуйте стопи максимально праворуч і не забувайте повернутися до стійки.

Якщо б'єте хук, що проникає, обертайте корпус, але голова нехай залишиться на місці. У більшості випадків краще припустити голову ближче до ліктя супротивника, так щоб можна було реально встромити свій удар і не дуже хвилюватися про можливий контрудар супротивника з його правої руки. Можна спробувати нанести цей хук у вигляді «хукеркоту», щоб надати удару по-справжньому ефекту. Спробуйте!

Якщо б'єте хук із обертанням, нехай ваша рука летить трохи пряміше. Тобто, це буде вже більше лівий крос, ніж хук. Для посилення удару ліву руку треба викидати від обличчя. При нанесенні цього хука все ваше тіло обертається, ліву руку викидаєте прямо перед собою і водночас ваша права нога йде вліво і назад. Таким чином ви йдете з лінії контратаки. Ваше тіло зробить поворот навколо лівої стопи на 60-80 градусів за годинниковою стрілкою.

У разі нанесення лівого хука з випадом швидко киньте руку вперед і негайно поверніть її на місце. Цей удар схожий на постріл із рогатки. Знову ж таки, цей хук дуже схожий на лівий крос. У момент завдання удару ви стрибаєте вперед (або просто витягуєтеся вперед) і ваша голова рухається прямо на противника, будучи гарною мішенню для потужного контрудара. Руку під час удару кидайте прямою – це дасть збільшення ударної дистанції.

Повторювані хуки

Якщо ви поекспериментували з наведеними вище рекомендаціями, вам напевно стало зрозуміло, що нанести два потужні ліві хуки поспіль дуже важко. Найбільш поширений спосіб нанести два хуки поспіль – це викинути спочатку проникаючий хук, а потім силовий.

Отже, ви зміщуєте голову вліво-вперед і наносите хук, що проймає, залишаючи голову на місці, а потім робите різкий рух головою і всім тілом вправо і наносите силовий хук. Можна нанести проникаючий хук по корпусу та за ним хук на обертанні в голову. Поспостерігайте як боксує Шейн Мозлі. Він любить викидати по три проникаючі ліві хуки поспіль.

Поради щодо нанесення лівих хуків:

  • Слабкий та сильний— Нехай один ваш хук буде слабким, а другий — сильним. Мета першого хука - змусити противника поставити захисний блок і перенести вісті в невідповідний момент. Можна нанести спочатку сильний, а потім слабкий хук.
  • Повільний та швидкий- Нанесіть повільний хук, а потім одразу дуже швидкий. Можна навпаки.
  • Низько та високо— Нанесіть хук корпусом, а другий у голову. Можна навпаки.

Коли наносити хук зліва

Багато боксерів мають добре поставлений лівий хук, але так і не навчилися правильно розраховувати час його нанесення. Вони готові чекати весь день, поки представиться можливість пробити лівий хук, а вона може і не представитися. Лівий хук – це більше ніж просто зброя. Його можна використовувати для завдання шкоди, розкриття захисту противника (для подальших сильних ударів з правої руки) і щоб відволікти опонента. Важливо мати впевненість та кидати хук не боячись контрудара.

Відмінні комбінації з лівим хуком:

  • Після правого кросу — ця комбінація очевидна. Майже кожен боксер б'є лівий хук після правого кросу.
  • Після лівого хука — Це теж очевидна річ. Усіх вчать захищатися за принципом «ліворуч-праворуч», тому подвійний хук ліворуч може мати успіх.
  • Хук на обертанні та одразу потужний правий крос. Після хука не забудьте поставити обидві п'яти на підлогу, щоб збільшити ефект від потужного кросу праворуч.
  • Швидкий хук по корпусу, щоб опустити захист опонета та одразу джеб у голову.
  • Потужний хук по корпусу, щоб опустити захист опонета (його праву руку) і одразу хук із випадом у голову. Після нього – удар на ваш розсуд.
  • Якщо ваш опонент тримає праву рукавичку близько до обличчя, киньте свій хук по рукавичці. Збитки все одно будуть відчутними.
  • Зробіть сайд степ праворуч, а потім нанесіть швидкий лівий хук з обертанням. Це ефективно, коли ваш опонент переслідує вас із опущеними руками. Можна також опустити захист противника, опустивши свою власну, але секунди.
  • Легкий лівий хук у голову та швидкий джеб, а потім правий крос.
  • Коли противник переслідує вас або коли вас притиснули до канатів, нагніть і нанесіть правий бічний в корпус і, розгинайтеся разом з лівим хуком на випаді в голову.

Як тільки згадаю ще підказки, обов'язково напишу, хоч у вас і так вже є багато що попрактикувати в рингу. Зараз у вас вже має з'явитися глибше розуміння найкращого удару в боксі, що нокаутує. Опанування технікою хука зліва зробить із вас «дворукого», а, отже, і більш ефективного бійця. Потренуйтеся та повідомте результати.

Так як багато хто мені пишуть і запитують коли Hook фінальна версія, вирішив таки написати хук, але не Ar4Mode.
Старий свій хук вирішив не довбати (бо код там жахливий), тому вирішив написати нью. З деякими змінами.

В архіві хук є для Ar4Mode, JBE, UJBL, JBM, так само для інших модів (але нативи ніякі не використовуються).
Також є наявність хука без збереження (треба в plugins-iHOOK.ini поміняти).

Відмінності від старого хука:
[-] Налаштування кольору хука.
[+] Збереження з БД (MsQl).
[+] Через файл налаштування: швидкості, виду. розміру кінця спрайту.
[+] Можна настроїти певний хук на певний прапор.
[+] Через файл налаштування прапора: павутинки/меню/контролю/вимикання.
[+|-] Візуальні зміни.
[+] Додав нові спрайти/звуки (хоча ви самі можете).
[+] Через файл можна налаштувати тип кінця хука (розкид або одиночний спрайт).
[+] (JBE) Можна вибрати при розшуку у кого забере хук (у всіх або тільки у людини в розшуку).
[+] Гарний код.

Консольні команди:
1) say / hook - меню павутинки
2) +hook/+rope - активація павутинки

Нативи:
native_iHOOK_menu(id) – відкриття меню.
native_iHOOK_get_hook_sett(id, iType) - отримання налаштувань хука [ iType: 1 - Спрайт павутинки / 2 - звук / 3 - спрайт кінця павутинки / 4 - розмір / 5 - вид / 6 - швидкість
bool:native_iHOOK_get_hook_player_have(id) – отримання наявності хука.
================================================================

Хочеш стати Чорним Володарем свого комп'ютера? Хочеш знати всі таємниці розробників малварі та антивірусів? Читай статтю, медитируй, осягай ази дзена, і нехай зійде на тебе прозріння!

RTFM

Що таке хук (hook – гачок, англ.)? Це механізм, що дозволяє відстежити якусь подію в операційній системі. Було воно розроблено дядечками з Microsoft із самими добрими намірами- дозволити програмісту більш ефективно вирішувати свої завдання шляхом встановлення контролю над подіями клавіатури, миші та багато іншого. Реалізувався він за допомогою всіх відомих функцій: SetWindowsHook(Ex), UnhookWindowsHook(Ex) та CallNextHook(Ex).

Хук служить для перехоплення певних подій перед тим, як вони дійдуть до додатку. Ця функція може реагувати на події та, в деяких випадках, змінювати або скасовувати їх. Функції, які отримують повідомлення про події, називаються «функціями, що фільтрують» і розрізняються за типами перехоплюваних ними подій. Приклад - фільтруюча функція для перехоплення всіх подій миші або клавіатури. Щоб Windows спромоглася викликати функцію-фільтр, ця функція повинна бути встановлена, тобто, прикріплена до хука (наприклад, до клавіатурного). Прикріплення однієї чи кількох фільтруючих функцій до якогось хука називається установкою хука. Якщо до одного хуку прикріплено кілька функцій, що фільтрують, Windows реалізує чергу функцій, причому функція, прикріплена останньою, виявляється на початку черги, а найперша функція - в її кінці.

Згодом шляхетне поняття хука перекрутилося, причиною чого стали дії вірусописачів та мальварників. Перші віруси були, як це сказати... наївними, напевно. Вони являли собою окремий exe-файл, що безпосередньо викликає потрібні функціїсистеми. Минав час і антивіруси, які з'явилися трохи згодом і раптом стали комерційними, досить швидко навчилися ловити віруси за сигнатурами шляхом простого сканування. оперативної пам'ятічи дискового простору.

І ось тут, у запалі одвічної боротьби між письменниками вірусів та їх «ловцями» постало одне-єдине питання, яке стоїть на порядку денному і досі стоятиме в найближчому неосяжному майбутньому - це питання виживання в операційній системі. Причому він також актуальний і для антивірусів, адже для хорошого системного програміста, пише віруси/ Руткіти, винести процес антивіруса із системи - не надто складне завдання.

Тому можна сміливо стверджувати, що з завдань антивірусів - це вміння зберегти свій процес у цілісності і безпеки від зловмисних дій вірусу. Загалом, на сьогоднішній день під хуками слід розуміти встановлення контролю над основними системними функціями операційної системи, від яких залежить життєздатність будь-якої програми – йдеться, як правило, про функції роботи з процесами, потоками, мережею та інтернетом тощо.

"А як же SetWindowsHook?" - Запитаєш ти мене. «Минуле століття», - відповім я. Використовувати їх давно вже не кошерно.

Що маємо?

Найпростіше встановити хук у системі шляхом створення так званої проксі-функції. Інакше кажучи, тобі треба визначитися, яку функцію ти перехоплюєш і знайти адресу її виклику. Для цього зазвичай використовується функція GetProcAddress приблизно так: GetProcAddress(GetModuleHandle("ntdll.dll"), "CsrNewThread").

Однак освічені знають, що вона практично завжди перехоплюється аверами, і для знаходження адреси функції використовують парсинг таблиці імпорту тієї чи іншої бібліотеки, як правило, ntdll.dll, kernel32.dll (kernelbase.dll у Windows7) або advapi32.dll.

int MyNewFunction(void *param1,
int param2, bool param3)
{
return OriginalFunction(param1,
param2, param3);
}

Після цього слід перезаписати адресу виклику OriginalFunction на свою - тобто, на MyNewFunction.

Тепер, якщо хтось захоче викликати виконання OriginalFunction, спочатку буде викликана твоя проксі-функція MyNewFunction, яка вже потім передасть управління на оригінальну адресу. Ось таким ось нехитрим чином діють, напевно, 8 хуків з 10. Цей спосіб зручний лише своєю простотою, але при цьому є жахливим палевом для аверів. Як? Поміркуй сам - все, що аверу потрібно, це порівняти колишню, «законну», адресу функції з тим, що є насправді. Якщо вони відрізняються – б'ємо на сполох. До речі, постає і наступне питання: звідки взяти цю адресу оригінальної функції? Тут особливо гадати не треба - його зчитують з потрібного файлуна диску. Цей підхід ґрунтується на тому припущенні, що вірус не патчитиме таблицю експорту файлу, що лежить на диску, обмежившись патчем віртуальної пам'яті.

Отже, їдемо далі. Як я вже казав, використання хука у вигляді проксі-функції хоч і зручна річ, але, по-перше, палевна, а по-друге, підходить лише для початківців. Тобто не для тебе :). Найпоширеніший вид хука – це сплайсинг. Впевнений, ти не раз чув це слово. У нашому випадку це запис на початок функції п'ятибайтової послідовності, яка є командою jmp за адресою обробника перехоплення. Тут перший байт - опкод jmp, чотири байти - адресу твоєї функції.

Якщо необхідно викликати функцію, що перехоплюється, то перед заміною необхідно зберегти її початкові байти і перед викликом відновлювати їх. Нестача даного методуполягає в наступному: якщо після відновлення початку функції відбулося перемикання контексту на інший потік програми, він зможе викликати функцію, минаючи перехоплювач. Цей недолік можна усунути, зупиняючи всі побічні потоки програми перед викликом, та запускаючи після виклику. Ну і звичайно, сплайсинг, як і проксі-функції, теж легко виявляється методом сканування пам'яті, оскільки відразу видно, що виклик функції йде кудись в інше місце.

Взагалі, забігаючи вперед, повинен донести до широкого загалу, що майже всі методи перехоплення виклику функцій так чи інакше детектуються скануванням пам'яті. Крім двох методів, але про це читай нижче.

IAT, EAT та інші звірі

Виникає питання: а на що і найголовніше де можна ставити свої хуки? Перше, що спадає на думку - звичайно ж, поставити перехоплення на Import Address Table (IAT). Коли програма використовує функцію з бібліотеки, програма повинна імпортувати адресу функції. Кожна DLL, що використовується програмою, описана в структурі, яка називається IMAGE_IMPORT_DESCRIPTOR. Ця структура містить ім'я DLL, чиї функції імпортовані додатком, і два вказівники на два масиви структур IMAGE_IMPORT_BY_NAME. Структура IMAGE_IMPORT_BY_NAME містить імена імпортованих функцій, що використовуються програмою.

Коли операційна системазавантажує програму в пам'ять, читається структура IMAGE_IMPORT_DESCRIPTOR і кожна потрібна DLL завантажується в пам'ять програми.
Як тільки DLL відображена (mapped), операційна система має у своєму розпорядженні кожну імпортовану функцію в пам'яті і записує поверх одного з масивів IMAGE_IMPORT_BY_ NAME з виконавчою адресою функції.

Як тільки функція hook з'являється в адресному просторі програми, твій вірус зможе прочитати формат PE цільової програми в пам'яті і замінити цільову адресу функції в IAT адресою hook-функції. Тоді, коли функція, що перехоплюється, буде викликана, твоя hook-функція буде виконана замість початкової функції. Трохи рідкісний варіант, що зустрічається в природі, реалізований за принципом «Якщо гора не йде до Магомеда...» - перехоплення Export Address Table (EAT), коли патчиться, навпаки, таблиця експорту Dll, яка експортує цільову функцію.

STELTH-хуки: зрозумій мене, якщо зможеш

Як я вже писав вище, головний недолік вищезгаданих методів перехоплення - це вимушена модифікація пам'яті, що неминуче веде до її детекту з боку аверів. Чи є вихід? Як не дивно, є. Навіть дві. Перший - це зареєструвати свій обробник винятків, потім домогтися, що він отримав управління. Це можна зробити, наприклад, втративши якусь ділянку пам'яті. Другий спосіб є дещо видозмінений перший. Тобто, ти, як і раніше, реєструєш обробник винятків, але для їхнього генерування ти використовуєш прийом, відомий серед дебаггерів. Як ти знаєш, дебагрегістри процесора використовуються для налагодження додатків і доступні, як правило, з кернелмоду. Однак їх можна встановлювати і з юзермодних додатків шляхом використання функцій GetThreadContext/SetThreadContext. Використовуються дебаг-регістри для встановлення точок зупинки (Breakpoints) на доступі до ділянки пам'яті або виконання.

Усього є вісім регістрів, їхнє призначення таке:

  • DR0 - DR3 - Кожен із цих регістрів містить лінійну адресу однієї з чотирьох контрольних точок. Якщо підкачування сторінок дозволено, їх значення транслюються у фізичні адреси за загальним алгоритмом;
  • DR4 - DR5 - Регістри зарезервовані та в процесорі i486 не використовуються;
  • DR6 - Налагоджувальний регістр стану. Він повідомляє про умови, виявлені під час генерування налагоджувального виключення (номер 1). Біти регістру встановлюються апаратно, а скидаються програмно;
  • DR7 - Реєстр визначає вид доступу до пам'яті, пов'язаний з кожною контрольною точкою.

Отже, все, що тобі потрібно зробити - це встановити хардварний бряк (hardware breakpoint, він же int 1) на початок функції, щоб процесор згенерував так званий «однокроковий виняток» (single step exception) і потім шляхом встановлення свого обробника виключення: AddVectoredExceptionHandler (0, (PVECTORED_EXCEPTION_ HANDLER)DebugHookHandler), перехопити цей EXCEPTION_SINGLE_STEP.

За його генерації твій обробник отримає управління бажаною функцією. Безперечна перевага такого методу в тому, що він абсолютно невиявлений шляхом сканування пам'яті, оскільки її модифікація тут не відбувається.

int SetDebugBreak(FARPROC address)
{
int status = -1;
HANDLE thSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPTHREAD, NULL);
THREADENTRY32 te;
te.dwSize = sizeof(THREADENTRY32);
Thread32First(thSnap, &te);
do
{
if(te.th32OwnerProcessID != GetCurrentProcessId())
continue;
HANDLE hThread = OpenThread(
THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
CONTEXT ctx;

GetThreadContext(hThread, &ctx);
if(!ctx.Dr 0)
{
ctx.Dr0 = MakePtr(ULONG, address, 0);
ctx.Dr7 | = 0x00000001;
status = 0;
}
else if(!ctx.Dr1)
{
ctx.Dr1 = MakePtr(ULONG, address, 0);
ctx.Dr7 | = 0x00000004;
status = 1;
}
else if(!ctx.Dr2)
{
ctx.Dr2 = MakePtr(ULONG, address, 0);
ctx.Dr7 | = 0x00000010;
status = 2;
}
else if(!ctx.Dr3)
{
ctx.Dr3 = MakePtr(ULONG, address, 0);
ctx.Dr7 | = 0x00000040;
status = 3;
}
else
status = -1;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
SetThreadContext(hThread, &ctx);
CloseHandle(hThread);
}
while(Thread32Next(thSnap, &te));
return status;
}

Висновок

Як бачиш, навіть у найскладніших ситуаціях можна знайти можливість виконати свій код. Впевнений, що при цьому твій код націлений виключно на вирішення завдань захисту твоєї системи. Удачі тобі та вдалого компілювання!

Links

http://vx.netlux.org - своєрідний музей вірусів, вірусних движків та іншої цікавої нісенітниці. Must visit, одним словом.