Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2013, 17:20   #1
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
Лампочка Загрузчик своими руками

Всех приветствую! Возникла необходимость запаролить свой ноут на стадии загрузки. Читал темы вроде "MBR своими руками" от Мыщьха. Теорию понял.

Проблема заключается в том, что надо передавать управление разным загрузчикам. То, что загручик придется писать в MBR, ясно.

На винчестере 3 раздела: 1 - UFS (FreeBSD, загрузчик FreeBSD), 2 - UFS (нет ОС), 3 - HFS+ (OSx86, загрузчик Clover/Chameleon).

От загрузчика требуется считать пароль с клавиатуры и сверить его с зашитым в него. Если пароль верен, то спросить, с какого раздела грузиться; если нет - предоставить ввод заново

Подскажите, что надо почитать.

P.S. Grub не хочу ставить - сразу все будет ясно
Berlioz вне форума Ответить с цитированием
Старый 16.02.2013, 19:15   #2
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию

О чём именно почитать? Если дело касается вывода подсказок и ввода пароля и номеров разделов читай функции ввода/вывода биос, можно у всем известного Зубкова.
Alchemic вне форума Ответить с цитированием
Старый 16.02.2013, 19:41   #3
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию

Меня интересует как правильно его сделать(смещения и прочая атрибутика) и как правильно передавать управление загрузчикам на разделах

про ввод: знаком с int 0x10 и int 0x16
Berlioz вне форума Ответить с цитированием
Старый 16.02.2013, 19:57   #4
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Интересно, а зачем в принципе весь этот изврат? Ведь все равно как и стандартный пароль на вход в систему твоя система "ломается" либо подбором, либо переустановкой виды. Если уж идти в направлении жестокой защиты не проще ли сваять на Attiny13 простенький интегрированный девайс комутирующий питание ноута по определенной комбинации с клавы? Это конечно печальный вариант, но уж точно веселей чем программировать "синий экран"
execom вне форума Ответить с цитированием
Старый 16.02.2013, 20:19   #5
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию

Не хотите Граб, ставьте Симона:
http://www.symon.ru/usr/rus/about.shtml
А если хотите писать собственный загрузчик, то начинайте. Напишите хотя бы начало, которое выводит запрос на ввод пароля. А там, уже дальше двигайте.
Alchemic вне форума Ответить с цитированием
Старый 17.02.2013, 12:36   #6
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от execom Посмотреть сообщение
Интересно, а зачем в принципе весь этот изврат?
У меня, прежде всего, спортивный интерес. К тому же учусь на информационной безопасности. В будущем хочу взять это дело на тему дипломной работы.
Berlioz вне форума Ответить с цитированием
Старый 17.02.2013, 12:44   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

отдизасмите текущую мбр и посмотрите как работает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.02.2013, 12:51   #8
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию

Berlioz, если желание разбираться не пропало, могу предложить мой киберпанковский изврат. Программа запускается из mbr, копирует себя по новому адресу и передаёт на него управление, потом повторяет это опять, доходит до границы 640 кб и начинает копирование вновь с нижних адресов. Ничего сложного, есть интерес, разбирайтесь, разберётесь, тогда и загрузчик писать легче будет. Компилируется фасмом, получается образ дискеты, который используете в качестве загрузочного для любой виртуальной машины.
Код:
format binary
USE16
_start:	
	xor		ax, ax
	mov		ss, ax
	dec		ax
	mov		sp, ax
	push	cs
	pop		ds
	call	  @f	
szOut 	db	'Clon '
Clon	dd	0, 0
		db	': '
dwStartSegment	dd	0
				db	':'
				
dwStartAddress	dd	0
				db	' '		
hYear	dw	0
lYear 	dw	0
		db  '.'
Month 	dw	0
		db  '.'
Day 	dw	0
		db  ' '	
Hour	dw	0
		db ':'
Min		dw 0
		db ':'
Sec 	dw 0	
		db ' TSC: '
TimeStamp	dd 0, 0, 0, 0		
print_size = $-szOut
case_start	db 0
start_char	dw 7C00h
counter:	dd 0
leds		db 1
			db 10b, 100b, 1b	
@@:
	pop		ax	
	mov		bp, ax
	sub		ax, szOut	
	xchg	ax, bp
	mov		si, dwStartAddress
	add		si, bp
	sub		ax, szOut-_start
	call	w2ah
	mov		ax, cs
	mov		si, dwStartSegment
	add		si, bp	
	call	w2ah
	mov		si, case_start
	add		si, bp
	mov		al, [si]
	test	al, al
	jnz		@f
	sti
	mov		[si], byte 0FFh
	mov		ax,	0003h	
	int		10h		
