Welcome to The Passion Of Code Laboratory!!!Статьи

Взлом IDA Pro Demo

Автор: FreeMan / TPOC

Введение.

Прочёл я о замечательной проге, которая называется IDA. Ну и как каждый нормальный человек (спорный вопрос, прим. Bill Prisoner) я решил посмотреть эту софтину. По описанию это был крутой дизассемблер. Я дизасмом пользуюсь редко, но было сказано, что он запросто запускается под линухом через Wine. Так как к этому времени я не нашёл хорошего дизассемблера под моего тукса, я решил взять этот. Полез в инет и сразу нашёл IDA 4.8. Но это оказалась демо-версия ? ограничения такие: работаем только некоторое время, дизассмим только ЕХЕ-РЕ файлы, пункты меню Save, Save as заблокированы. Но я не растерялся. Я полез в инет поискать какую-нибудь крякалку. Зашел на несколько сайтов, но там были крякалки для старых версий, либо при загрузке страницы сайта мне пытались отдать коллекцию троянов. Сначала я слегка расстроился, но решил присмотреться к софтине. Действительно, дизассемблер жутко навороченный, файлы типа ЕХЕ-РЕ хавал и не давился. Но ведь нужно не только РЕ. И в этот момент, на протяжении семи вдохов, я принял решение сломать аццкую сотону. Первым делом я попытался сломать IDA, исспопод льзуя IDA ?. Но было выведено сообщение о том, что демо-версия сама себя ломать не будет. Чтож. «Простив лома нет приёма, если нет другого лома». С этими словами я запустил OllyDbg – проверенный дебагер. Жму F3 открываю idag.exe, который находится в папке, куда мы установили IDA. Получаю сообщение о том, что у файлика Entry Point далеко за кодом, что, возможно, это самораспаковывающийся или самомодифицирующийся файл.

Процесс.

Итак, пришло время рассказать тебе, как сломать такую простенькую защитку. Перед тем, как совершать судорожные движения, я решил посмотреть, что думают люди об упаковщиках. Советую и тебе не полениться и перед тем, как что-то делать посмотреть, не сделал ли кто-нибудь это до тебя (незачем изобретать велосипед). Оказалось, что снять упаковщик может любой желающий. Достаточно поискать что-то похожее на это:

popad ; восстановить начальные значения регистров.
push EP
retn; прыгнуть на начало программы

Чтож, теперь видно, что тебе нужно поискать, скажем, popad. Смело дави ctrl+f. Вбивай popad. Popad имеет опкод 61h, этот байт встретится несколько раз в составе других команд. Нажимая ctrl+l пропускай неверные результаты и вскоре попадёшь на такую последовательность:

007AE3AF 61 POPAD
007AE3B0 75 08 JNZ SHORT idag.007AE3BA
007AE3B2 B8 01000000 MOV EAX,1
007AE3B7 C2 0C00 RETN 0C
007AE3BA 68 00000000 PUSH 0
007AE3BF C3 RETN


Это то, что надо, ведь тут и popad, и push, и retn. А значит пришло время ставить бряк. Бряк на команду POPAD. Для этого ставь туда указатель (левым кликом) и жми f2. Теперь надо прогнать прогу до этой команды, а для этого надо жать f9. И происходит чудо. Кусок памяти превращается в:

007AE3AF 61 POPAD
007AE3B0 75 08 JNZ SHORT idag1.007AE3BA
007AE3B2 B8 01000000 MOV EAX,1
007AE3B7 C2 0C00 RETN 0C
007AE3BA 68 50164000 PUSH idag1.00401650; !!!!!!!!!!!!!!!!!!!!!!!!!!!!
007AE3BF C3 RETN


