программирование

Подписчиков: 204     Сообщений: 578     Рейтинг постов: 6,981.9

программирование geek OSDev операционная система разработка ассемблер длиннопост 

ОСдев №9: основной загрузчик, часть 2. Работа с дисплеем при помощи функций BIOS.

Дисклеймер: эта серия постов не про UEFI. Это не значит, что я не знаю о существовании UEFI. Про UEFI будет отдельная серия постов. Почему я не пишу про UEFI прямо сейчас? Потому что UEFI - это уровень абстракции над железом, а мне интересно именно железо и работа с ним.

Продолжаем? Сейчас наш загрузчик второго уровня работает в "немом" режиме - без возможности подать сигнал об ошибке или выполнении операции. Это необходимо исправить. Самое очевидное решение - вывод информации на дисплей. Мы уже условились, что на нынешнем этапе для работы нашей ОС будет необходима VGA-совместимая карта и дисплей, так что вправе рассчитывать на их наличие.

Программирование VGA-контроллера - сложная штука. Однажды мы ею обязательно займёмся, но сейчас, раз уж мы всё ещё в Реальном режиме, есть вариант попроще: функции BIOS. Функции, связанные с работой дисплея, доступны через прерывание 10h. Мы уже пользовались им для вывода текста в первичном загрузчике, но так как теперь мы не ограничены в размере программы, функционал можно будет расширить.

Первое, что нам стоит сделать - установить нужный видеорежим на случай, если BIOS этого не сделала. Кроме того, понадобятся функции считывания положения курсора, прокрутки экрана и вывода строки. Весь код, связанный с вводом/выводом будет храниться в отдельном файле. У меня он называется io.inc. Мы ещё не использовали подключаемые файлы, но ничего сложного тут нет: в TASM они объявляются директивой include, после которой идёт путь и имя файла. Единственная тонкость тут в том, что подключенный файл не будет вынесен в какую-то изолированную область памяти, как это делается в языках высокого уровня, а окажется в исполняемом файле именно там, где был объявлен. Поэтому лучше объявлять подключаемые файлы где-нибудь в конце, за пределами основного кода.

VGA имеет набор стандартных режимов отображения, с которым можно ознакомиться тут:

http://www.columbia.edu/~em36/wpdos/videomodes.txt

Нас интересует режим номер 3 - 80х25 символов, 16 цветов. Для его включения создадим в файле io.inc процедуру set_vmode3. Её полный текст будет выглядеть так:

set_vmode3 proc
                                  push ax
                                  push bx
                                  pushf


                                  xor ax,ax
                                  mov ah,0Fh
                                  int 10h
                                  cmp al,03h
                                  je @@exit_good


                                  mov ax,0003h
                                  int 10h


                                  xor ax,ax
                                  mov ah,0Fh
                                  int 10h
                                  cmp al,03h
                                  jne @@exit_bad


@@exit_good:          mov byte ptr vmode,al
                                  mov byte ptr vcol,ah
                                  mov byte ptr vrow,19h
                                  mov byte ptr vpage,bh


                                  popf
                                  clc
                                  pop bx


                                  pop ax
                                  ret


@@exit_bad:            popf
                                  stc
                                  pop bx
                                  pop ax
                                  ret
set_vmode3 endp

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

                    xor ax,ax                    mov ah,0Fh
                    int 10h
                    cmp al,03h
                    je @@exit_good

Этот блок нужен для того, чтобы остановить выполнение процедуры, если режим 3 уже установлен. Сначала регистр AX обнуляется, чтобы мы точно знали его значение. Функция 15 (0Fh) прерывания 10h возвращает в регистре AL номер установленного режима. Далее мы сравниваем результат с нужным значением (3), и если они равны, то переходим к завершению процедуры, метка @@exit_good. Если режим 3 не установлен, продолжаем.

                    mov ax,0003h                    int 10h

Здесь мы опять вызываем прерывание 10h со следующими параметрами: AH = 0(функция 0, установка видеорежима), AL = 3(номер режима). После этого снова идёт проверка режима. Если AL всё ещё не равен 0 - вероятно, возникла проблема, которую мы не сможем решить. Переходим к метке @@exit_bad. Если AL равен 3, продолжаем от @@exit_good. Первым делом - сохраняем в переменные параметры режима, которые вернуло прерывание 10h. В AL - номер режима; в AH - количество колонок символов; в BH - активную страницу видеопамяти (об этом позже). Параметр vrow не возвращается, потому что технически количество символьных строк ограничено только объёмом видеопамяти, а не размером дисплея. После этого восстанавливаем сохранённые в начале регистры, устанавливаем CF (флаг переноса) в нужное положение и завершаем процедуру.

