Перейти к содержанию
Old Phone Forum
  • Вход

    Вы сейчас не залогинены на форуме.

    Для возможности комментариев, загрузки файлов, подписок на ответы - вам надо войти.

Взламываем Old Swift


Рекомендуемые сообщения

Преамбула

С каждым годом все растет технический прогресс, создается новая техника и многое другое. Но остается неизменным лишь одно звено - человек. Хоть он и двигает этот технический прогресс, но сам остается на месте. Он всегда способен совершить ошибку или забыть что-то. Производители мобильных телефонов также придерживаются этого мнения и, поэтому, встраивают различные секретные коды для быстрого спасения забывчивых пользователей.

 

По народу давно ходят слухи о неких супер-кодах сервисных центров, с помощью которых можно быстро разблокировать телефон, защищенный кодом телефоном или попросту 'Phone lock'. Думаю, что не все верили в такие байки. Я тоже не верил, но ,однажды, обнулив eeprom и запустив телефон, было заметил, что телефон разрешает вход по коду 8х0 даже в случае смены этого кода. При этом код полностью сбрасывался на 8х0 и старый не подходил. Стало интересно. Получается, что существует некий код, который хранится в eeprom и сбрасывает пароль на стандартный.

 

Обычная проверка

Исследования проводятся на примере прошивки d500xeed2.

Так выглядит обычная проверка пароля в телефоне:

mcc_set_check_pw:
DCM	MCC_INIT_RESTORE
DCM	MCC_EBUF
DCM	MCC_TASK 0x4 0x14 0x415
DCM	MCC_EDIT_START 0xA 0x29 0x400 0x97E 0 0x230A
DCM	MCC_IF 0x9 0x1 0xF 0 mcc_sec_clear_return_menu1
DCM	MCC_ELSEIF 0x9 0x1 0x1 0 mcc_sec_clear_return_menu1
DCM	MCC_ELSEIF 0x9 0x1 0x9 0 mcc_sec_exit
DCM	MCC_IF 0x2 0x19 0x1 0 mcc_set_reset_pw_short
DCM	MCC_IF 0x2 0x13 0 0 mcc_set_reset_pw_wrong
DCM	MCC_EDIT_END
DCM	MCC_RETURN

Инициализируется окно, создается окно ввода, обрабатывается нажатие клавиш, а после - самое интересное: проверяется длинна пароля и его валидность. Заглянем в MCC_IF 0x2 0x13.

loc_1085F8C4: 	; CASE 0x0013	
MOV		R1, SP
MOV		R0, #0x3
BL		_Acc_GetUnlockKey	; получаем реальный пароль

MOV		R0, R7
BL		_Sec_GetIntPasswd	; переводим пароль из буфера текста в числовую форму

LDR		R1, [sP]
CMP		R0, R1			; сравниваем оригинальный пароль с посчитанным
BNE		loc_1085F8DC