Теперь ты видишь, что расспакованная прога будет начинаться с адреса 00401650. Если отнять базу образа (400000h), то получиться RVA точки входа в расспакованный код (1650). Чтож, ты сделал очень много, положил упаковщик на лопатки, осталось добить. Но это легче. Ставишь указатель на retn, нажимаешь пробел, вводишь jmp 007AE3BF, тем самым зацикливая прогу. И тут на сцену выходит LordPE. Эта прога умеет делать снимок памяти проги. А ведь ИДА сейчас висит в бесконечном цикле, а её главная часть расспакована, а значит можно заполучить эту распакованную часть. В LordPE клик правой кнопкой мыши на процессе. В появившемся меню выбираешь “dump full”. Сохраняешь образ. Теперь у тебя есть расспакованный файл. Но если его попытаться запустить то просто вылезет сообщение об ошибке. Это связано с тем, что появились проблемы с точкой входа и таблицей импорта, которую заполнял распаковщик.
Качай Import Reconstructor. Запускай idag.exe. Главное запустить не образ, сделанный с помощью LordPE(он выдаёт еррор), а именно idag.exe. Запускай Import Reconstructor. Выбери процесс Иды. В строку OEP введи 1650 (это рва точки входа). Жми IAT AutoSearch. Вылезет сообщение о положении таблицы импорта. RVA=229000, size=5000. Вводишь эти значения в соответствующие поля. Жмёшь GetImports. Программа выдаёт кучу записей импортов. Но многие помечены “NO”. Их надо убрать. Жмём ShowInvalid (показать инвалидов). Теперь правый клик по любому из выделенных импортов и в меню выбираем Delete Thunk(s)


Тепрь тебе следует исправить покалеченный распакованный образ, нажимая Fix Dump и выбирая расспакованный файл. Получаешь работоспособный расспакованный файл. Если это кажеться для тебя слишком, сложным, то это тебе только так кажеться.
Теперь можно приступать непосредственно к исследованию и исправлению IDA. Eсли запустить полученный файл (у меня ххх_.ехе), то можно немного посмотреть на то, как работает прога. Кстати ххх_.ехе запросто смог себя задизасмить, но священный idag.exe не тронул, сказал, что это itself. Так вот, главная наша проблема – это то, что прога дизасмит только ехе-ре. Посмотри, что получиться, если попытаться скормить ей что-то другое.. Получишь сообщение.


Это очень хорошая зацепка. Открываешь расспакованную иду в олли. Переходи в окно дампа, пресс ctrl+b и вводишь пару слов из сообщения. Я взял слова The demo. Нажимаешь ОК. В результате поиска найдена строка. В отладчике выглядит примерно так:
 

005EBDF5 49 44 45 20 4E 4F 4E 45 0A 53 6F 72 72 79 2C 20 IDE NONE.Sorry,
005EBE05 74 68 65 20 64 65 6D 6F 20 76 65 72 73 69 6F 6E the demo version
005EBE15 20 77 69 6C 6C 20 6E 6F 74 20 64 69 73 61 73 73 will not disass
005EBE25 65 6D 62 6C 65 20 69 74 73 65 6C 66 0A emble itself

...


Ниже строка
 

005EBE65 25 73 20 69 73 20 6E 6F 74 20 61 20 76 %s is not a v
005EBE75 61 6C 69 64 20 50 45 2F 45 4C 46 20 66 69 6C 65 alid PE/ELF file
005EBE85 2E 0A 54 68 65 20 64 65 6D 6F 20 76 65 72 73 69 ..The demo versi
005EBE95 6F 6E 20 63 61 6E 20 6F 6E 6C 79 20 64 69 73 61 on can only disa
005EBEA5 73 73 65 6D 62 6C 65 20 50 45 2F 45 4C 46 20 66 ssemble PE/ELF f
005EBEB5 69 6C 65 73 0A 54 6F 20 6F 62 74 61 69 6E 20 74 iles.To obtain t

...