Готово. Теперь в основной модуль после call read_BPB добавляем call set_vmode3 и после этого jc panic. JC - инструкция условного перехода. Переход выполняется при установленном флаге CF. То есть, если наша процедура set_vmode3 завершилась неудачно, программа продолжится от метки panic. Так как невозможность установить видеорежим говорит либо о серьёзных неполадках, либо о несовместимом оборудовании, продолжать выполнение смысла нет. После метки panic останавливаем программу инструкциями cli и hlt.

Далее стоит вывести какое-нибудь приветствие или заголовок, просто чтобы уведомить пользователя о том, что программа работает. Для этого первым делом стоит узнать положение курсора, ведь на экране скорее всего уже есть какой-то текст от BIOS. Это тоже можно сделать с помощью прерывания 10h. Добавьте в io.inc процедуру get_cursor_pos:

get_cursor_pos proc                                      push ax
                                      push bx
                                      push cx
                                      push dx
                                      pushf


                                      mov ah,03h
                                      mov bh,byte ptr vpage
                                      int 10h
                                      mov byte ptr cursor_X,dl
                                      mov byte ptr cursor_Y,dh


                                      popf
                                      pop dx
                                      pop cx
                                      pop bx
                                      pop ax
                                      ret
get_cursor_pos endp

Про сохранение/восстановление используемых регистров объяснять больше не буду, а в остальном тут всё просто: вызываем функцию 3 прерывания 10h, в BH передаём активную страницу видеопамяти. Прерывание возвращает в DL позицию курсора по X, а в DH - по Y. Сохраняем в переменных. Готово. Далее нам понадобится процедура для прокрутки содержимого дисплея. Тут чуть сложнее, добавьте в io.inc:

scroll_up proc                                     push ax
                                     push bx
                                     push cx
                                     push dx
                                     pushf


                                     mov ah,06h
                                     mov bh,CS_DEFAULT
                                     xor cx,cx
                                     mov dl,byte ptr vcol
                                     dec dl
                                     mov dh,byte ptr vrow
                                     dec dh
                                     int 10h


                                     popf
                                     pop dx
                                     pop cx
                                     pop bx
                                     pop ax
                                     ret
scroll_up endp

Функция прокрутки экрана BIOS требует, во-первых, цветовую схему, которой будут заполнены очищенные строки, а во-вторых, координаты верхнего левого и правого нижнего углов сдвигаемой области. Цветовая схема передаётся в регистре BH и состоит из цвета фона и цвета символа. Мы ещё не объявляли константы, давайте посмотрим, как это делается. Константы в отличие от подключаемых файлов можно объявлять где угодно, так как они нужны только на этапе компиляции и не попадают в исполняемый файл. В TASM для объявления констант используется инструкция equ. Вся конструкция выглядит так: ИМЯ КОНСТАНТЫ equ ЗНАЧЕНИЕ КОНСТАНТЫ. Так как в стандартной палитре третьего режима всего 16 цветов, уместно будет определить их в виде констант. Добавьте в код такую запись:

;Цвета фона.BC_BLACK               equ byte ptr 00h
BC_BLUE                 equ byte ptr 10h
BC_GREEN              equ byte ptr 20h
BC_CYAN                 equ byte ptr 30h
BC_RED                   equ byte ptr 40h
BC_MAGENTA          equ byte ptr 50h
BC_BROWN             equ byte ptr 60h
BC_LIGHTGRAY      equ byte ptr 70h


;Цвета символа.
SC_BLACK               equ byte ptr 00h
SC_BLUE                 equ byte ptr 01h
SC_GREEN              equ byte ptr 02h
SC_CYAN                 equ byte ptr 03h
SC_RED                   equ byte ptr 04h
SC_MAGENTA         equ byte ptr 05h
SC_BROWN             equ byte ptr 06h
SC_LIGHTGRAY      equ byte ptr 07h
SC_DARKGRAY       equ byte ptr 08h
SC_LIGHTBLUE       equ byte ptr 09h
SC_LIGHTGREEN   equ byte ptr 0Ah
SC_LIGHTCYAN      equ byte ptr 0Bh
SC_LIGHTRED        equ byte ptr 0Ch
SC_LIGHTMAGENTA equ byte ptr 0Dh
SC_LIGHTBROWN  equ byte ptr 0Eh
SC_WHITE               equ byte ptr 0Fh


