Цитата:
Сообщение от Ёжик Пых
Bedolaga, по поводу Вашей идеи с DVD, не сказать чтобы ничего не получилось, получилось несколько не то .
Пересобрал Loading и опробовал. Если раньше при начале движения выскакивала надпись "Не отображается при движении" на синем фоне, то теперь при начале движения экран становится полностью черным и восстанавливается при остановке.
|
Оценил деликатность фразы "несколько не то"
такие результаты это скорее норма при взломе вслепую. Буду много думать. Напишу соображения чуть позже. Спасибо Дмитрий что нашел время на эксперимент.
---------- Добавлено в 13:41 ---------- Предыдущее сообщение было написано в 03:30 ----------
Буду делиться своими соображения порционно, по мере появления, если не против.
Получается пропатченый нами условный переход обходит фрагмент, который просто выводит на экран устройства надпись о запрете показа при движении, но сам запрет очевидно происходит где-то раньше. Это не ахти какой результат, но он хотя указывает на один из параметров, которые отвечают за этот запрет. Вывод надписи, получается, происходит если r5 == 1.
Причем, выше в процедуре loc_115798 значение регистра r5 нигде не устанавливается, т.е. оно фактически передается при вызове. Значит нужно искать место, откуда вызывается эта процедура. Возможно там содержится код, устанавливающий этот признак r5==1.
И вот тут возникает основная проблема: как узнать адрес кода, вызывающего процедуру loc_115798? С отладчиком это было бы тривиальной задачей: посмотрел бы в стек или содержимое регистра PR (Return address). Но с мертвым листингом это недоступно. И как теперь? IDA выдает единственную ссылку на loc_115798:
DATA XREF: .data:001926C4
т.е. это место в какой-то таблице, в которой и хранится адрес нашей процедуры. Значит ее вызов осуществляется где-то косвенным путем, через смещение data:001926C4 от начала этой загадочной таблицы.
В мануале, ссылку на который я приводил, описывается техника вызова функций через смещения в Глобальной Таблице Смещений (GOT). Видимо и здесь также. Нужно только подходящую таблицу найти. У меня вот кандидатура:
Код:
.data:00192218 aUi_dvdcontrold:.sdata "<<----------UI_DVDControlDepend End!!"
.data:00192218 ; DATA XREF: .text:off_DB65Co
в ней смещение для нашей процедуры: h'4AC
теперь можно тупо поискать по листингу обращения к функциям с использованием смещения h'4AC.
Их там порядком будет, но поппадаются и очень похожие на то, что нужно:
Код:
.text:0010278E loc_10278E: ; CODE XREF: .text:00102782
.text:0010278E mov.l @(h'1F4,pc), r3 ; [00102984 HideScreen@HMB_AbstractControl@@IAAXH@Z
.text:00102790 mov #h'25, r5
.text:00102792 mov.l @r3, r3
.text:00102794 jsr @r3
.text:00102796 mov r8, r4
.text:00102798 mov.w @(h'70,pc), r3 ; [0010280C] = h'250
.text:0010279A mov r8, r2
.text:0010279C add r3, r2
.text:0010279E mov.l @r2, r0
.text:001027A0 cmp/eq #1, r0
.text:001027A2 bf loc_1027A8 ; Неужто?
.text:001027A4 mov #2, r3
.text:001027A6 mov.l r3, @r2
.text:001027A8
.text:001027A8 loc_1027A8: ; CODE XREF: .text:001027A2j
.text:001027A8 mov.l @r8, r0 ; Неужто?
.text:001027AA mov.w @(h'56,pc), r3 ; [00102804] = h'4AC
.text:001027AC mov.l @(r0,r3), r3
.text:001027AE jsr @r3
.text:001027B0 mov r8, r4
интересно, что делает функция библиотечная HideScreen? Закрывает текущий экран, для последующего вывода, типа "Зарещено в движении"?