@@:
	mov		al, 0Bh
	out		70h, al
	in		al, 71h
	and		al, 11111011b	
	out		71h, al
	mov		al, 32h	
	out		70h, al
	in		al, 71h
	mov		si, hYear
	add		si, bp
	mov		dx,  b2ah
	add		dx, bp
	call	dx
	mov		al, 9h	
	out		70h, al
	in		al, 71h
	mov		si, lYear
	add		si, bp	
	call	dx
	mov		al, 8h	
	out		70h, al
	in		al, 71h
	mov		si, Month
	add		si, bp
	call	dx
	mov		al, 7h	
	out		70h, al
	in		al, 71h
	mov		si, Day
	add		si, bp
	call	dx
	mov		al, 4h	
	out		70h, al
	in		al, 71h
	mov		si, Hour
	add		si, bp
	call	dx
	mov		al, 2h	
	out		70h, al
	in		al, 71h
	mov		si, Min
	add		si, bp
	call	dx
	mov		al, 0h	
	out		70h, al
	in		al, 71h
	push	ax
	mov		si, Sec
	add		si, bp
	call	dx
	rdtsc
	mov		si, TimeStamp+8
	add		si, bp
	call	dw2ah	
	mov		eax, edx
	mov		si, TimeStamp
	add		si, bp
	call	dw2ah
	mov		si, counter
	add		si, bp
	mov		eax, [si]
	inc		dword [si]	
	mov		si, Clon
	add		si, bp
	call	dw2ah	
	mov		ax, 0B800h
	mov		es, ax
	xor		di, di
	mov		si, szOut
	add		si, bp
	mov		cx, print_size
	mov		al, 00001001b
	cld
@@:
	movsb	
	stosb	
	loop	@b
	mov		si, start_char
	add		si, bp
	mov		bx, si	
	mov		si, [si]	
	mov		di, 2*80
	mov		cx, 80*24
	mov		ah, 00011010b			
_displayLoop:
	lodsb
	stosw
	cmp		si, ProgSize
	jb		@f
	xor		si, si
@@:		
	loop	_displayLoop
	mov		dx, si	
	mov		al, 0h	
	pop		ax
	test	al, 10h
	jnz		_notMove	
	mov		si, bx		
	cmp		dx, ProgSize
	jb		@f
	xor		dx, dx	
@@:
	mov		word[si], dx
	mov		bx, gs
	cmp		al, bl	
	jz		_notMove
	mov		gs, ax
	mov		si, leds
	add		si, bp	
	xor		bx, bx
	mov		bl, [si]	
@@:	
	in		al, 64h
	test	al, 10b
	jnz		@b
	mov		al, 0EDh
	out		60h, al
@@:	
	in		al, 64h
	test	al, 10b
	jnz		@b		
	mov		al, [si+bx]
	out		60h, al
	inc		bl
	test	bl, 100b
	jz		@f
	mov		bl, 1	
@@:
	mov		[si], bl
_notMove:
	mov		si, _start
	add		si, bp
	xor		di, di
	mov		cx, ProgSize
	shr		cx, 2	
	mov		ax, cs	
	cmp		ax, 9FC0h
	ja		_startSeg
	cmp		ax, 1000h
	jb		_startSeg	
	add		ax, 20h
	jmp		_startProgCopy
_startSeg:
	mov		ax, 1000h
_startProgCopy:	
	mov		es,  ax
rep movsd
	push	es
	xor		ax, ax
	push	ax
	retf
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                            dw2ah, w2ah, b2ah
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; b2ah - convert word to hex ansii string
; w2ah - convert word to hex ansii string
; dw2ah - convert dword to hex ansii string
;eax - date for convertion
;si - buffer fo string (size of data + 1 byte for 'h')
b2ah:	
	mov		bx, 1
	jmp		@startConv
w2ah:	
	mov		bx, 3
	jmp		@startConv
dw2ah:		
	mov		bx, 7
@startConv:
	add		bx, si	
	push	edx	
@convert:	
	mov		edx, eax
	and		edx, 0Fh
	cmp		edx, 10
	jae		@ae10
	add		edx, '0'
	jmp		@to_buf
@ae10:
	sub		edx, 10
	add		edx, 'A'
@to_buf:
	mov		[bx], dl
	shr		eax, 4
	dec		bx
	cmp		bx, si
	jge		@convert	
	pop		edx	
	ret
align 4
ProgSize = $
db   200h-$-2 dup 0	
db 55h, 0AAh
Alchemic вне форума Ответить с цитированием
Старый 19.02.2013, 13:44   #9
Berlioz
Изучающий C и ASM
Пользователь
 
Регистрация: 25.05.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Alchemic Посмотреть сообщение
Berlioz, если желание разбираться не пропало, могу предложить мой киберпанковский изврат. Программа запускается из mbr, копирует себя по новому адресу и передаёт на него управление, потом повторяет это опять, доходит до границы 640 кб и начинает копирование вновь с нижних адресов. Ничего сложного, есть интерес, разбирайтесь, разберётесь, тогда и загрузчик писать легче будет. Компилируется фасмом, получается образ дискеты, который используете в качестве загрузочного для любой виртуальной машины.
Спасибо большое! Уже изучаю
Berlioz вне форума Ответить с цитированием
Старый 19.02.2013, 15:04   #10
Alchemic
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 53
По умолчанию

Тут немного не точно написал. Образ дискеты не получается, только mbr. Что бы получился именно образ стандартной дискеты 1.44 надо в конец кода дописать:
Код:
@end_prog:
db 1474560-@end_prog dup 0
Alchemic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аутентификация своими руками(с++) Rock145 C/C++ Сетевое программирование 0 30.06.2012 19:21
Хостинг своими руками. maer Свободное общение 10 02.03.2011 14:28
firewall своими руками badfilin Общие вопросы C/C++ 0 24.01.2010 22:14
Проигрыватель своими руками Prisian Мультимедиа в Delphi 2 01.09.2008 16:09
StrechDIBits своими руками BOBAH13 Win Api 3 22.07.2008 14:52