Методы кодирования данных — Abzac


PeriodicalsAbzac2006 No. 29 → Методы кодирования данных

Методы кодирования данных

Существует много способов запутать «злобного хацкера», пытающегося взломать твою программу. Однако, как было сказано в одном из номеров «Абзаца», любая программная защита может быть взломана - это только вопрос времени и умений хакера.

Но так ли это? А, может, есть способ скрыть часть данных от посторонних глаз так, что ни одна живая душа, кроме тебя, не имела к ним доступа? С этим я и попытался разобраться...

Сначала на ум приходит простенькая XOR’ка.


XORKA   ld hl,ADDR
        ld bc,lenght
        ld d,0
LAB1    ld a,d
        xor (hl)
        ld (hl),a
        inc hl
        dec bc
        ld a,b
        or c
        jr nz,LAB1
        ret

Можно, конечно, «навесить» в цикл дополнительные XOR’ы, даже используя регистр R...


R_XOR   di
        ld hl,ADDR
        ld bc,lenght
        xor a
        ld r,a
LAB1    ld a,r
        xor (hl)
        ld (hl),a
        inc l
        dec bc
        ld a,b
        or c
        jr nz,LAB1
        ei
        ret

...но у всех таких методов один большой изъян - после трассировки программы в отладчике «скрытые» данные оказываются раскодированы.

Что делать? Ввести какой-то параметр, известный только тем людям, которые имеют право на доступ к кодируемой информации. Например, пароль. Если просто вводить пароль и потом проверять его правильность, такая, с позволения сказать, «защита» очень зыбкая. При хранении правильного пароля в самой программе он становится легкой добычей. Другое дело - использовать введенный пароль для получения какого-либо дополнительного параметра XOR’ки.

Например, путем несложных математических действий из пароля «состряпать» число, которое будет являться стартовым в XOR’ке. Как вариант - убрать «xor a» в вышеприведенной R_XOR, и перед вызовом кодировщика в A помещать вычисленый из пароля параметр.

Метод хороший - чтобы получить доступ к данным, хакеру придется перебрать 256 вариантов входных параметров в процедуру раскодирования. Не у каждого на это хватит сил. Тем более, если мы будем применять неоднократное кодирование данных, взломщик поседеет, пока подберет правильные коды.

Другим вариантом может быть кодирование с использованием самого пароля, а не вычисленного из него параметра. К примеру, у нас есть пароль из 8 символов. Первый байт кода XOR’им с первым символом пароля, второй - со вторым,.. восьмой - с восьмым, девятый - снова с первым и так далее.


        ld hl,code      
        ;кодируемый блок
        ld bc,lenght        
        ;его длина
        xor a
        ex af,af'
LAB1    ex af,af'
        and a
        jr nz,LAB2
        ld de,passw     
        ;пароль
        ld a,psw_len    
        ;длина пароля
LAB2    dec a
        ex af,af'
        ld a,(de)
        xor (hl)
        ld (hl),a
        inc hl
        inc de
        dec bc
        ld a,b
        or c
        jr nz,LAB1
        ret
passw   db 
psw_len equ $-passw

Плюс - самих паролей намного больше, чем вычисленых из них кодов. Минус - если в исходном коде встретится подряд 8 нулевых байт, то после кодирования на этом месте будет лежать сам пароль (и есть вероятность, что хакер его заметит). А этого нам не хочется... Выход из минуса - сначала заXOR’ить блок программой R_XOR, а уж потом - паролем. Теперь вражеский взломщик точно сломает себе мозг, пытаясь пробраться в VIP-зону твоей программы! Для еще большей надежности можно ввести CRC - контрольные сумму для заXOR’еного R_XOR блока. После ввода пароля мы разXOR’иваем им блок и проверяем CRC. Если он совпал - все нормально, а если нет - пароль не верный, заXOR’иваем блок обратно и просим ввести правильный пароль.