Нақты режим бұзушыларына қарсы күрес
Бұзушының зерттеуінен қорғанудың екі тәсілі бар:
- бұзушыны анықтау және басқаруды бұзушыға қарсы бұтақ реакциясына беру;
- код фрагменттерімен бағдарламаны «қоқыстау», олар бұзушысыз қалыпты жұмыс істейді, ал бұзушы бар кезде апаттық жағдайға, компьютердің дұрыс жұмыс істемеуіне немесе бағдарламаның орындалу барысының бұрамлануына әкеледі.
Бұзушыны анықтау.
Нақты режим бұзушыларын анықтау жетерліктей оңай. Оларды анықтаудың екі негізгі тобын атап айтуға болады:
- процессордың аппараттық ерекшеліктерін қолдану, әсіресе командалар тізбегінің бары, сонымен бірге кейбір нұсқауларды орындағаннан кейін трассирлі үзудің жоғалуы;
- операциялық ортаның өзгеруін үзу векторын тексеру жолымен, Бағдарламаның жеке бөліктеріне кеткен уақытты тексеру, Бағдарламаны жіберу кезінде регистлердің алғашқы жағдайын тексеру және т.с.с. анықтау.
Бұзушылар комьютердің мынадай ресурстарын қолданады: INT1 сияқты үзулерді, INT 3 және TF трассировка жалауы. Мұның бәрі қорғалатын бағдарлама бұзушының зерттеуін анықтау үшін қолданылуы мүмкін. Мәселе мынада, Intel 80x86 сияқты процессорлар бір команданың трассировкасын «жоғалтады», егер оның алдындағы команда сегмент регистрінің мәнін өзгерткен болса, бұзу процесіндегі TF трассировкасының жалауының орнатылғандығын анықтауға болады.
486 тобындағы процессорларда бұзушыны команданы алдын ала таңдау буферін қолданып білуге болады. Таңдалған және сол тізбекте орналасқан команда кодының өзгеруі бағдарламаның орындалу барысына әсер етпейді.
Бұзушыны анықтаудың келесі тәсілін тек нашар сапалы бұзушыларға қарсы қолданамыз, мәселен CodeView немесе Turbo Debugger. Ол мынаған негізделген: бағдарламаны жүктеу барысында анықталған түрде регистрлердің инициализациясы жүреді. Бағдарламаны бұзушыға зерттеу аз емес қууларды міндетті етеді. CodeView және TD бірінші қуу кезінде AX, BX, CX, DX, SI, DI, BP регистрлерін нөлдейді. Екінші қуу кезінде CodeView бұл регистрлерді тағы да нөлге теңестіреді, ал Turbo Debugger алдындағы қуудан қалған «қоқысқа» мүлдем тиіспейді. Бағдарлама басында регистрлердің мәнін керектілермен салыстырып, бұзушыны анықтауға болады.
Нақты режимде бұзушының барында бағдарлама жұмысының бұрмалануы.
Бұған бірнеше тәсілдерді атап кетуге болады:
- контрольді нүктенің құрылуына және бағдарлама кодының өзгеруіне қарсы әрекет жасау;
- қолданушымен бірге интерфейстің бұзылуы, мысалы, пернетақтаны блоктау арқылы экранға нәтижені бұрмалау;
- код учаскесінің генерациясы, шифрлау, жүйені қорғаудағы басқа да қысқа бағдарламаларды шақыру сияқты жауакершілікті талап ететін әрекеттерді жүзеге асыру үшін бұзу (кейде тек бұзу ғана емес) үзулерін қолдану;
- орындалатын код аймағында стекті анықтау және оны бұлжытпай ауыстыру.
Қорғалған режим бұзушыларымен күрес
Кейбір бұзушылар (қорғалған режимді) режимді қорғауға арналған арнайы бұзуға қарсы трюктерге түсіп қалады. Бұзушыларға арналған тағы бір тәсіл олардың ұсынатын АРІ-ге негізделген. Мәселен, DeGlucker, API no INT 15h (OFFxx функциясы)-ды ұсынып, конструкцияда мәңгі тұрып қалады.
mov ax, OFFOlh
int 15h
Ал қорғалған режимді бұзушылармен күрестегі үшінші тәсіл аппараттық бұзу құралдарының жағдайын нашарлату болып табылады. Мәселен, бағдарламаның трассировкасы үшін DR1 регистрі қолданатыны бізге белгілі. Әрине, онда оның не мәнін, не DR7 регистріндегі басқаратын биттердің мәнін дұрыс көрсетпейтіндей етуге болады. Алайда қазіргі кезде бұзу регистрлерін бұзушылардың (DeGlucker 0.05) өздері де қолданады, ал бұзылатын бағдарламаға оларды қолдандырмайды.
Соңғы төртінші топқа қарсы күрес – бұзушылардың нақты қателіктеріне негізделген.
«Ерекшеленген» бағдарламалау
Қорғауды жасаушының міндеті – қарсыласының бұзуға кететін уақытын көбейту. Сонымен бірге, бағдарламаны тексеруді қиындату.
Ол үшін бізге жоғары сапалы, бірақ дизассемблер түрінде түсініксіздеу, ал бұзушыға шартты және шартсыз өту теруінде былықшылық көзқарасындағы бағдарлама жасау керек. Мұндай әрекет «нәзік» бағдарламалауды қолданғанда шешіледі.
Бірнеше негізгі бағыттарды бөліп көрсетуге болады:
- экзотикалық, процессордың немесе оның стандартты емес сәйкестіктерінің жиі кездеспейтін командаларын қолдана отырып, ерекше түрдегі алгоритм жасау;
- бір алгоритмдегі бірнеше толық эквивалентті нұсқаларды реализациялау, оған әрбір қатынау кезінде оны реализациялаудағы нұсқалардың біреуі алынады;
- коданың қоқысталуы – біздің мәліметтерді өңдеуде еш әсерін тигізбейтін командалар.
Бұл тәсілдермен жақынырақ танысайық.
Алгоритмдерді экзотикалық жүзеге асыру. Мәселен, бізде бір жалау бар делік (немесе айнымалы) және оған 0-ге тексеру өте қажет. Бірақ біз СМР АХ,0 командасын анық жазғымыз келмейді, немесе мүлдем басқаруды беру командаларын мүмкіндігінше қолданудан айналып кетпекпіз.
Ең бірінші 0-ге тексерудегі анық емес командаларды қолдану ойға келеді. Мысалы, екілік-ондық арифметикадағы командаларды қолдану:
Мысалы,
mov ax, OurFlag
daa
pushf
pop ax ; нөлдік жалаудың анық емес тексеруі
and ax, 40h
jz FlagIsZero
Әрине, шын бағдарламада жалауды алу және нөлге анықтау сол баяғы тексеруді қиындатуда таратылуы керек. Алайда бұл нұсқа қолданбалы болса да бұзуда өте оңай болып табылады.
Эквивалентті бұтақтарды жүзеге асыру. Бағдарламаны тексеруді қиындату үшін бұл тәсілдің пайдасы анық. Шынында да, егер біз бұзушылықта болсақ, бірде бір командаға, бірде бірнеше командаға түссек, бағдарлама алгоритмін түсіну оңай болмайды.
Анализді қиындату үшін мүмкін:
- бұтақтар санын көбейту (барлық алгоритмдер үшін қолданылмайды);
- бұтақтарды үзу өңдеушілері түрінде беру (INT I, INT 3, INT 4, INT6 және т.б.) және оларға тура қатынамай, сәйкесінше жағдайларды жасау жолымен;
- кездейсоқ сандарды тексерудің санын көбейту.
Кодты қоқыстау. Кодты қоқыстау мағынасында оған командаларды қолдан енгізу деп білеміз, ол командалардың орындалатын алгоритмге еш қатысы болмайды және олар алгоритмнің анализін не қиындатады, не ол анализді күрделендіреді, сәйкесінше оған көбірек уақыт әрі күш керек.
Бұл жерде әрекетсіз регистрлерді манипуляциялау; кейбір жалаушарды құру не алып тастау, бұл жалаушаларға еш қатысы жоқ бірнеше командаларды орындау келесіде шартты өтумен, ал оның өзі шын мәнінде орындала ма, орындалмай ма белгісіз; бірдей құрылымды өңдеу, олардың біреуінде ғана біздің алгоритмнің мәліметтері болады және т.б. бұның бәрі тек дизассемблерленген мәтіннің көлемін ғана көбейтпейді, сонымен бірге қорғалатын алгоритмнен көңілді бөледі.
Дәріс 8. Криптографиялық ішкі жүйелерді іске асырудың әдістері
Достарыңызбен бөлісу: |