;Несколько готовых цветовых схем.
CS_DEFAULT           equ BC_BLACK or SC_CYAN
CS_CLASSIC           equ BC_BLACK or SC_LIGHTGRAY
CS_DARK                 equ BC_BLACK or SC_DARKGRAY
CS_BLUE                 equ BC_BLUE or SC_LIGHTBLUE
CS_ALARM              equ BC_BLACK or SC_RED
CS_DEBUG              equ BC_BLUE or SC_WHITE
CS_INVERT             equ BC_LIGHTGRAY or SC_BLACK
CS_PANIC                equ BC_RED or SC_BLACK

Как видите, для передачи цвета фона/символа используется один байт. Нижние 4 бита отвечают за цвет символа, верхние - за цвет фона и некоторые другие эффекты (подчёркивание, мигание), которые нам сейчас не нужны. Теперь разберёмся с рабочей областью. Мы хотим сдвинуть вверх весь экран, поэтому верхняя левая точка будет в (0,0), а правая нижняя - в (число символов по X-1,число символов по Y-1). Первая передается в CX, вторая - в DX. Таким образом, код процедуры расшифровывается так:

AH=номер функции (6)BH=цветовая схема
CX=верхний левый угол рабочей области (0,0)
DX=правый нижний угол
Вызвать прерывание 10h

Процедура принимает число строк, на которое нужно прокрутить экран вверх, в AL. Добавьте после jc panic такой код:

                           call get_cursor_pos                           mov al,01h
                           call scroll_up

Последнее, что мы рассмотрим сегодня - вывод строки. Это функция 19 прерывания 10h. В качестве параметров она требует: сегмент и смещение строки в ES:BP; цветовую схему в BL; активную страницу видеопамяти в BH; позицию начала вывода по X в DL; позицию начала вывода по Y в DH; длину строки в CX; режим вывода в AL. Номер функции как всегда передаётся в AH.

Зная всё это, давайте подумаем, как организовать процедуру. В принципе тут всё почти однозначно, но что\ делать с длиной строки? Заносить в CX вручную перед каждым вызовом процедуры? Можно, но зачем раздувать код. Лучше включить эту информацию в саму строку. Например, приняв, что первые 16 бит строки будут содержать число символов в ней. У меня строка с заголовком загрузчика выглядит так:

str_title          dw 31                                                     ;Длина строки.                      db '=== Tardigrada Loader v.1.1 ==='    ;Строка.

Теперь давайте напишем саму процедуру в io.inc.

print_string proc                                   push ax
                                   push bx
                                   push cx
                                   push dx
                                   push bp
                                   push es
                                   pushf


                                   mov ax,0050h
                                   mov es,ax
                                   mov ax,1300h
                                   mov bh,byte ptr vpage
                                   mov cx,es:[bp]
                                   mov dh,byte ptr cursor_Y
                                   mov dl,byte ptr cursor_X
                                   add bp,0002h
                                   int 10h


                                   popf
                                   pop es
                                   pop bp
                                   pop dx
                                   pop cx
                                   pop bx
                                   pop ax
                                   ret
print_string endp

Наша процедура будет принимать два параметра: смещение строки в BP и цветовую схему в BL. Практически весь код - это заполнение регистров для вызова прерывания. В основном модуле после call scroll_up добавим:

                                   mov bl,CS_DEFAULT                                   mov bp,offset str_title
                                   call print_string
                                   mov al,01h
                                   call scroll_up

Этот код выведет заголовок и прокрутит экран ещё на одну строку вверх. Если всё сделано правильно, должно получиться что-то вроде этого:

^ Bochs for Windows - Display
USER ,__£
m2
■+Щ
•te
ТА
Reset susPEno Rower-
Û *
ujf'tnu vvwet
ù ф
Please visit :
. http://bochs.sourceforge.net . http ://www.nongnu.org/vgab ios
Bochs UBE Display Adapter enabled
Bochs 2.6.10.sun BIOS - build: 01/05/20
^Revision: 13752 $ $Date:

Чистая дискета: https://drive.google.com/file/d/1Bold4ds8oEruHQ7fJZKHglVo7A2Vc5MR/view?usp=sharing

Исходники: https://drive.google.com/file/d/144cHXVlBskSiKt9zTAR1V535UQCeUyBL/view?usp=sharing

