Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Осмотр Obsidium`а

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: BiT-H@ck <bit-hack@mail.ru>

Хай, хай, хай. Пацаны, здраст. У меня сегодня веселье! Я вздёрнул obsidium! Ща я объясню, что да как. Для начала расскажу, что “это”. Это довольно-таки мощный протектор. По сложности он чуть-чуть не дотягивает до второго аспирина. Аспирин его превосходит в своей VM и более сложной процедурой динамического получения адресов импорта. Кстати, мне кажется, что АС спёр идею про процедуру получения динамического получения адресов импорта именно из этого протектора (в нем кажись в первом появилась такая штука). А теперь по пунктам то, с чем нам придётся столкнуться:
1. Крутой анти-дебаг.
2. Динамическое получение адресов импорта.
3. Кража байт с ОЕР.
4. Кража кусков кода из проги.
5. Очень много мусора (появился во второй версии).
6. Многое другое…

Поиск ОЕР и восстановление спёртых байтов.
Тут тактика, такая же как в аспирине. Топчем по Ctrl+F9, перезапускаем и топчем на один раз меньше. Бряк на секцию кода проги. Тормознулись тут:

 0044EDE7	E8DC6DFBFF	CALL 00405BC8
 0044EDEC	A1D0FF4400	MOV EAX, DWORD PTR DS:[44FFD0]
 0044EDF1	8B00			MOV EAX, DWORD PTR DS:[EAX]
 

Это прога на делфи, начало у неё должно быть примерно такое:

 00452400	55		PUSH EBP
 00452401	8EC		MOV EBP, ESP
 00452403	83C4F0	ADD ESP, -10
 00452406	B820224500	MOV EAX, 00452220
 

Теперь взгляните на стек, у меня 0012FFB0. Ща будем “подбирать” начало. Запустите любую прогу под отладчиком и посмотрите на регистр esp. У меня 0012FFC4.

 Push ebp
 

Смещение стека на 4 вниз.

 Mov ebp, esp
 

Это так и будет.

Add esp, -10
Смотрим на стек и прикидываем, что надо добавить/отнять от esp, для получения esp=0012FFB0, когда eip=0044EDE7. Надо добавить -10. Теперь взгляните на еах в запакованной проге. Ок, спёртые байты:

 0044EDDC	55			PUSH EBP
 0044EDDD	8BEC			MOV EBP, ESP
 0044EDDF	83C4F0		ADD ESP, -10
 0044EDE2	B8FCEB4400	MOV EAX, 0044EBFC
 

Пишем на место. Ой, а это что за мусор? Ладно, отсчитываем по количеству байт и пишем на мето:) Дампим, берём ImpRec. Пробуем. Очень много нераспознанных функций. Будем править.

Получение импорта.
Ставим memory бряк (на запись) на один из адресов импорта. Запускаем, топчем по F9 до такого кода:

 007C6944	0139		ADD DWORD PTR DS:[ECX], EDI
 007C6946	893E		MOV DWORD PTR DS:[ESI], EDI ;тормознулись
 007C6948	EB04		JMP SHORT 007C694E	
 007C694A	CA4458	RETF 5844
 

Трейсим до (довольно много):

 007C65D3	50		PUSH EAX
 007C65D4	FF760C	PUSH DWORD PTR DS:[ESI+C]
 007C65D7	E890010000	CALL 007C676C ;тут пишутся адреса импорта
 007C65DC	EB03		JMP SHORT 007C65E1
 

Зайдём в CALL 007C676C. Вот эта процедура:

 007C676C	C8000000	ENTER 0, 0
 007C6770	53		PUSH EBX
 007C6771	56		PUSH ESI
 007C6772	57		PUSH EDI
 007C6773	8B5D14	MOV EBX, DWORD PTR SS:[EBP+14]
 007C6776	8B7510	MOV ESI, DWORD PTR SS:[EBP+10]
 007C6779	8B7D0C	MOV EDI, DWORD PTR SS:[EBP+C]
 007C677C	8B5B04	MOV EBX, DWORD PTR DS:[EBX+4]
 007C677F	66F7062000	TEST WORD PTR DS:[ESI], 20
 007C6784	7446		JE SHORT 007C67CC
 007C6786	66F7060200	TEST WORD PTR DS:[ESI], 2
 007C678B	751F		JNZ SHORT 007C67AC
 007C678D	66C7060400	MOV WORD PTR DS:[ESI], 4
 007C6792	8B4514	MOV EAX, DWORD PTR SS:[EBP+14]
 007C6795	6A01		PUSH 1
 007C6797	6A00		PUSH 0
 007C6799	FF7604	PUSH DWORD PTR DS:[ESI+4]
 007C679C	6A00		PUSH 0
 007C679E	FF7518	PUSH DWORD PTR SS:[EBP+18]
 007C67A1	FF5050	CALL DWORD PTR DS:[EAX+50]
 007C67A4	85C0		TEST EAX, EAX
 007C67A6	7439		JE SHORT 007C67E1
 007C67A8	8907		MOV DWORD PTR DS:[EDI], EAX
 007C67AA	EB20		JMP SHORT 007C67CC
 007C67AC	66C7060400	MOV WORD PTR DS:[ESI], 4
 007C67B1	8B4514	MOV EAX, DWORD PTR SS:[EBP+14]
 007C67B4	0FB75602	MOVZX EDX, WORD PTR DS:[ESI+2]
 007C67B8	6A01		PUSH 1
 007C67BA	52		PUSH EDX
 007C67BB	6A00		PUSH 0
 007C67BD	FF7604	PUSH DWORD PTR DS:[ESI+4]
 007C67C0	FF7518	PUSH DWORD PTR SS:[EBP+18]
 007C67C3	FF5050	CALL DWORD PTR DS:[EAX+50]
 007C67C6	85C0		TEST EAX, EAX
 007C67C8	7417		JE SHORT 007C67E1
 007C67CA	8907		MOV DWORD PTR DS:[EDI], EAX
 007C67CC	83C608	ADD ESI, 8
 007C67CF	83C704	ADD EDI, 4
 007C67D2	FF4D08	DEC DWORD PTR SS:[EBP+8]
 007C67D5	75A8		JNZ SHORT 007C677F
 007C67D7	33C0		XOR EAX, EAX
 007C67D9	40		INC EAX
 007C67DA	5F		POP EDI
 007C67DB	5E		POP ESI
 007C67DC	5B		POP EBX
 007C67DD	C9		LEAVE
 007C67DE	C21400	RETN 14
 

Меняем:

 TEST WORD PTR DS:[ESI], 20
 

на

 TEST WORD PTR [ESI], 8
 


 7446		JE SHORT 007C67CC 
 

на (смотрите на байты)

 7546		JNZ SHORT 007C67CC
 


 7439		JE SHORT 007C67E1
 

на (смотрите на байты)

 7424		JE SHORT 007C67CC
 


 7417		JE SHORT 007C67E1
 

на (смотрите на байты)

 7402		JE SHORT 007C67CC
 

Вот, после этого, импорт будет девственно чистый:) Теперь идите на ОЕР и берите импорт. Будут неопределённые функции! Это причём не функции, которые юзал прот (по крайне мере не все:( Всё плохо (речь пессимиста). Но мы ведь оптимисты, или, по крайней мере, реалисты? Тогда продолжаем. Будет функция:

 008BB740		mov eax,8BB71E
 008BB745		jmp 008BB247
 

В ней в eax ложится адрес командной строки до нашего файла. После трейса всей функции-переходника второго уровня я пришёл к выводу, что это и есть функция, которая возвращает командную строку – GetCommandLineA. В ImpRec выбираем эту функцию. Далее будет функция:

 008BB714	MOV EAX, 0A280105
 008BB719	JMP 008BB247
 

Это GetVersion. Продолжаем.

 008BB3EC	enter 0,0
 008BB3F0	push ebx
 008BB3F1	call 008BB3F6
 008BB3F6	pop edx
 008BB3F7	xor eax,eax
 008BB3F9	lea edx,[edx+57]
 008BB3FC	push edx
 008BB3FD	push dword ptr fs:[eax]
 008BB400	mov fs:[eax],esp
 008BB403	mov eax,[ebp+8]
 008BB406	lea edx,[eax+3]
 008BB409	mov ebx,[eax]
 008BB40B	add eax,4
 008BB40E	lea ecx,[ebx+FEFEFEFF]
 008BB414	not ebx
 008BB416	and ecx,ebx
 008BB418	and ecx,80808080
 008BB41E	je short 008BB409
 008BB420	test ecx,8080
 008BB426	jnz short 008BB42E
 008BB428	shr ecx,10
 008BB42B	add eax,2
 008BB42E	shl cl,1
 008BB430	sbb eax,edx
 008BB432	pop dword ptr fs:[0]
 008BB438	add esp,4
 008BB43B	pop ebx
 008BB43C	leave
 008BB43D	retn 4
 

Для тех, кто хотя бы чуть-чуть копал прот или исследовал функцию динамического получения адресов функций, тот сразу поймёт, что это за функция. Позже нам встретится переходник вида:

 008BB600	60			PUSHAD
 008BB601	66B80C00		MOV AX, 0C
 008BB605	B100			MOV CL, 0
 008BB607	E98DBCFFFF		JMP 008B7299
 

JMP в конце этого переходника и есть переход на процедуру вызова функции динамического получения адресов функций. Нам туда… Ставим бряк на этот джамп и отпускаем прогу на волю. Тормознулись на бряке. F8:

 008B7299			JMP SHORT 008B729E
 008B729B			FIST WORD PTR DS:[ESI+D1B60F1C]
 008B72A1			JMP SHORT 008B72A7
 008B72A3			PREFIX REPNE:
 008B72A5			DAA
 008B72A6			ROR BYTE PTR DS:[EDI], 0B7 range 1..31
 008B72A9			SHR BL, 1
 

Хотя я и не встречал Obsidium первой версии на воле, но по писанию некоторых людей такого полиморфа не было. Я избавлюсь от полиморфа стандартным способом – дамп региона памяти и загонка дампа в HIEW. После чего я просто ноплю весь мусор. Трейсим процедуру в умеренном темпе до такого кода:

 008B73BE	6A 01		PUSH 1
 008B73C0	50		PUSH EAX
 008B73C1	6A 00		PUSH 0
 008B73C3	FF76 04	PUSH DWORD PTR DS:[ESI+4]
 008B73C6	FF77 04	PUSH DWORD PTR DS:[EDI+4]
 008B73C9	FF53 50	CALL DWORD PTR DS:[EBX+50] 
 

Заходим в процедуру, а там…Там процедура, очень похожая на ту, которую я показал выше (008BB3EC). Это GetProcAddress=>процедура по адресу 008BB3EC – GetProcAddress, и ещё следовательно то, что после выхода из неё мы получим реальную функцию. Выходим из неё, смотрим на регистр eax, а там 7C86114D kernel32.WinExec. Эта функция WinExec.


Далее смотрим ещё один переходник вида описанного выше (переходник первого уровня). Заходим трейсим до таких инструкций:

 008B77A9		PUSH EDX
 008B77AA		PUSH ECX
 008B77AB		PUSH EAX
 008B77AC		PUSH 49E02C34
 008B77B1		PUSH 0
 008B77B3		CALL DWORD PTR DS:[EBX+18] ;call 0046C63A
 

Продолжаем трейсить до:

 008B77D7		MOV EAX, DWORD PTR DS:[EBX+10]
 

В еах адрес загрузки и выходим. Это GetModuleHandle. Далее такой переходничок:

 008BBB5C		MOV EAX, 0C64
 008BBB61		JMP 008BB247
 

Это GetCurrentThreadId. Таким темпом восстанавливаем все функции и прилепливаем IAT к дампу. Запускаем – ОК, до встречи.

Приветы
All my command, cracklab, а особенно Alex(особеннее), Mario555 (а ему ещё особенее:), WELL, Bad_Guy. И to: dragon_gor, NUCLEuS и всем, кого я забыл…



Обсуждение статьи: Осмотр Obsidium`а >>>


Комментарии к статье: Осмотр Obsidium`а

Сергей 01.08.2005 13:37:13
Молодец!
---
Bad_guy 10.08.2006 23:52:17
Эх, Битхак, пришла пора тебя раскритиковать, ну во-первых что за прогу ты смотришь то ? где ее кто скачает ?
во-вторых, вот такие тексты это прсто атас:
"Поиск ОЕР и восстановление спёртых байтов.
Тут тактика, такая же как в аспирине. Топчем по Ctrl F9, перезапускаем и топчем на один раз меньше. Бряк на секцию кода проги. Тормознулись тут:"

Лучше уже совсем тогда ничего не писать, чем так писать. Вот взять бы хотя бы статью haggar's про тот же обсид
http://www.reversing.be/article.php?story=20060611142715658

статья эта конечно тоже не идеал, но хоть что-то понять можно и научиться скрипты к олле в придачу в архиве. И вообще как оказалось обсид не стоит недооценитвать - у него очень злая антиотладка и профи на него смотреть даже не желают меньше чем за 300 зеленых.
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS