Часто программисты, чтобы
защитить свои программы, идут на разного рода
ухищрения. И думаю, без знания этих
ухищрений ничего более менее серьёзного
сломать нельзя. Я тут не буду рассказывать о
защитах, построенных на чистой математике -
это очень утомительно, я расскажу о том, как
программисты ставят нам палки в колёса,
когда мы начинаем отлаживать программы.

Метод #1 "Замер времени
исполнения контрольного участка программы"

Суть защиты в том, чтобы
проконтролировать процесс трассировки с
помощью замера времени исполнения кода; это
делается примерно так:

var
p1,p2:integer;
begin
p2:=0;
p1:=meml[0:$046C];
while meml[0:$046C]=p1 do; {делаем для
получения следующего 55 миллисекундного
интервала}
while meml[0:$046C]<>p1+2 do
inc(p2);
if p2<1000 then writeln('Попался,ты
трассируешь программу');
end.

Как обойти эту защиту, говорить
не буду, уж больна она проста и прозрачна
после деассемблирования.

Метод #2 "Блокировка
клавиатуры"

Суть защиты установить на
вектор 09 свою подпрограмму обработки
прерывания. Это можно сделать так:

uses Dos;
var
p1:pointer;
procedure newvec;assembler;
asm
{Пишем любой код,который будет
выполняться при клацаньи по клаве}
end;
var
p3,p4:longint;
begin
swapvectors;{Чтобы какая-нибудь
подпрограмма не вклинилась}
getintVec($9,p1);{Сохраняем старый
вектор}
setintVec($9,@newvec);{Ставим новый}
for p3:=1 to 30000 do{Задаём цикл}
inc(p4);
setintvec($9,p1);{Если нажатия не было
помещаем в на 9 прерывание старую
подпрограмму}
writeln('Всё чисто');
end.

Эту защиту можно очень легко
обойти так: отследить, когда выдаётся
предупреждение. И далее, увидев ни к чему не
обязывающий цикл, поставим после него Breakepoint
и спокойно запишем старый вектор.

Метод #3 "Определение точек
останова"

Итак часто программисты
прибегают к обнаружению точек останова на
функции, которые мы все широко используем:
ShowWindow,MessageBoxA, MessageBoxIndirectA, CreateWindowExA и т.д. Давайте рассмотрим пример,
который ловит breakpoint на функцию CreateWindowExA

extrn @checkcrc$qv:far
extrn CreateWindowExA:far ;наша функция
public checkdeb
WINAPI checkdeb(void);
checkdeb proc near
push esi ;используемые регистры в
стек
push ds
push cs
pop ds;настраиваем ds
lea esi,CreateWindowExA;Настраиваем
исполнительный адрес
mov esi,[esi+2]
mov eax,[esi] ;берём 1 байты
and eax,0ffh
cmp eax,0CCH;собственно и есть нужное
нам сравнение
mov eax,100h
je p1;Если правда,то на метку p1
xor eax,eax
p1:
pop ds
pop esi
ret ;уходим от сюда если всё OK то 0
checkdeb endp
PS

Как видите, все проверки
тривиальны и, зная основные ухищрения
программеров, можно избежать нервотрёпки,
бессонных ночей и ругани с
подругой.

Оставить мнение