Bochs: https://drive.google.com/file/d/16k2Gpr7oPSekq4rAhmtBV0IPnIteDLlE/view?usp=sharing

Развернуть

программирование geek сквозь время 

ПРОГРАММИРОВАНИЕ-ВТИРАЯ ГРАМОТНОСТЬ ПЕРВАЯ ГРАМОТНОСТЬ ЛАЕТ ЗНАНИЙ. ВТОРАЯ-ПОЗВОЛЯЕТ РЕАЛИЗОВАТЬ СВОИ ЗНАНИЙ В ДЕЙСТВИИ.,программирование,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,сквозь время
Развернуть

реактор образовательный системный администратор it программирование Халява доброта позитив самообразование электроника песочница ...geek микроконтроллеры програмист подарочки 

Продолжу большой пак знаний, учение свет. Книги, справочники и видеокурсы для ИТ

Привет Джой
Вижу, что тут много тех кто хочет двинуть в ИТ и достигнуть новых горизонтов
Я помогу, тем что есть, а именно книгами, журналами, справочниками и видеокурсами

теперь интересные подборки
всем кто хочет начать работать с простыми микроконтроллерами
http://mirrors.pdp-11.ru/_books/Программирование/Микроконтроллеры/AVR Atmel/

для желающих начать изучать C++ вот такая подборка
http://mirrors.pdp-11.ru/_books/_books/Программирование/C++/

хорошая подборка по Java
http://mirrors.pdp-11.ru/_books/Программирование/Java/

очень серьезная сборка по цифровой обработке сигналов
http://mirrors.pdp-11.ru/_books/Обработка сигналов DSP, фильтры/

Занимающимся разработкой гаджетов понравится вот этот раздел
http://mirrors.pdp-11.ru/_books/Электроника/Справочники/

ps: помощь в виде сортировки книг будет в тему
Развернуть

реактор образовательный системный администратор it программирование програмист Халява доброта позитив самообразование подарочки ...geek не ожидал 

Пак знаний, учение свет. Видеокурсы.

И ещё раз привет Джой.
Скажу честно: Я не ожидал что предыдущий пост так будет востребован. Я обещал выложить ещё и видеокурсы если пост зайдёт. 

Пост "взлетел" Я держу слово и я учёл свою ошибку. Сразу выкладываю всё торрент-раздачей.

В данном паке видео лежит обучение по следующим темам:

CRACKER+DIY (разные поделки)

HACK+IT  (общие какие то файлы, не очень интересно.)

VIDEO_HACKER_NETWORKS (вот тут уже интереснее, тут работа с Wireshark)

VIDEO_Javascript (Курс по JS)
VIDEO_Reversing (Реверсинженеринг)

VIDEO_Swift (Курс по Apple Swift)

VIDEO_Yii2 (Курс по Yii2)

И приятный бонус в виде софта для обкатывания навыков по первым 3 категориям в архиве "Tools" 

Предупреждаю, ваш антивирус может тригернуться на этот архив. Это нормально.

(Внимание: Данный материал выкладывается в ознакомительных целях, и для защиты собственной инфраструктуры.
Взлом чужого оборудования преследуется по закону!)

И в виде извинений за косяк с первой раздачей приложу ссылки на интересные Telegram каналы.

Надеюсь вам будет полезен этот материал, рад был поделится.

ЗЫ: Вот виновник фэйла с раздачей. Сейчас он раздаёт вам этот и стрый торрент.

CPU: E5-2660V2

DDR3: 16gb ecc 

HDD: 2.5 TB ( по 500 (6 raid)) + ssd 120 под систему (ubuntu с proxmox)

за 500р купил на авито горизонтальный корпус.

не ожидал,реактор образовательный,системный администратор,it,программирование,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,програмист,Халява,доброта,позитив,самообразование,подарочки

Надеюсь вам понравились раздачи.
Да.
529 (60.5%)
Нет
25 (2.9%)
Мне пофиг.
320 (36.6%)
Развернуть

реактор образовательный it системный администратор мануал Образование программирование Халява программисты доброта позитив ...geek подарочки самообразование 

Пак знаний, учение свет.

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

Огромное количество учебников, статей для it-шников всех мастей. Прогеры, админы, начинающие it-шники и жалеющие ими стать. Есть также видео-курсы. Но их я пока заливать не стал. Это всё, для всех. Бесплатно. Я ничего не прошу в замен.
Акция продлится до воскресения включительно. А дальше я посмотрю по статистике. Общий объём данный 13.3 GB
Линк на раздачу
Пароль на вход "Реактор образовательный" Без ковычек
Можно качать как полным архивом, так и частями.