А это и есть то, что тебе нужно. Правый клик на начале строки «%». В контекстном меню выбираем Breakpoint>Memory, on access. Этот бряк сработает тогда, когда что-то попытается к этому куску памяти обратиться. Теперь переходи в главное окно и нажимай f9 для выполнения проги. В проге открывай файл (не ре-ехе, можно взять текстовый файл). Прога останавливается. Переходи в олли и увидишь, что прога остановилась на:
 

005BC660 /$ 55 PUSH EBP
005BC661 |. 8BEC MOV EBP,ESP
005BC663 |. 56 PUSH ESI
005BC664 |. 57 PUSH EDI
005BC665 |. FC CLD
005BC666 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
005BC669 |. 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
005BC66C |. 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
005BC66F |> 49 /DEC ECX
005BC670 |. 78 08 |JS SHORT xxx_.005BC67A
005BC672 |. AC |LODS BYTE PTR DS:[ESI]
005BC673 |. AE |SCAS BYTE PTR ES:[EDI]
005BC674 |. 75 08 |JNZ SHORT xxx_.005BC67E
005BC676 |. 84C0 |TEST AL,AL
005BC678 |.^75 F5 \JNZ SHORT xxx_.005BC66F
005BC67A |> 33C0 XOR EAX,EAX
005BC67C |. EB 05 JMP SHORT xxx_.005BC683
005BC67E |> 1BC0 SBB EAX,EAX
005BC680 |. 83C8 01 OR EAX,1
005BC683 |> 5F POP EDI
005BC684 |. 5E POP ESI
005BC685 |. 5D POP EBP
005BC686 \. C3 RETN

Видно, что указатель находится в какой-то процедуре. Следует найти то место, откуда эта процедура вызывается.
Открою огромный секрет – адрес возврата помещается в стэк при вызове процедуры. Поэтому посмотри туда внимательно.

0012B488 |0041EBE1 RETURN to xxx_.0041EBE1 from xxx_.005BC660
0012B48C |005EBE68 ASCII "%s is not a valid PE/ELF file. The demo version can only disassemble PE/ELF files To obtain the full version which can disassemble many other file formats please visit http://www.datarescue.com"
0012B490 |005DC2B3 ASCII "TITLE "

Видишь адресс возврата из подпрограммы? Return в переводе с ламериканского переводиться как Возврат. Жми ctrl+g и вводи 41EBE1, для перехода на этот адрес (или Enter, когда укзатель на адресе). Смотри, куда попал.

А нового практически ничего нет, ты просто попал в очередную подпрограмму. Чтож, надо узнать откуда она вызываеться. Поставь бряк на её начало (установить курсор и нажать f2), а бряк с куска памяти убери (в контекстном меню Breakpoint>Remove memory breakpoint). Жми f9, в ИДЕ получишь знакомое сообщение. Давай делать очередной удар головой об эту стену. Открывай файл ещё раз. Иди в олли. Прога остановилась на бряке. Смотри стек

0012B8FC 004D3C6B RETURN to xxx_.004D3C6B from xxx_.0041EB0C

Снимаешь текущий бряк. Иди на… 4D3C6B, там очередная подпрограмма. Ставишь бряк на начало, f9, опять сообщение, опять открываем, опять срабатывает бряк… Так тебя будет обламывать несколько раз. Повторяй шаманские движения, пока не увидишь, что то похожее на:

0045E762 |. 85C9 TEST ECX,ECX
0045E764 |. 75 44 JNZ SHORT xxx_.0045E7AA
0045E766 |. FFB5 CCFEFFFF PUSH DWORD PTR SS:[EBP-134] ; /Arg2
0045E76C |. 68 4DBE5E00 PUSH xxx_.005EBE4D ; |Arg1 = 005EBE4D ASCII "ICON WARNING AUTOHIDE NONE %s is not a valid PE/ELF file. The demo version can only disassemble PE/ELF files To obtain the full version which can disassemble many other file formats please visit http://www.datarescue.com"...
0045E771 |. E8 7652FEFF CALL xxx_.004439EC ; \xxx_.004439EC
0045E776 |. 83C4 08 ADD ESP,8

