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

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


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

Распаковка Securom на примере Warcraft III

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

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: Cigan <>


 

Инструменты:

Hiew 6.85 OllyDBG & Plugins PeTools Masm 8.2 IDA 4.7

Системные требования:

Немного мозгов, прямые руки, а главное Игра и оригинальный CD :))) Загружаем прогу в OllyDBG и поехали. В Securom присутствует виртуальная машина,так что во время распаковки, он расшифрованные участки кода пишет в память. Для этого он использует WriteProcessMemory передавая 5-ть параметров, но нас интересуют только три: 1) Куда писать = ESP+8 2) Откуда брать код = ESP+0С 3) Размер кода = ESP+10 - количество в байтах Так что ставим на WriteProcessMemory breakpoint в kernel32.dll нажимаем F9 и ждем срабативания. Как только остановилось смотрим то что нас интересует а именно, ESP+08, ESP+0C, ESP+10. После этого запускаем PeTools и снимаем частичный дамп памяти. В Dump Start at: пишем адрес который находиться в ESP+0c, а Dump Length is: пишем количество байт находящиеся в ESP+0C и нажимаем ОК. После повторяем эту процедуру пока WriteProcessMemory не перестанет вызываться, а именно до запуска самой игры. После того как мы сохранили все дампы нам надо их записать в наш war3.exe по адресам, которые были указаны в ESP+08 перед каждым снятием дампа. Для этого мы используем hiew. Да не забудьте сохранить оригинальный файл он нам еще понадобиться. На самом деле нам нужны только два дампа, а именно те которые записываются в самую первую секцию файла. Теперь надо найти OEP. Находится она просто, после последнего срабатывания WriteProcessMemory нужно чуток погулять по коду. После нахождение правим наш файл. После этого запихиваем его в IDA и переходим на OEP чуть ниже видим первый CALL ведущий в не куда. Хех, а по идеи должен быть вызов API. Что ж придется фиксить все CALL. Ну что ж запускаем оригинальный war3.exe доходим до OEP и заходи в этот самый CALL, в нем мы ищем какая функция будет вызвана. Идя по нему мы попадем в виртуальную машину securom, потом опять в war3.exe, вообщем нас слегка поколбасит, пока мы не дойдем до такого места: 0046BF55 5A POP EDX 0046BF56 59 POP ECX 0046BF57 8B45 C8 MOV EAX, DWORD PTR [EBP-38] ; war3.0044B2A4 0046BF5A 8BF0 MOV ESI, EAX 0046BF5C 8B06 MOV EAX, DWORD PTR [ESI] ; msvcrt.__set_app_type 0046BF5E 5F POP EDI 0046BF5F 5E POP ESI 0046BF60 5B POP EBX 0046BF61 8BE5 MOV ESP, EBP 0046BF63 5D POP EBP 0046BF64 FFE0 JMP EAX По адресу: 0046BF57 мы видим, что в EAX записывается адрес ячейки памяти из секции .idata , а по адресу 0046BF5C мы видим что в EAX помещается название API и потом по адресу 0046BF64 идет прыжок на нее. Следовательно, наш CALL DWORD PTR [4ECF34] по адресу 00401C61 должен был иметь вид CALL DWORD PTR [44B2A4]. Хе хе надо писать dll, которая будет исправлять наши не правильные CALL, на корректные вызовы API. Но это еще не все проблемы, пройдя дальше по нашему коду, и дойдя до вот такого адреса 00401D5C, мы увидим такой код: 00401D5C 90 NOP 00401D5D E82EA60D00 CALL war3.004DC390 00401D62 50 PUSH EAX 00401D63 E8 48F3FFFF CALL war3.004010B0 ; war3.004010B0 Давайте зайдем в CALL по адресу: 00401D5D здесь на самом деле должен происходить вызов GetModuleHandleA, только после протектора стало так: 00401D5C 90 NOP 00401D5D E82EA60D00 CALL war3.004DC390 а должно быть так: 00401D5C FF15A4B04400 CALL DWORD PTR:[0044B0A4] То есть в этом CALL как и вдругих происходит расчет по адресу возврата, какая функция должна быть вызвана. Ну что ж доходим да того места и видим: 004DC415 8B75 EC MOV ESI, DWORD PTR [EBP-14] ; war3.0044B0A4 004DC418 8B06 MOV EAX, DWORD PTR [ESI] ; GetModuleHandleA 004DC41A 8945 04 MOV DWORD PTR [EBP+4], EAX ; GetModuleHandleA 004DC41D 58 POP EAX 004DC41E 9D POPFD 004DC41F 5F POP EDI 004DC420 5E POP ESI 004DC421 5A POP EDX 004DC422 59 POP ECX 004DC423 5B POP EBX 004DC424 5F POP EDI 004DC425 5E POP ESI 004DC426 5B POP EBX 004DC427 8BE5 MOV ESP, EBP 004DC429 5D POP EBP 004DC42A C3 RETN Еще есть несколько таких процедур обработки API по адресу возврата. Теперь для чего это. Нам надо найти все эти адреса, которые содержат nop,call и исправить их на нормальные CALL [address API]. Написание DLL, или что в ней должно делаться. 1) Поиск всех CALL которые обращаются в свою VM (Виртуальную машину) и править сразу в наш war3_dump.exe на корректные XXXXXXXX: CALL DWORD PTR [Address API] 2) Поиск всех CALL которые имеют вид: XXXXXXXX: 90 NOP XXXXXXXX: E8XXXXXXXX CALL war3.XXXXXXXX Это править сразу в war3_dump.exe на: XXXXXXXX: FF15XXXXXXX CALL DWORD PTR [Address API] 3) Все найденные CALL выполнить и в результате получить рабочий NOCD. После всех этих манипуляций надо настроить таблицу импорта. Использование ImpRec и Revergin не нужно так как она лежит целая в файле нужно только правильно указать “Import Directory” и “Import Address Table”. P.s. Адреса всех функций обработки импорта можно найти в IDA. P.s.s Ногами не бить это мой первый тутор