В раздаче read me файл с чуть более подробным описанием.

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

Отличный комментарий!

ну раз пошла такая пьянка, я бесплатно консультирую начинающих по питону https://t.me/syntactic_sugar
caxap2d caxap2d27.01.202117:27ссылка
+7.6
то что больше 41 раза подряд душить нельзя и так все знают

пидоры помогите Образование it программирование geek онлайн-образование много букв ФСИН песочница 

С чего начать свой путь в IT?

Собственно, вот такой вот я Алёша. Уже в марте стукнет 25, слишком поздно я начал осознавать четность своего существования, финансового положения, каких-либо перспектив нынешней профессии("Доблестный" сотрудник УФСИН). В общем, служба в этой системе такое себе удовольствие, из раза в раз лицезреть "Зону", её обитателей, их повадки и манеры - истощает морально.
К сути вопроса: Решительно настроен уйти из системы и податься в IT, но вот в чём загвоздка - я нихера в этом не шарю, хотя склонность была со школы (любил копаться в конфигах игр,). Следовательно нужно этому научиться! Как? Самостоятельное обучение возможно всегда, но мне нужна хоть какая-нибудь база, какой-никакой наставник, Падре, который направит на путь истинный. Пока гуглил что и как, наткнулся на онлайн образование, по типу Skillbox, Geekbrains. Пересмотрел кучу отзывов и роликов на YouTube про эти площадки, и вроде бы всё не так плохо, но решиться купить курсы не могу, особого доверия к качеству такого образования нет, да и денег эти курсы стоят не малых. К слову в моём родном мухосранске есть несколько заведений специализирующихся на обучении спецов в сфере IT, правда по очной форме обучения, чего я себе позволить не могу(2-3 дня в неделю по 4 пары, а график на работе - черт ногу сломит). По сему, спрашиваю у вас, уважаемые, что можете сказать про онлайн образование, стоит ли обучаться на этих площадках или лучше рвать свою попку и пытаться ходить в вузы паралельно с работой?
ПРЕДСТАВиТЕЛи НЕТРАДиЩЮННОй СЕКСУАЛЬНОЙ ОРиЕНТАЦии, НЕОБХОДиМО ВАШЕ СОДЕйСТВиЕ ВНИМАНИЕ! ИСПОЛЬЗУЙТЕ КУПОН ТОЛЬКО в КРАЙНЕЙ НЕОБХОДИМОСТИ JoyReactor APPROVED ГОДЕН ДО : 01.01.2033,пидоры помогите,реактор помоги,Образование,it,программирование,geek,Прикольные гаджеты. Научный, инженерный и
Развернуть

песочница программирование geek терпение профессиональный юмор it юмор 

Железное терпение



18 марта 2013:

— Окей, это великолепно. Я протестирую и добавлю это в код, как только доберусь до дома. Спасибо.


17 декабря 2020:

— Извините, что тороплю, но вы уже добрались до дома?
gkoberger commented on Mar 18, 2013 Owner © • •• Okay this is awesome. I'll test it out and merge when I get home. Thanks! v1993 commented on Dec 17, 2020 © - Sorry for rushing this a bit, but got home yet?,песочница,программирование,geek,Прикольные гаджеты. Научный, инженерный и айтишный
Развернуть

Отличный комментарий!

В это время gkoberger:
 .pW 3£r'« •••V
Katakime Katakime26.01.202116:32ссылка
+41.9

Need For Speed Игры nfs reverse engineering русская локализация программирование geek кириллица длиннопост много картинок 

Как я реверсил кириллицу в русской локализации в играх серии Need For Speed времён Black Box

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

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

Но качество локализаций к данной статье не имеют отношения и не о них пойдёт речь. А речь пойдёт о том, как мне удалось расшифровать русскую локализацию, чтобы в будущем каждый мог изменить строки как захочется.

Осторожно, много скринов!

С чего всё началось?

А началось всё с этого мема:

Рашка приплетена!
Разъебал по фактам Время срача
Приз от навального Репутация за срач Репутация за стрелы
_ Навыки либерахи
валить в сша вИ1«>олу.#<тьпмАы
О Рос гвардии,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный,

Да. К политике нынешней данный мем особо отношения не имеет, да и не должен.

