Кіріспе
Операциялық жүйені өзгерту әдістері Компьютерлік бағдарламалауда "құю" термині операциялық жүйенің, қолданбалардың немесе басқа бағдарламалық компоненттердің мінез-құлқын функция шақыруларын немесе бағдарламалық компоненттер арасында жіберілетін хабарларды немесе оқиғаларды тұтқындау арқылы өзгерту немесе кеңейту үшін қолданылатын әдістердің кең ауқымын қамтиды. Мұндай функцияларды, оқиғаларды немесе хабарламаларды қолға алған кодты ілгек деп атайды. Айналымдық кластағы жалпы кодты субкластағы бапталған кодпен кеңейтуге болатын Шаблон әдісі үлгісінде ілмекті әдістер ерекше маңызды. Бұл жағдайда әрбір ілгек әдісі абстрактілі класта бос іске асырумен анықталады, бұл әр нақты кіші класта әр түрлі іске асыруды қамтамасыз етуге мүмкіндік береді. Құрастыру көптеген мақсаттарда, соның ішінде жөндеу және функционалдылықты кеңейту үшін қолданылады. Мысалға, қолданбаға жетуден бұрын пернетақта немесе тышқан оқиғасы туралы хабарламаларды немесе пайдалануды бақылау немесе қолданбаның немесе басқа компоненттің қызметін өзгерту үшін операциялық жүйелік шақыруларды ұстап алуды жатқызуға болады. Ол сондай-ақ стандарттау бағдарламаларында кеңінен қолданылады, мысалы, 3D ойындарындағы кадр жылдамдығын өлшеу, онда шығыс пен кіріс ілмектер арқылы жасалады. Құрастыруды зиянды код та пайдалана алады. Мысалы, руткиттер, өздерін көрінбеуге тырысатын бағдарламалық жасақтамалар, басқа жағдайда олардың бар екендігін ашатын API шақыруларының шығысын жасамалау арқылы, көбінесе ілмектеу әдістерін қолданады.
In computer programming, the term hooking covers a range of techniques used to alter or augment the behaviour of an operating system, of applications, or of other software components by intercepting function calls or messages or events passed between software components. Code that handles such intercepted function calls, events or messages is called a hook. Hook methods are of particular importance in the Template Method Pattern where common code in an abstract class can be augmented by custom code in a subclass. In this case each hook method is defined in the abstract class with an empty implementation which then allows a different implementation to be supplied in each concrete subclass. Hooking is used for many purposes, including debugging and extending functionality. Examples might include intercepting keyboard or mouse event messages before they reach an application, or intercepting operating system calls in order to monitor behavior or modify the function of an application or other component. It is also widely used in benchmarking programs, for example frame rate measuring in 3D games, where the output and input is done through hooking. Hooking can also be used by malicious code. For example, rootkits, pieces of software that try to make themselves invisible by faking the output of API calls that would otherwise reveal their existence, often use hooking techniques.
Әдістер
Әдетте ілгектер бағдарламалық жасақтама орындалып жатқан кезде енгізіледі, бірақ ілгек салу - бұл қолданбаны бастамас бұрын да қолдануға болатын тактика. Бұл екі әдіс төменде егжей-тегжейлі сипатталған.
Қайнар көзді өзгерту
Құрастыруға бағдарламаны іске қосу алдында орындалатын файлдың немесе кітапхананың көзін кері инжиниринг әдістері арқылы өзгерту арқылы қол жеткізуге болады. Бұл әдетте функцияның қоңырауларын бақылау немесе оларды толығымен ауыстыру үшін қолданылады. Мысалы, бөлшектеуші арқылы модульдегі функцияның кіру нүктесін табуға болады. Одан кейін оны басқа кітапхана модулін динамикалық жүктеу үшін өзгертуге болады, содан кейін ол жүктелген кітапханада қажетті әдістерді орындайды. Егер қажет болса, тағы бір ұқсас тәсіл, ол арқылы ілесуді жүзеге асыруға болады, ол орындалатын файлдың импорт кестесін өзгерту арқылы. Бұл кесте қосымша кітапхана модульдерін жүктеу үшін, сондай-ақ қолданба функцияны шақырғанда қандай сыртқы кодты шақыратындығын өзгерту үшін өзгертілуі мүмкін. Функцияларды ілудің баламалы әдісі - wrapper кітапханасы арқылы функцияларды шақыруды ұстап алу. Wrapper - бұл бағдарлама жүктейтін кітапхананың нұсқасы, ол орнататын бастапқы кітапхананың барлық бірдей функциялары бар. Яғни, барлық қол жетімді функциялар түпнұсқа мен ауыстыру арасында бірдей. Бұл wrapper кітапханасын бастапқы кітапхананың кез келген функционалдығын шақыру үшін немесе оны логиканың мүлдем жаңа жиынтығымен ауыстыру үшін жобалауға болады.
Орындау уақытын өзгерту
Операциялық жүйелер мен бағдарламалық қамтамасыз ету орындалу кезінде оқиғалық ілгектерді оңай енгізуге мүмкіндік береді. Бұл ымдарды орнату процесіне жеткілікті рұқсат берілген жағдайда қол жетімді. Мысалы, Microsoft Windows пайдаланушыларға диалогтар, жылжыту жолақтары мен мәзірлер мен басқа да элементтер үшін жүйелік оқиғалар мен қолданбалық оқиғаларды өңдеуге немесе өзгертуге арналған ілмектерді енгізуге мүмкіндік береді. Сонымен қатар ол ілмекке пернетақта мен тышқан оқиғаларын енгізуге, алып тастауға, өңдеуге немесе өзгертуге мүмкіндік береді. Linux NetFilter арқылы ядродағы желілік оқиғаларды өңдеу үшін ілгектерді ұқсас түрде қолдануға болатын тағы бір мысал береді. Мұндай функционалдық қамтамасыз етілмеген жағдайда, тіркелудің арнайы түрі процестер жасаған кітапхана функцияларын шақыруды тұтқындауға арналған. Функцияларды ілу мақсатты функцияның алғашқы бірнеше кодтық нұсқауларын инъекцияланған кодқа көшу үшін өзгерту арқылы жүзеге асырылады. Ортақ кітапханалық тұжырымдаманы қолданатын жүйелерде үзіліс векторлы кестесі немесе импорт дескрипторлы кестесі жадында өзгертілуі мүмкін. Негізінде бұл тактикалар бастапқы кодты өзгерту идеясын қолданады, бірақ оның орнына процесстің жадында орналасқан нұсқаулар мен құрылымдарды өзгертеді.
Linux жүйесі
Студенттік зерттеу жобасы, ол суреттеуді пайдаланады. Бағдарламалық жасақтаманың бір бөлігіне басқа процестің орындалуын бақылауға және басқаруға мүмкіндік беретін функционалдық. LD PRELOAD-ты ортақ кітапханалық қоңырауларды қосу үшін пайдалану.
Emacs
Emacs Hooks Құрамында Emacs-ті баптаудың маңызды механизмі бар. Құс - белгілі бір нақты жағдайда шақырылатын функциялардың тізімін қамтитын Lisp айнымалысы. (Бұл ілгекпен жүгіру деп аталады.)
OS X және iOS
Cydia Substrate - jailbroken iOS құрылғылары үшін фреймворк, ол әзірлеушілерге кез келген басқа фреймворкке немесе қосымшаға қосылуға мүмкіндік береді. harpoon - орындалу уақытында функцияларды жалғау үшін OS X кітапханасы.
Терең API-ге қосылу
x86 API Hooking x86 архитектурасы үшін әртүрлі API Hooking әдістері туралы мақала.