Настораживает проверка регистра есх, ведь если есх не равно 0, тогда место вызова процедуры, откуда вызывается процедура из которой вызывается процедура…, которая вызывает процедуру, которая обращается к строке. Хм, о чём это я.. Так вот, это место перепрыгивается. Устанавливай бряк на эту проверку. Последний раз открывай файл (не ре-ехе). Попадёшь на проверку, где установлен бряк. В регистре есх 0, то есть JNZ не сработает. Чтоб избежать этого установи указатель на

0045E764 |. 75 44 JNZ SHORT xxx_.0045E7AA

Нажми пробел и вместо jnz напиши jmp. Жми Assemble. Теперь пришло время посмотреть на эффективность этого простого действия. Переходи к главному окну Олли и нажимай f9. Переходи к ИДЕ и наслаждайся – нет ругани на тему «Такого мы дизасмить не умеем». Поздравляю, первый баръер продолён, теперь его надо сохранить. Вызывай контекстное меню, жми Copy to executable>All modifications. Олли крикнет, что файл отличается от оригинала. Настаивай на том, что хочешь сохранить этот файл.
Теперь у тебя есть файл, который может дизасмить не только ехе-ре. Кстати, когда я исправлял джамп, я заметил, что выше находиться аналогичная проверка, исправив которую можно заставить демо версию задизассмить себя. Я конечно-же её пофиксил. Думаю, что и ты сможешь.

Хм. Теперь будем искать ещё какие-нибудь строки, вдруг повезёт. Но делать это надо с умом. Заметим, что Строка действительно состоит не только из самого сообщения, но ещё из пары нецензурных слов вида ICON ERROR. Их и следует поискать, ведь все ругательные сообщения имеют такой «заголовок». Идём в окно дампа ctrl+b, вбиваем ICON ERROR жмем Ок. Нажимаем ctrl+L, пока не увидим строку о каком то ограничении
 

005E0071 49 43 4F 4E 20 45 52 52 4F 52 0A 41 55 54 4F 48 ICON ERROR.AUTOH
005E0081 49 44 45 20 4E 4F 4E 45 0A 53 6F 72 72 79 2C 20 IDE NONE.Sorry,
005E0091 74 68 65 20 65 76 61 6C 75 61 74 69 6F 6E 20 76 the evaluation v
005E00A1 65 72 73 69 6F 6E 20 68 61 73 20 65 78 70 69 72 ersion has expir
005E00B1 65 64 ed

Ставь курсор на начало строки и жми ctrl+r, чтоб найти где к этой строке происходит обращение. Хм, найдено всего одно обращение. Двойной клик на результате поиска.

0043655A |. 3D F0EBDF43 CMP EAX,43DFEBF0
0043655F |. 7C 3B JL SHORT xxx1_.0043659C
00436561 |. 68 71005E00 PUSH xxx1_.005E0071 ; /Arg1 = 005E0071 ASCII "ICON ERROR AUTOHIDE NONE Sorry, the evaluation version has expired."
00436566 |. E8 E508FDFF CALL xxx1_.00406E50 ; \xxx1_.00406E50 

Знакомая ситуация – опять можно перепрыгнуть. Дерзай.

Дальше я расскажу как убрать два назойливых окна – первое выскакивает при запуске, когда сообщается об ограничениях, а второе – когда программа заканчивает работу (благодарит за использование демоверсии). Если ты устал, то лучше пойди отдохни, потому-что убирать эти окна – занятие, требующее свежести ума.

Готов? Тогда начинаем. Грузи иду в олли. Итак, опять смотри, что там в окне написанно. Ага, есть слово Version. За него и следует цепляться. Вызывай контекстное меню олли, а там выбирай Search for>All referenced text strings. В появившемся окне выбирай пункт Search for text контекстного меню. Вводи Version. Жми ок. А теперь надо найти нужную строку, для поиска следующего упоминания слова Version тебе придётся нажимать ctrl+L. Буквально спустя пару нажатий ты попадёшь на такой фрагмент, как показан на рисунке.