Данный скриншот был сделан в игре Need for Speed: Undercover 2008 года. Сама игра по себе является проходняком, ибо сделана на коленке (на самом деле EA тупо торопила разработчика лишь бы выпустить продукт).
Но вот текст на этом меме был отфотошоплен очень криво и с неправильными шрифтами (оригинальные шрифты для игры — Aquarius Medium и Light для заголовка, Helvetica Neue STD для обычных текстов в данном окошке)
Мне это, скажем так, изрядно не понравилось и я поставил себе цель воссоздать этот мем методами самого геймплея этой игры.

И это звучит достаточно легко в теории, но на практике это что угодно, кроме «легко». Было.


Как и Чем

Первым делом я решил полезть в ресурсы игры. Для этих дел есть разработанная моддерским сообществом программа Labrune за авторством nlgzrgn

*“ Labrune - D:\GAMEZ STEAM\steamapps\common\Need for Speed Undercover\LANGUAGES\English_Frontend.bin File Edit Help
#0 - Frontend
ID	Hash	Label	Text
¡387	31D50F50	POSTRACE_YOU_DOMINATED	You Dominated!
388	3255EBD4	CUST_LOOKAHEAD_PAINT_WHEEL	Change your vehicles wheels and design
389	339077C4
Собственно, её интерфейс.

