Жаңа құрылатын программаларды қоғау.
Зақымдалмаған программа туралы кілттік ақпаратты (қысқартсақ, кілт) бөлек файлда сақтауға болады. Бірақ сонда әр түрлі жағдайларда (программаны көшіргенде, керек емес деп санап, қателесіп оны өшіру) осы (толықтауыш) кілт-файлды жоғалтып алу қаупі бар. Сондықтан ең тиімдісі- ең қорғалынатын файлдың денесінде кілтті сақтау. өкінішке орай оны файлдың соңына апаруға болмайды, өйткені зақымдалған жағдайда вирус PartPag және PageCnt аймақтарын өзгертеді де біз оның файлдағы орналасқан орнын ешқашан анықтай алмаймыз.
Бүкіл тұрақтылардың бәрі (типтелгендері де) программаның компиляция кезінде жасалынады, осылай файлда бұл тұрақтылардың міндерін сақтайтын аумақ міндетті түрде бар болады.ТР-да бұл аумақ файлдың жүктеуші бөлігінің ең соңында орналасады.(2-сурет)
Сурет-2.жүктеуші программа үшін жадыны ұйымдастыру.
Яғни біз кілтті сақтау үшін керекті (кілттің бастапқы координаталарын) тұрақтыны программада тағайындаймыз, одан кейін файлдың аумағына,дәлірек айтсақ көрсетілген координатадан басталатын аумағында керекті ақпаратты орналастырамыз.
Сонда осындай сұрақ туындайды: ехе файлда кілт орналасатын аумақты қалай табамыз. Бүкіл жауаптарының арасынан ең тиімдісі болып файлдың басынан бастап кілтке дейінгі ығысуды ессептеу.
Бұл үшін файлдағы мәліметтер аумағының басталатын жерін анықтау керек. Файлдың бастапқы жазуында DS регистрінің бастапқы мәні туралы ешқандай ақпарат берілмейді. Программаға басқаруды беруге дейін жүктеуші программалық сегменті (PSP) префиксінің басталуын көрсететіндей етіп бұл регистрдің мәнін қояды, онда іске қосылған программаның өзі оны керекті кейпіне орналастырады.
PSP-нің ұзындығын 256 байт(16 параграф) құрайды және жүктелетін программаның алдында жедел жадыда жүктеушімен орналастырылады. PSP-де әр түрлі қызметтік ақпарат сақталынады, ол DOS және жұмыс істейтін программа үшін маңызды (мысалы, PSP-де программаға қатынасу үшін керекті рараметрлер сақталынады), бірақ онда DS регистрінің құрамы туралы ештеңе көрсетілмейді. Осылай мәліметтер аумағының басталуын табуды өте қиын.
Жұмыс істеп жатқан программада бұл аумақтың басталуын табуға болады- бұл үшін DSEg стандартты функциясы қарастырылған мәліметтер сегментінің номерін қайтарады.
Сонымен қатар, MS-DOS-тың құрамын PSP сегменті туралы ақпарат алуға мүмкіндік беретін $62номері бар функция кіреді,одан жүктелген программа басталады. Бұл ақпарат ВХ регистрінде сақталынады. Одан кейін DSEg- ВХ айырмасын есептей отырып файлдағы аймақты анықтуға болады, дәлірек айтсақ мәліметтер облысы басталатын адресті анықтаймыз.
Керекті тұрақтыны табу үшін екі тәсілді қарастыруды болады:
1-тәсіл.ТР мәліметтер облысында тұрақтыларды программада баяндау реті бойынша орналастырады. Әр тұрақтының өлшемін және баяндау тәртібін біле отырып, бізге керекті типтелген тұрақтының орналасқан орнын есептеп алуға болады. Бірақ бұл тәсіл әмбебап қорғау үшін жарамайды. Өйткені, тұрақтының баяндалу реті программадан программаға ауысқанда өзгеріп отырады.
2-тәсіл.Бізге керекті тұрақтыны табу үшін @ операциясын пайдаланамыз. Оның нәтижесі көрсеткіш (төртбайттық адрес) – ол құрайтын адрестің ығысуы және бізге керекті мәліметтер облысына қатысты кілт бастамасының ығысуы болып саналады.