Код DLL


 ;----------------------------------------------------------------------------
 ;                           War3_Fixer.asm version 1.18
 ;----------------------------------------------------------------------------
 
    .386
    .model flat,stdcall
 
    option casemap:none
    include windows.inc
    include kernel32.inc
 
    includelib kernel32.lib
 
 
    .data
 War3_Dump		db	"War3_dump.exe",0
 CorrectCall		dd	000015FFh
 SearchN1		db	0FFh,15h,48h,9dh,50h,00h
 SearchN2		db	0FFh,15h,08h,0cFh,4Eh,00h
 SearchN3		db  90h,0E8h
 SearchN4		db	0Dh,00h
 FindN1			dd	SearchN1
 FindN2			dd	SearchN2
 FindN3			dd	SearchN3
 FindN4			dd	SearchN4
 Start_File		dd	00401000h
 End_File		dd	004E668Eh
 End_File2		dd	00449000h
 
    .data?
 Addr_Call		dd	?
 Addr_Jump		dd	?
 IAT				dd	?	;Адресс АПИ
 hWar			dd	?	;Handle Открытого файла War3_Dump.exe
 LastErr			dd	?	;Возвращение последней ошибки при вызове API
 lDistToMove		dd	?	;Адрес CALL’ов в файле где будут исправлены вызовы на API
 API				dd	?	;Адрес API Functions
 BytesToWritten	dd	?	;Количество записанных байт
    .code
    DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
            mov  eax,TRUE
            ret
    DllEntry Endp
 
 FindCALL PROC FindFirst:DWORD, FindSecond:DWORD
 	
 NewN3:		MOV		ESI, [Start_File]
 NextN3:		MOV		EAX, [End_File]
 			CMP		ESI, EAX
 			JZ		NewByteN3
 			CLD
 			XOR		ECX, ECX
 			MOV		ECX, 2h
 			MOV		EDI, FindFirst
 			REPE	CMPSB
 			JNZ		NextN3
 			INC		ESI
 			INC		ESI
 			MOV		ECX, 2h
 			MOV		EDI, FindSecond
 			REPE	CMPSB
 			JNZ		NextN3
 			MOV		EAX, ESI
 			SUB		EAX, 6h
 			CALL	EAX
 			JMP		NewN3
 NewByteN3:	
 			ret
 
 FindCALL endp
 
 Fix_exe_API proc
 
 	invoke FindCALL,FindN3,FindN4
 
 NewN1:		MOV		ESI, [Start_File]	;Определение адреса начала памяти програмы
 NextN1:		MOV		EAX, [End_File]		;-//-//-//-//-//-// конца -//-//-//-//-//-
 			CMP		ESI, EAX
 			JZ		NewByteN1
 			CLD
 			XOR		ECX, ECX
 			MOV		ECX, 6h
 			MOV		EDI, FindN1
 			REPE	CMPSB
 			PUSHFD
 			.if	ECX==4h
 				DEC		ESI
 			.endif
 			POPFD
 			JNZ		NextN1
 			MOV		EAX, ESI
 			SUB		EAX, 6h
 			CALL	EAX
 			JMP		NewN1
 NewByteN1:	MOV		EAX, FindN1
 			MOV		EBX, [EAX+2h]
 			ADD		EBX, 4h
 			MOV		[EAX+2h], EBX
 			CMP		BL, 78h
 			JNZ		NewN1
 
 NewN2:		MOV		ESI, [Start_File]
 NextN2:		MOV		EAX, [End_File]
 			CMP		ESI, EAX
 			JZ		NewByteN2
 			CLD
 			XOR		ECX, ECX
 			MOV		ECX, 6h
 			MOV		EDI, FindN2
 			REPE	CMPSB
 			PUSHFD
 			.if	ECX==4h
 				DEC		ESI
 			.endif
 			POPFD
 			JNZ		NextN2
 			MOV		EAX, ESI
 			SUB		EAX, 6h
 			CALL	EAX
 			JMP		NewN2
 NewByteN2:	MOV		EAX, FindN2
 			MOV		EBX, [EAX+2h]
 			ADD		EBX, 4h
 			MOV		[EAX+2h], EBX
 			CMP		BL, 38h
 			JNZ		NewN2		
 			ret
 
 Fix_exe_API endp
 
 
 Create proc
 	
 	invoke CreateFile,addr War3_Dump,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,\
 									FILE_ATTRIBUTE_NORMAL,NULL
 	ret
 
 Create endp
 
 Close proc
 	
 	invoke CloseHandle,hWar
 	ret
 
 Close endp
 
 ApiCallRebuildN1 proc		;0046BF57
 	invoke GetLastError
       MOV     LastErr,EAX
 	CALL Create
 	.if EAX!=NULL
 			MOV		hWar,EAX
 			MOV		EAX, DWORD PTR [EBP-3Ch]
 			MOV		EBX, 00400000h
 			SUB		EAX, EBX
 			MOV		lDistToMove,EAX
 			invoke SetFilePointer,hWar,lDistToMove,NULL,NULL
 			MOV     EBX, EBP
 			SUB     EBX, 38h
 			MOV		API,EBX
 			invoke WriteFile,hWar,API,4h,addr BytesToWritten,NULL
 			CALL	Close
 			MOV     EAX, DWORD PTR [EBP-38h]
 			MOV     EBX, DWORD PTR [EBP-3Ch]
 			MOV     DWORD PTR [EBX], EAX
 			MOV     ESI, EAX
 			invoke SetLastError,LastErr
 	.endif
 	ret
 ApiCallRebuildN1 endp
 
 
 ApiCallRebuildN2 proc		;004DC415
 
 	invoke GetLastError
       MOV     LastErr,EAX
     CALL Create
 	.if EAX!=NULL
 			MOV		hWar,EAX
 			MOV		EAX, DWORD PTR [EBP+8h]
 			SUB		EAX, 4h
 			MOV		EBX, 00400000h
 			SUB		EAX, EBX
 			MOV		lDistToMove,EAX
 			invoke SetFilePointer,hWar,lDistToMove,NULL,NULL
 			MOV     EBX, EBP
 			SUB     EBX, 14h
 			MOV		API,EBX
 			invoke WriteFile,hWar,API,4h,addr BytesToWritten,NULL
 			MOV		EBX, DWORD PTR [EBP+8h]
 			SUB		EBX, 4h
 			MOV		EAX, DWORD PTR [EBP-14h]
 			MOV 	DWORD PTR [EBX], EAX
 			SUB		EBX, 2h
 			MOV		EAX, CorrectCall
 			CMP		AX, WORD PTR [EBX]
 			JNZ		IncorrectCall
 	CallIsCorrect:
 			CALL	Close
 			invoke SetLastError,LastErr
 			MOV		ESI, DWORD PTR [EBP-14h]
 			MOV		EAX, DWORD PTR [ESI]
 			ret
 	IncorrectCall:
 			MOV		EAX, DWORD PTR [EBP+8h]
 			SUB		EAX, 6h
 			MOV		EBX, 00400000h
 			SUB		EAX, EBX
 			MOV		lDistToMove,EAX
 			invoke SetFilePointer,hWar,lDistToMove,NULL,NULL
 			invoke WriteFile,hWar,addr CorrectCall,2h,addr BytesToWritten,NULL
 			MOV		EBX, DWORD PTR [EBP+8h]
 			SUB		EBX, 6h
 			MOV		AX, WORD PTR [CorrectCall]
 			MOV		WORD PTR [EBX],AX
 			jmp		CallIsCorrect
 	.endif
 	ret
 	
 ApiCallRebuildN2 endp
 
 ApiCallRebuildN3 proc		;004DC1AE & 004DC36E
 	
 	MOV		DWORD PTR [EBP-14h],EAX
 	invoke GetLastError
       MOV     LastErr,EAX
     CALL Create
 	.if EAX!=NULL
 			MOV		hWar,EAX
 			MOV		EAX, DWORD PTR [EBP+4h]
 			SUB		EAX, 4h
 			MOV		EBX, 00400000h
 			SUB		EAX, EBX
 			MOV		lDistToMove,EAX
 			invoke SetFilePointer,hWar,lDistToMove,NULL,NULL
 			MOV     EBX, EBP
 			SUB     EBX, 14h
 			MOV		API,EBX
 			invoke WriteFile,hWar,API,4h,addr BytesToWritten,NULL
 			MOV		EBX, DWORD PTR [EBP+4h]
 			SUB		EBX, 4h
 			MOV		EAX, DWORD PTR [EBP-14h]
 			MOV 	DWORD PTR [EBX], EAX
 			SUB		EBX, 2h
 			MOV		EAX, CorrectCall
 			CMP		AX, WORD PTR [EBX]
 			JNZ		IncorrectCall2
 	CallIsCorrect2:
 			CALL	Close
 			invoke SetLastError,LastErr
 			MOV		EAX, DWORD PTR [EBP-14h]
 			ret
 	IncorrectCall2:
 			MOV		EAX, DWORD PTR [EBP+4h]
 			SUB		EAX, 6h
 			MOV		EBX, 00400000h
 			SUB		EAX, EBX
 			MOV		lDistToMove,EAX
 			invoke SetFilePointer,hWar,lDistToMove,NULL,NULL
 			invoke WriteFile,hWar,addr CorrectCall,2h,addr BytesToWritten,NULL
 			MOV		EBX, DWORD PTR [EBP+4h]
 			SUB		EBX, 6h
 			MOV		AX, WORD PTR [CorrectCall]
 			MOV		WORD PTR [EBX],AX
 			jmp		CallIsCorrect2
 	.endif
 	ret
 
 ApiCallRebuildN3 endp
 
    End DllEntry
 
 После загрузки длл вызываем Fix_exe_API, но до этого надо изменить по адресам код протектора на
 приведенный ниже:
 46BF57      ==> jmp ApiCallRebuildN1 - каторая находиться в нашей длл
 4DC415      ==> jmp ApiCallRebuildN2
 4DC1AE      ==> jmp ApiCallRebuildN3
 4DC36E      ==> jmp ApiCallRebuildN3
 
 ну и немного подкорректировать чтобы после выполнения call который выполняеться в програме вовращался не в программу,а в нашу длл.
 




Обсуждение статьи: Распаковка Securom на примере Warcraft III >>>


Комментарии к статье: Распаковка Securom на примере Warcraft III

Андрей 06.05.2005 22:50:43
Молодец, Цыган
---
Zazaka 08.05.2005 22:59:22
Бля как я ненавижу всякие так StarForce, Securom\’ы и т. п.
---
Кто-то 31.05.2005 09:37:12
Статейка-то рулит. Ништяк чел!!!
---
BFG_Spark 08.07.2005 23:42:02
а можно алкоголем создать образ и в реестре указать на него ссылку...и все
---
FORTTE 12.10.2005 00:44:34
Cool statiya!
---
X0E-2003 09.11.2005 16:08:48
to BFG_Spark
Эмуляция - не есть анпак и это не инструмент распаковки!
---

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



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


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