Чтоб вернуться из этого мира строк жми alt+c, а за тем уверенной рукой запускай прогу на выполнение. Останов в подпрограмме. Находи место вызова. Это ты уже делал (поставь бряк на начало подпрограммы). И ты оказываешься в знакомой ситуации, но немного более сложной: есть вызов (в любом случае) и есть параметр в еах.
 

00436540 |. 84C9 TEST CL,CL
00436542 |. 74 04 JE SHORT xxx1_.00436548
00436544 |> 33C0 XOR EAX,EAX
00436546 |. EB 05 JMP SHORT xxx1_.0043654D
00436548 |> B8 01000000 MOV EAX,1
0043654D |> E8 264F0300 CALL xxx1_.0046B478

В зависимости от СL в еах попадает или 1 (тогда появляется окно) либо 0 (оно не появляется). Если СL=0, то еах=1. Для того, чтоб избежать этого, надо исправить условный переход JE SHORT xxx1_.00436548. Как это сделать – думай сам. Когда придумаешь – не забудь сохраниться.

Пришло время убрать ещё одно окно – финальное. Конечно, ты, наверное, сразу полезешь искать строку… Чтож, можешь искать, но я буду убирать это окно другим способом.
Итак, запускаем прогу на выполнение и закрываем её. В результате этих действий должно появиться окно с благодарностью за использование данной демо-версии. Если его закрыть – закроется прога.
Переходи в олли. Сейчас, когда окно «висит», прога выполняется где-то в н-ной подпрограмме. твоя задача найти, где вызывается она. Для этого переходи в окно стэка и нажимай *. В окне стэка будет примерно следующее

0012F120 FFFFFFFF
0012F124 005A177A RETURN to dumped1.005A177A from
0012F128 0120F96C 

Переходи на адрес возврата. Для этого установи курсор на соответствующую ячейку стэка и нажми Enter. Ты попал в подпрограмму. Как и во всех предыдущих случаях тебе следует искать такую конструкцию, в которой от джампа будет зависить – появиться окно или нет, либо просто вызовб который можно затереть.
 