Она спокойно читает файлы игр, начиная с NFS: Underground вплоть до NFS: World, ибо вся линейка этих игр была сделана одним разработчиком на почти одинаковом движке (ходят слухи, что при разработке этих игр разрабы из-за торопливости не особо морочились убирать остатки старого кода со старых игр, а просто переносили всё в один компилятор и за счёт остатков, найденных в коде, выходили новые моды, сильно расширяюшие функционал игр (как пример этого — последняя версия Unlimiter'а для Most Wanted 2005, берущая часть функционала из NFS Underground 2)).

Читает спокойно до тех пор, пока не скормишь ей файл с русскими текстами

■* Labrune - D:\GAMEZ STEAM\steamapps\common\Need for Speed Undercover\LANGUAGES\Russian_Fi File Edit Help
#0 - Frontend
ID	Hash	Label	Text
1276	AC322 D 93	VINYL PART MER SLR 2TONE2	2
1277	AC322D94	VINYL PART MER SLR 2TONE3	3
1278	AC821745	CREDIT_ROLL_PRESENTS	c
1279	AC8761FE

Чё?

n© HxD - [D:\GAMEZ STEAM\steamapps\common\Need for Speed Undercover\LANGUAGES\Russian_Frontend.bin]	—	□ X
• File Edit Search View Analysis Extras Window ?	_ & x
!	| <$> M 16
Polish_Global.bin *2] Russian_Frontend.bin
Offset(h)	00	01	02	03	04	05	06	07	08	09	ÖA	03	OC	OD	OE	OF	
00006690	82	20	83

И Hex-редактор тоже не может помочь. Выделенная фраза означает «Ты лидер!». Как я узнал - читайте дальше.

Вместо текстов в лучшем случае кракозябра, в худшем случае пустота. На момент написания статьи не исправлено/не воплощено.



И теперь самое интересное!

Тогда я решил править runtime память, если Labrune даже не хочет править файлы и даже сохранять их.

Открыв игру, предварительно выбрав английский язык, я сначала баловался с английским текстом, занимаясь поиском его положения через Cheat Engine и правя его.

Первый текст, который появляется при запуске Undercover, это PSA — Public Service Announcement, то бишь «не гоняйте пацаны вы матерям ещё нужны»

Need for Speed™ Undercover presents an Action Driving Experience. Pull these moves within the safety of your home ONLY. Do not take this kind of driving to the neighborhoods and streets in the real world.,Need For Speed,Игры,nfs,reverse engineering,русская

Вот он.

Вычислив адрес, с которого начинается этот текст, я решил изменить этот текст на что-нибудь интересное:

Need for Speed: Undercover is what happens when you want to make a yearly game but you forget to polish it. And yes, because you had to rush it for the late quarter release, there's a good amount of unused content in this game.,Need For Speed,Игры,nfs,reverse engineering,русская

Ундерковёр — яркий пример того, что происходит, когда ты пилишь разрабов чтобы они ежегодно выпускали игру уровня ААА, но при этом не дав времени её отделать. И да, из-за того, что тебе приходится выпускать игру чуть ли не под самый поздний квартал года, в игре обязательно будет много неиспользуемого контента.

Поискав нужные мне адреса конкретных строк, я начал их править.
И сразу скажу, изменения появлялись лишь только когда я убирал текст и снова вызывал для отображения. Сразу текст не меняется. То есть — для появления этого окошка мне приходилось перезапускать гонку.

RASHKA
	!!~WM_Vremya sra4a	1:10.39
, r		
IIJl	Cash	$260
	Wheelman Rep	3,000
	Zone Points (+Rep)	3,000
" i40L#,41 frf	CONTINUE® PLAY AGAIN®	STANDINGS ©,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный

Вот так всё начиналось. До русского текста ещё далеко. Мусор в начале второй строки «vremya sra4a» там из-за того, что я где-то убрал байт, отвечающий за начало текста и игра подхватила этот кусок для отображения.

Играться с англ текстом было детским садом, и всё же хотелось сделать по-русски.

Я перезапустил игру, сменив в стиме язык игры на русский
Игра, запустившись, выдала уже такое содержание:

Need for Speed™ Undercover - это симулятор вождения. Выполняйте эти трюки ТОЛЬКО в игре. Не пытайтесь повторить их в реальной жизни.,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный

Текст уже короче, и надо как-то узнать, под какими значениями идёт кириллица.

Благо у меня уже есть адрес для правки текста, сейчас я к нему обращусь, и…
И он уже бесполезен, потому что русский текст всегда длиннее, вследствие чего место прошлого текста уже занял мусор, так что нужно было искать новый адрес. Благо текст, как в прошлый раз, начинался с латиницы и кусок памяти с ней было легко найти.

PSA english
[ 1 PSA russian
2082B50D
212837CD
String[229] u?G_? ?Gw?M? J?ey? ???Gm? g??G? ?d??K[? G!?v? ?g??Ds G?C
Strinq[309] Need for Speed? Undercover - ? ??? ??. ??? ???????.? ??? ??■,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты.

Первая идея была такая — скопировать каждый отдельный символ, подразумевавший определённую букву в тексте, в блокнот и оттуда же закинуть в адрес своё. Было муторно записывать каждую кракозябру в блокнот, надеясь, что она поможет в дальнейшем.
Результат — неудовлетворительный.

Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,кириллица,длиннопост,много картинок

Как итог — в игре мусор…

PSA english
2082B50D String[229] u?0_? ?Ow?M? J?£y? ???0m? g??G? ?d??K[? 0!?v? ?g??Dg 0?C
PSA russian
2128S7CD String[B09] Need for Speed Undercover - $$$ $$$$$$$$$ $,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и

...и в Cheat Engine тоже.

Вторая и более правильная мысль — та, ради которой вы дочитали до этого момента — это зайти в содержимое памяти по нужному адресу (тыкнув Memory View или CTRL+B, выбрав нужный адрес) и прочитать байты, отвечающие за кириллицу.
Но перед этим дайте я игру перезапущу, чтобы игра выдала норм текст, ок?
Ок.

^ Memory Viewer	—	□ X
File Search View Debug Tools Kernel tools
nfs.exe+10082ED
Address Bytes	Opcode		Comment
nfs.exe+1008;53	push		
nfs.exe+1008;51	push	ecx	
nfs.exe+1008;52	push	edx	
nfs.exe+1008;56	push	esi	
nfs.exe+1008;57	push	edi	
nfs-jpxp tiooa:55	oush	shn		
push word or

Вот так выглядит память игры во время запуска процесса. На данный момент Memory Viewer показывает кусок памяти, начиная с адреса, который указывает на начало текста PSA. Выделенный байт 00 означает технический конец текста.

Стерев всё, что было в блокноте и написав шаблон алфавита для заглавных и строчных букв, я начал вглядываться в байты, записывая эквивалент буквы в блокнот.
То есть э — B9, т — 86, о — 81, пробел — 20, с — 88, и так далее…

Я решил проверить мою новую теорию, изменив вступительный текст с имеющимся байтами…

Need for Speed™ U недоделанная игра.
Gentera Style 204
ndercover - это,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,кириллица,длиннопост,много картинок

… и теория оказалась верной! «Gentera Style 204» стоит там из-за того, что я на тот момент не знал, что нужно ставить байт 00 для обозначения конца читаемого текста. Но само подтверждение теории меня очень обрадовало!

В ходе дальнейшего реверсинга байтов выяснилось, что исполнительный файл игры для отображения кириллицы использует байты от 81 примерно до FF, а также использует байт 80 совместно с другим соседним байтом справа для отображения других символов, например для отображения буквы ъ - 80 89, Ж - 80 83, Ю - 80 88, Щ — 80 80, и т.д.

В итоге за 2 дня тестирования я составил такую карту используемых символов кириллицы:

а -	- 82,	б	- 55,	в -	85,
д -	со о	е	- 84,	ё -	ЕЗ,
и -	- 83,	й	- 57,	к -	83,
и -	- 8F,	н	- 85,	о -	81,
р -	- 37,	с	- 88,	т -	86,
ф -	- F0,	X	- AD,	ц -	32,
ш -	- Аб,	щ	- 38,	ъ -	80 85
ь -	- 53,	3	- 35,	ю -	31,
А
д
и
м
F
Ф
ш
ь
53,	Б	-	DO,	3
5А,	Е	-	A3,	Ё
58,	Й	-	(FD)FE,
AF,	H	-

Скобки означают, что я на данный момент не уверен, какой из байтов используется для отображения такого-то символа, либо может использоваться комбинация этих байтов для отображения «Й»․ Отсутствующий байт у буквы Ё — значит я не нашёл байт от этой буквы, и не велика потеря — в тексте игры нет строк, где есть буквы ё и Ё — всегда е. Почему? Спросите у 1С-СофтКлаб или у самих Black Box.

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

03 1 Am Rock
Rock
04 In A Hood Near You Suni Clay Suni Clay
сдня не ндг>0
ii*1' .
Этот парень был из тех, кто просто любит жизнь.
02 Do Ya Thang
T.l. Presents The P$C 25 To Life
(±в] Последовательный В
Меню
Меню
Меню
Упорядочить
Ознакомление,Need For Speed,Игры,nfs,reverse

Ну и ещё.

Что было дальше?

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

а	-	83,	б	-	5С,	в	-
д	-	8D,	е	-	82,	ё	-
и	-	к со	W и	-	5D,	к	-
м	-	8Е,	н	-	85,	о	-
р	-	87,	с	-	88,	т	-
ф	-	ЗС,	X	-	32,	ц	-
ш	-	AF,	щ	-	СЗ,	ъ	-
ь	—	53,	3	—	37,	ю	—
А	—	51,	5	—	34,	3	—
Д	-	A3,	Е	-	57,	Ё	-
И	-	58,	W и	-	D7,	К	-
м	-	А8,	н	-	54,	О	-
F	-	55,	с	-	5Е,	Т	-
Ф	-	DO,	X	-	DE,	Ц	-

Это уже для ProStreet

а	-	V со	б	-	95,	в
д	-	8Е,	е	-	82,	ё
и	-	83,	W и	-	94,	к
и	-	8D,	н	-	86,	о
р	-	87,	с	-	88,	т
ф	-	34,	X	-	A4,	ц
ш	-	99,	щ	-	33,	ъ
ь	—	51,	3	—	А7,	ю
А	—	Аб,	5	—	36,	3
Д	-	AD,	Е	-	А5,	Ё
И	-	А2,	W и	-	ЗА,	К
м	-	32,	н	-	9D,	0
F	-	93,	с	-	9С,	Т
Ф	-	3F,	X	-	ЗЕ,	Ц
ш	-	О о	щ	-	С4,	ъ
ь	-	С1,

Это уже для Most Wanted (2005). Заметьте, комбинация байтов 80 XX тогда ещё не использовалась.


*скоро будут байты для NFS: Carbon, Underground и Underground 2*

Послесловие

Своей находкой я поделился с NFS комьюнити, автор проги заметил это и мне ответил:

nlgzrgn Yesterday at 23:21
Thanks for the information! If I update the tool. I'll create something to switch those characters to properly handle any language.,Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный

Я дальше не знаю, что под конец написать, поэтому вот вам котик

Need For Speed,Игры,nfs,reverse engineering,русская локализация,программирование,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,кириллица,длиннопост,много картинок

Хорошего дня!

Развернуть

Жак Фреско программирование geek it-юмор видео ООП 

Развернуть

Буквы на белом фоне twitter интернет программирование geek 

©Ривер
@__River_
Какую фразу можно сказать как во время программирования , так и во время секса?
Ща руками поправлю
Опять упал
Давай попросим Серегу посмотреть.
Этим языком не получится
Попробуй выйти и зайти заново
Главное - вирус не занести
Опять всё слетело
Так, надо посмотреть как
Развернуть
В этом разделе мы собираем самые смешные приколы (комиксы и картинки) по теме программирование (+578 картинок, рейтинг 6,981.9 - программирование)