MOV		R0, #0x1		; если не равны, то подтверждаем ошибку пароля
B		loc_1085F8DE
loc_1085F8DC:	
MOV		R0, #0x0
loc_1085F8DE:	
LDRH	R1, [R5, #4]		; у нас R1 = 0
CMP		R0, R1
BNE		loc_1085F8E8

MOV		R4, #0x1		; ошибка
B		loc_1085F912
loc_1085F8E8:	
MOV		R4, #0x0		; ошибки нет
B		loc_1085F912

Рассмотрим Acc_GetUnlockKey.

Ниже приведен сокращенный вариант Acc_GetUnlockKey для кода с параметром 3.

Acc_GetUnlockKey:
PUSH	{R4,R7,LR}
SUB		SP, SP, #0x84

MOV		R4, R1			; R4 = *назначение

LDR		R0, =0x00000806
ADD		R0, #0x5		; 0x80B - ID кода телефона
BL		ReadBlockNameInRamImage	; получаем адрес участка памяти

MOV		R1, R0
ADD		R0, SP, #0x78
MOV		R2, #0xC
BLX		memcpy			; копируем участок из памяти в стек

LDR		R0, [sP, #0x78]
STR 		R0, [R4]		; записываем число из стека

ADD		SP, SP, #0x84
POP		{R4,R7,PC}

Рассмотрим Sec_GetIntPasswd.

Sec_GetIntPasswd:
PUSH	{R4,LR}

MOV		R3, #0x1		; множитель = 1
MOV		R1, #0x0		; счетчик = 0
LDRB	R2, [R0, R1]

CMP		R2, #0x30		; 0x30 = '0'
BCC		loc_10B98298		; если число < '0', то переходим

CMP		R2, #0x39		; 0x39 = '9'
BHI		loc_10B98298		; если число > '9', то переходим

MOV		R4, R3
MOV		R3, #0xA
MUL		R3, R4
ADD		R3, R3, R2
SUB		R3, #0x30		; R3 = R3 * 10 + (R2 - '0')

ADD		R1, #0x1		; инкремент счетчика
CMP		R1, #0x8
BLT		oc_10B9827E

loc_10B98298:	
MOV		R0, R3
BL		_Sec_ChangePasswd	;  добавляем 0x9a1d85

POP		{R4,PC}

Алгоритм довольно простой. Для большей наглядности перепишу его на языке высокого уровня Python без добавления числа 0x9a1d85.

def Sec_GetIntPasswd( s ):
m = 1
for i in xrange(8):
	ch = ord( s[i] )
	if ch not in range( ord('0'),ord('9') + 1 ):
		break
	m = m * 10 + ch - ord('0')
return m

Если функцию вызвать как Sec_GetIntPasswd('00000000'), то получим 100000000.

Если как Sec_GetIntPasswd('12345678'), то 112345678.

То есть число преобразуется в 10-ю СС с добавлением единицы в начале.

После к полученному числу добавляется 0x9a1d85 для большего устрашения.

 

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

 

Проверка при включении

Так выглядит проверка при включении:

mcc_acc_phone_lock:
DCM		MCC_LOCK_FLAG 0 0x1 0 0x4
DCM		MCC_INIT_RESTORE
DCM		MCC_DISPLAY_INDICATOR 0 0x1
DCM		MCC_EBUF
DCM		MCC_TASK 0x4 0x14 0x838 0x4B
DCM		MCC_EDIT 0x4 0x9 0x400 0x838 0 0x2301
DCM		MCC_IF 0x9 0x1 0xF 0 mcc_acc_sos
DCM		MCC_IF 0x4 0x20 0x1 0 mcc_acc_passwd_short
DCM		MCC_IF 0x4 0x23 0 0 mcc_acc_passwd_verify_err
DCM		MCC_LOCK_FLAG 0 0 0 0x4
DCM		MCC_BS 0x2 0x4 0x4000
DCM		MCC_INIT_RESTORE
DCM		MCC_REPORT 0x1 0x1 0x4 0x836 0 0x4
DCM		MCC_EXIT

Даже по mcc видно, что она отличается от обычной: например, другие скрипты обрабатывают проверку валидности пароля.

 

Заглянем в MCC_IF 0x4 0x23.

loc_10F70A64: 	; CASE 0x0023	
LDR		R0, =input_pwd
BL		_Sec_GetIntPasswd	; переводим пароль из буфера текста в числовую форму

MOV		R5, R0			; R5 = введенный код

LDR		R0, =0x00000804
BL		ReadBlockNameInRamImage	; сразу идет считывание неизвестного ранее блока

MOV		R1, R0
ADD		R0, SP, #0x4
MOV		R2, #0xC
BLX		memcpy			; копирование этого блока

LDR		R6, [sP, #0x4]		; R6 = неизвестный код

LDR		R0, =0x00000804
ADD		R0, #0x7		; 0x80B - ID кода телефона
BL		ReadBlockNameInRamImage	; считываем блок с кодом

MOV		R1, R0
ADD		R0, SP, #0x10
MOV		R2, #0xC
BLX		memcpy			; копирование этого блока

LDR		R0, [sP, #0x10]		; R0 = код
MOV		R1, #0x1
LSL		R1, R1, #14
CMP		R5, R0			; сравниваем введенный код с кодом
BNE		loc_10F70AA6

MOV		R0, #0x3
STRB	R0, [R7, #0xC]
LDR 		R0, [R7, #0x14]
BIC		R0, R1
STR 		R0, [R7, #0x14]
B		loc_10F70ADA		; ошибки нет 

loc_10F70AA6:	
CMP		R5, R6			; сравниваем введенный код с неизвестным кодом
BNE		loc_10F70ACE		

MOV		R0, #0x3
STRB	R0, [R7, #0xC]
LDR 		R0, [R7, #0x14]
BIC		R0, R1
STR 		R0, [R7, #0x14]
MOV		R1, #0x0
MOV		R0, #0x1
LSL		R0, R0, #14
BL		_Sec_SetLockLevel	; устанавливаем уровень блокировки ?

LDR		R0, =0x068FFE85		; 0x068FFE85 = 100000000 + 0x9a1d85, то есть это - закодированные 8х0
STR		R0, [sP, #0x10]

LDR		R0, =0x00000804
ADD		R1, SP, #0x10
ADD		R0, #0x7		; 0x80B - ID кода телефона
BL		SaveBlockNameInRamImage	; Записываем новый код телефона

B		loc_10F70ADA		; ошибки нет

loc_10F70ACE:	
MOV		R4, #0x1		; ошибка
B		loc_10F70ADA

loc_10F70ADA:
MOV		R0, R4
ADD		SP, SP, #0x1C
POP		{R4-R7,PC}

Вывод

Вот и нашлась эта самая проверка. Производитель действительно позаботился о 'запасном ходе'.

Вытащить его не слишком сложно.

 

Хак-патч

Для x700 был написан небольшой 'хак-патч'.

После его применения на дисплее вместо imei выводится 'секретный код'.

Ниже приведен его исходный код.

.equ ReadBlockNameInRamImage 	0x109b7358
.equ lk3_0InitEditBuffer 	0x1056fd48
.equ DisplaySSReport  		0x1094f710
.equ lk3_2WriteEditBuffer	0x109d9138
.equ _sprintf			0x104c0828
.start 0x10e97fcc

bl 	lk3_0InitEditBuffer

ldr 	r0, =0x804
bl	ReadBlockNameInRamImage

ldr	r2, [r0]
adr	r1, ="%X"
add	r0, sp, #0
bl 	_sprintf

add	r0, sp, #0
bl	lk3_2WriteEditBuffer

bl 	DisplaySSReport

b	0x10e97e00

Для x700 'секретный код' оказался равным 0x6e54471.

Преобразуем его в нормальный вид:

	0x6e54471 - 0x9a1d85 = 0x64B26EC = 105588460 => код = 05588460

Коды для других телефонов (не проверены)

E730 - 40205192

D500 - 38298753

D600 - 37417600

D900 - 89286480

Изменено пользователем NeO_2kX
  • Like 14
Ссылка на комментарий
Поделиться на другие сайты

есть ещё ряд дырок - в частности команда AT+PHLOCK - выводит текущий пароль пользователя.

Нужен какой-то патч на C3322i, C3322, C3592, B5722, S5610, E1080, E1081, и прочие Swift/Infineon ? Обращайтесь в ЛС или E.F2065@gmail.com

Ссылка на комментарий
Поделиться на другие сайты

Эта дырка появилась недавно.

Мы рождены, чтоб сказку сделать пылью...

 

VishnyaSoft.com - мои программы и мидлеты для телефонов Samsung

 

Классификация телефонов Samsung

 

Угадай название телефона

Ссылка на комментарий
Поделиться на другие сайты

Проверил сейчас еще на одном eeprom'е х700.

Код там оказался другой. Получается, что код прописывается исходя из каких-то данных на заводе.

Скорее всего из imei и серийного номера под аккумулятором.

При этом обязательно восьмизначный.

 

Будем разгадывать...)

Ссылка на комментарий
Поделиться на другие сайты

NeO_2kX,

Ну если подумать… SN вроде нигде в мобиле не записан ?

Остаётся IMEI… но если бы был алгоритм - то вероятно бы сервисный пароль делался бы из IMEI (как у нокий к примеру - он вычисляется из IMEI).

Но раз он прописан в EEPROM - то вероятно он генерируется случайно, и у самсунга просто есть база данных с этими кодами.

Нужен какой-то патч на C3322i, C3322, C3592, B5722, S5610, E1080, E1081, и прочие Swift/Infineon ? Обращайтесь в ЛС или E.F2065@gmail.com

Ссылка на комментарий
Поделиться на другие сайты

с каких пор серийный номер у телефона отсутствует??? а считать пароль легко... нужно просто определить ячеёку еепрома и далее просто на всех еепромах читать)

Жизнь - пьяный поэт, я - слово.

Я жесток и грустен, когда ему херово.

Жизнь - старый поэт, жизнь - усталый поэт,

А я... Что я? Его инструмент!...

 

Разработка Broadcom: http://www.rk-team.net/

Новости проекта QuB на Twitter

Ссылка на комментарий
Поделиться на другие сайты

с каких пор серийный номер у телефона отсутствует???
А где он лежит ? И в каком месте телефон его показывает ?

Нужен какой-то патч на C3322i, C3322, C3592, B5722, S5610, E1080, E1081, и прочие Swift/Infineon ? Обращайтесь в ЛС или E.F2065@gmail.com

Ссылка на комментарий
Поделиться на другие сайты

Судя по всему, лежит он только под аккумулятором.

По крайней мере, я в своем еепроме его не нашел.

Мы рождены, чтоб сказку сделать пылью...

 

VishnyaSoft.com - мои программы и мидлеты для телефонов Samsung

 

Классификация телефонов Samsung

 

Угадай название телефона

Ссылка на комментарий
Поделиться на другие сайты

показывать не показывает но в ответ на определенную АТ команду дает серийник

Жизнь - пьяный поэт, я - слово.

Я жесток и грустен, когда ему херово.

Жизнь - старый поэт, жизнь - усталый поэт,

А я... Что я? Его инструмент!...

 

Разработка Broadcom: http://www.rk-team.net/

Новости проекта QuB на Twitter

Ссылка на комментарий
Поделиться на другие сайты

показывать не показывает но в ответ на определенную АТ команду дает серийник

На какую ?

 

список команд:

D780XEHE1 AT Commands list

A.B.D.D>.E.H.I.L.M.N.O.P.Q.T.S.S0.S1.S2.S3.S4.S5.S6.S7.S8.S10.S11.S95.

V.W.X.Z.&C.&D.&F.&K.&S.&V.&W

 

D780XEHE1 AT+ Commands list

KEY.KSTR.KEYTRACE.BANDSEL.SLEEP.SWVER.HIDSWVER.LTCT.RADIO.BATGETTABLE.

BATGETLEVEL.BATUPDATE.BTEDUTM.BTSTART.BTSTOP.BTSEARCHWITHACK.BTPCMTS.

BTPCMTE.MTV.CPROT.TSSPCSW.TSSDST.SOS.CBC.CBST.CCLK.CEER.CGMI.CIMI.CGMM.

CGMR.CGSN.GCI.CHUP.CIND.CMEC.CMEE.CMER.CMOD.CNUM.COPS.CPAS.CPBF.CPBR.

CPBS.CPBW.CR.CRC.CREG.CPIN.SIMDT.CFUN.CRLP.CSCS.CSQ.CSTA.CMGD.CMGF.CMGL.

CMGR.CMGS.CMGW.CMGM.CMSS.CNMI.CRES.CPMS.CSAS.CSCA.CSDH.CSMP.CSMS.GCAP.GMI.

GMM.GMR.GSN.ICF.IFC.IPR.FCLASS.#CLS.CGQREQ.CGQMIN.CGDCONT.CGACT.CGDATA.

CGPADDR.CGSMS.CGCLASS.CGATT.CGREG.GPRSCELL.CGEQREQ.CGEQMIN.INFO.ORGI.ORGR.

ORGW.ORGD.OMMI.OMMR.OMMW.OMMD.FSIF.FSCD.FSDI.FSDL.FSFE.FSFR.FSFW.FSSL.

FSCI.FSFN.FSST.LOCK.FORTE.CAPTURE.FLIP.SETLOWBATTERY.INSERTCARD.REMOVECARD.

REMOVEEARMIC.INSERTEARMIC.TRACE.BLOCK.VTD.HEADERINFO.HEADERINFOSHOW.BLTON.

BLTOFF.KYDON.KYDOFF.VIBON.VIBOFF.TSMDON.TSMDOFF.SIMPTST.IMEINUM.LEVLOCK.

KEYCHKON.KEYCHKOFF.BLUETH.AVTEST.PHLOCK.FACTORYRST.NETCODE.MAINLCD.SUBLCD.

INTCAMERAPREVIEW.EXTCAMERAPREVIEW.VIBRATOR.RECEIVER.SPKMELODY.SVCLED.

CAMERAFLASH.MAINLCDBL.SUBLCDBL.KEYBL.MPTEST.LOOPBACK.KEYHOLD.QR.ML.CAMERA.

D*98.D*99.112.*98.

Нужен какой-то патч на C3322i, C3322, C3592, B5722, S5610, E1080, E1081, и прочие Swift/Infineon ? Обращайтесь в ЛС или E.F2065@gmail.com

Ссылка на комментарий
Поделиться на другие сайты

NeO_2kX,

Ну если подумать… SN вроде нигде в мобиле не записан ?

Остаётся IMEI… но если бы был алгоритм - то вероятно бы сервисный пароль делался бы из IMEI (как у нокий к примеру - он вычисляется из IMEI).

Но раз он прописан в EEPROM - то вероятно он генерируется случайно, и у самсунга просто есть база данных с этими кодами.

 

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

Обожаю свою жену Анюточку! =)

Ссылка на комментарий
Поделиться на другие сайты

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

 

Пароль остается тем же. Хотя, как мне кажется, он и не обязан меняться, так как официально Imei прошивается один раз на заводе.

Ссылка на комментарий
Поделиться на другие сайты

Для x700 'секретный код' оказался равным 0x6e54471.

Преобразуем его в нормальный вид:

	0x6e54471 - 0x9a1d85 = 0x64B26EC = 105588460 => код = 05588460

Коды для других телефонов (не проверены)

E730 - 40205192

D500 - 38298753

D600 - 37417600

D900 - 89286480

Это как я понимаю, при запросе ввода пароля, вводишь данный код и он блокировка пройдена???

Сложность программы растет до тех пор, пока не превысит способности программиста!!!
Ссылка на комментарий
Поделиться на другие сайты

Это как я понимаю, при запросе ввода пароля, вводишь данный код

да, но только во время включения телефона...

Ссылка на комментарий
Поделиться на другие сайты

да, но только во время включения телефона...

вот оно что, а я просто так пробовал :67:

А так при включении и вправду подходит :(

Сложность программы растет до тех пор, пока не превысит способности программиста!!!
Ссылка на комментарий
Поделиться на другие сайты

так как официально Imei прошивается один раз на заводе.

NeO_2kX :(

В сервисных центрах он тож официально прошивается. :67:

В России три способа обмена информацией: воровство, грабеж и обмен награбленным (Б. Гейтс)

Ссылка на комментарий
Поделиться на другие сайты

В свифтах есть ОТП со времен Д500 два разных отп - один во флешке другой в проце, отп во флешке вроде можно прописать, в проце идет RSA авторизация в виде правильно зашифрованого секретным RSA ключом серийного номера с добавкой. В общем на старых без мсл возможно что такой код туда(в одну из ОТП) записан. Серийник и мсл в ОТП телефона. Почему не имей - вероятно для того чтобы в сервисах можно было его менять, многие платы восстанавливаются после замены.

PS интересен этот код на полностью стертом епроме.

 

Судя по всему, лежит он только под аккумулятором.

По крайней мере, я в своем еепроме его не нашел.

Да в старых с мсл типа D900 E500 E780 E380 E250 старых версий лежит серийник в епроме рядом с шифрованным имеем и мсл, в новых с мсл только в RAM епром копируется в таком виде, в старых тоже наверно лежит в какомто блоке преобразованный.

Изменено пользователем alex999_
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


×
×
  • Создать...