Набор статей и руководств по дизассемблеру IDA

         

Ida.key



00000054 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


00000070 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


0000008C FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


000000A8 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


000000C4 FFFF FFFF FFFF FFFF FFFF                                            .........

Следующий блок вставляется в создаваемые Вами IDB файлы и не используется в проверках целостности.  Его тоже можно деперсонифицировать.


 



000000F0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


0000010C FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


00000128 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................


00000144 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF ............................

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

В результате, несмотря на удаление всей шифрованной регистрационной информации, IDA 4.01 тем не менее продолжает нормально работать и не показывает ее больше нигде, в том числе *.ASM и *.LST, а встроенная в IBD базы лицензия больше не воспроизводится.

ОДНАКО, осталась еще небольшая проблема. Начните декомпилировать большую программу.  Сначала все идет хорошо, но в конце работа прерывается сообщением, что "программа превысила допустимые пределы" (execution flows beyond limits) или ему подобным.  Но если вы возвратите исходный неисправленный ida.key, то все заканчивается нормально.  Что же случилось?

Вернем нормальный ключ в директорию IDA.  По окончании процедуры декомпиляции существует последняя проверка целостности ключа, одна из тех, которые трудно обнаружить.  Как я сам нашел ее?  Я проследил программу до следующего фрагмента:

001B:10077848  E83B020000        CALL    10077A88


001B:1007784D  85C0              TEST    EAX,EAX  <-- остановимся здесь


001B:1007784F  7C09              JL      1007785A <-- исправить на 'nop'


001B:10077851  0FBE4610          MOVSX   EAX,BYTE PTR [ESI+10]

Если установить в этом фрагменте прерывание 'bpmb 1b:10077848 x' и загрузить idag.exe, то до момента окончания процедуры декомпиляции это прерывание произойдет 5 раз.  По окончании выполните команду 'd esi' и увидите в окне данных расшифрованную регистрационную информацию в виде "= имя, дата, ...мусор...".  Если теперь в памяти изменить лицензионные данные на что-либо еще, то в конце второй попытки декомпиляции возникнет та самая ошибка.

Проверка происходит именно здесь - в расшифрованном ключе.  Да, мы исправили код IDA, однако, регистрационная информация хранится в памяти и используется повторно.  Если Вы хотите все сделать самостоятельно, то запаситесь временем и терпением, эта информация копируется в памяти из области в область (около 300 раз!), прежде чем будет проверена.  Вам придется ставить контрольные точки 'bpmb' в памяти на регистрационную запись и удалять их, как только эти данные будут скопированы в новое место.  Я использовал другие хитрости, здесь не описанные, однако, если Вы терпеливы, то и этот метод прекрасно срабатывает.  В конце концов мы оказываемся в участке кода IDA.WLL, где регистрационная информация уже больше никуда не копируется и где происходит ее окончательная проверка.

0008:10013318 53                 PUSH    EBX





0008:10013319 56                 PUSH    ESI

0008:1001331A 57                 PUSH    EDI

0008:1001331B 55                 PUSH    EBP

0008:1001331C 51                 PUSH    ECX

0008:1001331D E876FFFFFF         CALL    10013298

0008:10013322 84C0               TEST    AL,AL                 <- Вы оказались здесь

0008:10013324 0F858E000000       JNZ     100133B8

0008:1001332A A1CF930910         MOV     EAX,[100993CF]

0008:1001332F E8AC080000         CALL    10013BE0

0008:10013334 33D2               XOR     EDX,EDX

0008:10013336 8AD0               MOV     DL,AL

0008:10013338 B888AA0810         MOV     EAX,1008AA88

0008:1001333D 891424             MOV     [ESP],EDX

0008:10013340 E857E1FFFF         CALL    1001149C

0008:10013345 50                 PUSH    EAX



Что можно предположить?  Если AL содержит 0, то происходит ошибка, и это случается всякий раз, когда вы удаляете из ключа регистрационную информацию.  Подпрограмма по адресу 10013298 используется и в дальнейшем, следовательно нам надо так исправить ее, чтобы она никогда не помещала 0 в регистр AL.

Чрезвычайно важно: та же самая методика будет использована для зашифрованных модулей IDA (найдите их сами).  Нам придется сделать это во всех точках, так как шифрование использует водяные знаки - я имею в виду, что везде для шифрования используется Ваша персональная информация.  Я должен поблагодарить Nolan Blender, который помог, снабдив меня CRC-кодами всех файлов его копии IDA 4.01.  Это понадобилось мне, чтобы обнаружить различающиеся файлы.  Вот их общий список:

IDAG.EXE
IDA.WLL
IDA.KEY  - куда же без него :)
все *.LDW и *.W32

В предыдущих версиях различался только IDA.KEY.  Вы же теперь сами видите, где именно использованы водяные знаки.  Я также рекомендую Вам почитать статьи по стенографии на нашем сайте, чтобы побольше узнать об этом.

В каждом из исследованных файлов, я обнаружил лишь незначительные различия между копиями Nolan'а и моей.  Это означает, что шифрованные водяные знаки, которые IDAG.EXE расшифровывает в время загрузки и инициализации модуля, невелики по размерам.
 


Содержание раздела