005A176C $ 55 PUSH EBP
005A176D . 8BEC MOV EBP,ESP
005A176F . 83C4 F0 ADD ESP,-10
005A1772 . 53 PUSH EBX
005A1773 . 56 PUSH ESI
005A1774 . 57 PUSH EDI
005A1775 . E8 1EDB0200 CALL ; [GetCurrentThreadId
005A177A . 8B15 98896100 MOV EDX,DWORD PTR DS:[618998] ; dumped1.0062259C  

Тут джампов не видно. Надо найти откуда вызыается подпрограмма, в которую ты попал. Эта подпрограмма может вызываться из разных частей проги, поэтому если ты сейчас установишь бряк на начало и перезапустишь прогу, то можешь попасть в ситуацию, когда эта подпрограмма будет вызываться очень часто и тебе просто надоест жать f9. Но следует вспомнить, что программа в ожидании твоего нажатия на кнопку «крутиться» в бесконечном цикле. А значит ты можешь без проблем попасть на начало подпрограммы не перезагружая прогу. Для этого поствь бряк на начало подпрограммы и нажми f9. Ты окажешься в начале подпрограммы и сможешь посмотреть адрес возврата стэке. Перейти и посмотреть, что там - а там ещё одна подпрограмма. Но без перезагрузки проги ты сможешь «гулять» не долго. Очередной раз переходя на адрес возврата ты попадёшь сюда:

0054E49F |. 8990 4C020000 MOV DWORD PTR DS:[EAX+24C],EDX
0054E4A5 |> 8B03 /MOV EAX,DWORD PTR DS:[EBX]
0054E4A7 |. E8 FC310000 |CALL dumped1.005516A8
0054E4AC |. 8B03 |MOV EAX,DWORD PTR DS:[EBX]
0054E4AE |. 80B8 9C000000 >|CMP BYTE PTR DS:[EAX+9C],0
0054E4B5 |. 74 0F |JE SHORT dumped1.0054E4C6
0054E4B7 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
0054E4BA |. C780 4C020000 >|MOV DWORD PTR DS:[EAX+24C],2
0054E4C4 |. EB 14 |JMP SHORT dumped1.0054E4DA
0054E4C6 |> 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
0054E4C9 |. 83B8 4C020000 >|CMP DWORD PTR DS:[EAX+24C],0
0054E4D0 |. 74 08 |JE SHORT dumped1.0054E4DA
0054E4D2 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
0054E4D5 |. E8 36FDFFFF |CALL dumped1.0054E210
0054E4DA |> 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
0054E4DD |. 8B80 4C020000 |MOV EAX,DWORD PTR DS:[EAX+24C]
0054E4E3 |. 85C0 |TEST EAX,EAX
0054E4E5 |.^74 BE \JE SHORT dumped1.0054E4A5   

А это и есть тело цикла, в котором прога ждёт нажатия на батон. Теперь, чтобы посмотреть адресс возврата из этой подпрограммы нужно ставить бряк и перезагружать прогу (ctrl+f2). Нашел адрес возврата? Отлично. Похоже ты попал куда надо
 

004072C8 /. 55 PUSH EBP
004072C9 |. 8BEC MOV EBP,ESP
004072CB |. 83C4 F8 ADD ESP,-8
004072CE |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
004072D1 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004072D4 |. A1 38856100 MOV EAX,DWORD PTR DS:[618538]
004072D9 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
004072DB |. 8B10 MOV EDX,DWORD PTR DS:[EAX] ; dumped1.005F027C
004072DD FF92 E8000000 CALL DWORD PTR DS:[EDX+E8]; вызов подпрограммы, которая показывает окно.
004072E3 |. 59 POP ECX
004072E4 |. 59 POP ECX
004072E5 |. 5D POP EBP
004072E6 \. C3 RETN    

Чтобы проверить, что вызов окна происходит именно здесь, можешь поставить бряк на 004072DD и перезагрузить прогу. Этот бряк сработает до того, как появиться окно. Когда бряк сработал меняй CALL на кучу nop’ов. И наслаждайся результатом, который следует сохранить.
На этом заканчиваю свой рассказ.

Заключение.

Это мой первый взлом защиты проги. Ломал я её 2 часа имея ноль знаний о взломе(на туториал ушло в 2 раза больше времени). Если тебе скажут – ломай крэкмисы и ты станешь крутым крэкером – это неправда, так как я до этого взлома сломал только один тупой крэкми (больше не ломал, потому что не в кайф). Намного интересней написать крэкми или ломать защиты реальных программ. Если эта стотья помогла тебе в чём-нибудь – не ленись, расскажи об этом мне (емайл смотри на сайте). Критикам просьба не беспокоить. Я знаю, что сломать можно это всё и легче, и что у меня полно ошибок.

Благодарности:

Ct757/tpoc, SuRiV, Bill Prisoner/tpoc, IDA developers.

Наши новости

Новые события из жизни нашей лаборатории

Статьи

Статьи и переводы лаборатории TPOC

Программы

Программы лаборатории TPOC

Релизы

Здесь мы сообщаем Вам, какие творения скоро появятся

Ссылки

Ссылки на сайты, где можно найти больше информации

Наша лаборатория

История нашей лаборатории и ее члены

Дата последнего обновления: 12 декабря 2005 года
У вас есть предложения по нашему сайту?
Напишите сюда
Любимые сайты вирмейкеров:
(WASM)   (RSDN)