Урок 12 - Взлом программы Strategic Commander

  1. Strategic Commander
  2. Взлом

Strategic Commander

Strategic Commander - это лучшая стратегическая игра для Palm.

Взлом

Пытаемся зарегистрироваться. Получаем сообщение из tSTR1b58.bin.

00009ab2   2f3c1b58044c			L1671	MOVE.L	#458753100!$1b58044c,-(A7)
00009ab8   600a					BRA	L1672
00009aba   2000					MOVE.L	D0,D0

А чуть ниже, в tSTR1c20.bin, лежит правильное сообщение о том, что все удачно прошло.

Для регистрации используется форма tFRM0a28.bin.

Ничего не понятно, буду искать с помощью вызова debug (4e48).

Ставлю 4e48 в 0000e25e... не получилось. В 0000e962... опять неудача. В 00018684... Ура. Оно. Так, отсюда мы идем на L4140. Чтобы разобраться, ставлю 4e48 на 00018688 и использую debuffer.

0005f4fc: 544f                adda.w    #$2, a7
0005f4fe: 6000 06d2           bra       #$6d2
0005f502: 377c 0005 0004      move.w    #$0005, $4(a3)
0005f508: 377c 000c 0006      move.w    #$000c, $6(a3)
0005f50e: 3f3c 03eb           move.w    #$03eb, -(a7)
0005f512: 1f3c 0002           move.b    #$02, -(a7)
0005f516: 4e4f a173           SysTrap FrmGetActiveForm
0005f51a: 2f08                move.l    a0, -(a7)
0005f51c: 4e4f a18b           SysTrap FrmSetControlGroupSelection
0005f520: 504f                adda.w    #$8, a7

Пойдем по шагам... Так, мы действительно прыгаем на L4140. Что дальше? А дальше Emulator падает... Пробуем ещё раз. 00018d60 в scmdr.prc.s - это 0005fc5a в debuffer'е.

00055a52: 1600                move.b    d0, d3

А 00055a52 в debuffer'е - это 0000eb58. Но это не похоже на правду... Пойдем другим путем: При выборе Medium Universe или более 2 игроков мы видим сообщения из tSTR1c84.bin и tSTR1ce8.bin.

Продолжаем попытки. Пройдя с 00018684 по шагам, доходим до первого (?) сравнения в 000187e2:

000187e2   5c4f                                 ADDQ.W  #6,A7

Попробую поставить debug, чтобы определить, в какой момент это происходит. Ага. Уже где-то после попытки ввода кода... Тогда на 00018690, чтобы узнать где происходит сравнение, в L4140 или тут. Похоже, что в L4140... Попробую поставить debug прямо на 00018d60 и проверить, используется ли тот код где-нибудь кроме регистрации. Безуспешно. Используется он, похоже, много где...

Буду искать, где выводятся окошки Info.

0000d504 - нет эффекта
00019a9a - тоже нет эффекта

00005502 - нет
0000dd98 - нет
000186e2 - ура, нашел. Тут оно. Debug вызывается до появления формы.

0001873c - 
00018796 - 
00018c24 - 
00019310 - 
00019958 - 

Попробую проверить 18706, надо найти, где именно открывается форма. Ага. 18706 уже после формы. Значит, форма открывается 186fc. Чтобы это проверить, ставлю debug на 18700. Форма все-равно открылась, значит, действительно открытие формы делается такой строчкой:

000186fc   4e4fa173				TRAP	#15,$A173 = sysTrapFrmGetActiveForm

Теперь проверю, используется ли это для вывода всех окон Info. Забавно, но нет. Только для вывода окошка после попытки выбора размера Small. :) Проверю теперь остальные 5 адресов выше.

0001873c - а вот это для Medium
00018796 - 
00018c24 - 
00019310 - 
00019958 - 

Да и предыдущие 4 (d504-dd98) тоже, наверное, что-то делали такое же.

Попробую посмотреть, как я попадаю на 186e2, где открывается это Info. На L4058 попадаю с 000186b8. Попробую его забить 4e71. Ура!!! Получилось! Теперь я могу спокойно нажимать на Sm., он выберется и я могу с этим размером играть!!! Ура! Осталось сделать то же самое для всех остальных. Это просто. Нахожу все $44c (выбор формы Info), ставлю после них 4e48, смотрю, что это за диалог и где он показывается. Потом для всех диалогов, которые мне не нужны, как, например, Small, я смотрю, откуда я туда перешел и забиваю 4e71. Возможно, так получится даже регистрация, но, совершенно точно, получится включить все размеры и любое число игроков. :))) Ура!

Итак, проверяем все ссылки на $44c. Перечислю их ещё раз:

000186e2 - Small size of Universe
0001873c - Medium size of Universe
00018796 - Large size of Universe
00018c24 - это не число игроков и ни одно из трех сообщений в регистрации
00019310 - аналогично
00019958 - аналогично
0000d504 - аналогично
00019a9a - аналогично
00005502 - аналогично
0000dd98 - аналогично

Так... Непонятно. Значит, эти сообщения выводятся как-то по другому...

Смотрим на

000186de   3f3c044c                     L4058   MOVE.W  #1100!$44c,-(A7)
000186e2   3f04                                 MOVE.W  D4,-(A7)
000186e4   600a                                 BRA     L4059

Хотя в -(A7) и копируется $44c, но шагом после копируется содержимое регистра D4... Интересно, а зачем. Ведь тогда $44c исчезнет. Поставил debug на 186e2. Запуситил debuffer и увидел, что D4=00041c84. Копируется только слово, то есть 1c84, а значит, это именно та строчка tSTR1c84.bin, где лежит сообщение про 'Tiny'!

А как в D4 попало это значение? Чуть выше мы видим

000186b4   382b0008                             MOVE.W  8(A3),D4
000186b8   6624                                 BNE     L4058

То есть 8(A3), что бы это не было, оказалось равным 1c84.

Но, что дальше делать, совершенно не понятно. Подойдем с другой стороны. Эти три сообщения выводятся в 000186fc, 00018756 и 000187b0. А проверим-ка остальные подобные команды рядом, например, 00018782. Ставим debug в 0001877e. Нигде эффекта не заметно... Тогда 000186a4, поставив debug в 000186a0. Забавно. Он реагирует на нажатие на Tiny...

Проверим 00018658. Неудача.

Ищем, где открывается форма настроек tFRM03e8.bin.

624a, 62a2, 9a24 - неудачно.

a87e, d3d8, e8da - что-то получилось. Ищем, где именно.

a87e - мимо.
d3d8 - мимо.
e8da - попал.

смотрим на форму a28 и ищем, где она появляется.

e962 - регистрация на start screen.
18684 - регистрация на экране настроек.

проверим 186a8

Что ж. Для начала откроем все размеры. 000186b8, 00018712, 0001876c. Забиваем 4e71. Работает любой размер.

Пробую разобраться с дебуфером с регистрацией (18684 или e962). Возможно здесь emulator не будет виснуть и удастся понять, где и куда идет что.

Пробуем отладку в 18688. Не проходит...

Пройдя немного дальше по коду после отключенных запретов на Small, Medium и Large, вижу

00018830   4a05					TST.B	D5
00018832   661c					BNE	L4071
00018834   2f3c13ec044c				MOVE.L	#334234700!$13ec044c,-(A7)
0001883a   600a					BRA	L4070
0001883c   2000					MOVE.L	D0,D0
0001883e   2000					MOVE.L	D0,D0
00018840   2000					MOVE.L	D0,D0
00018842   2000					MOVE.L	D0,D0
00018844   2000					MOVE.L	D0,D0
00018846   4eadf9d6			L4070	JSR	-1578(A5)
0001884a   584f					ADDQ.W	#4,A7
0001884c   60000338				BRA	L4114
00018850   0c440008			L4071	CMPI.W	#8,D4
00018854   6f1c					BLE	L4073
00018856   2f3c2580044c				MOVE.L	#629146700!$2580044c,-(A7)
0001885c   600a					BRA	L4072
0001885e   2000					MOVE.L	D0,D0

Сравнения... Значит, это то, что нужно. Смотрю на 18834 и 18856. Ищу соответствующие ресурсы и нахожу строчки про то, что не может быть больше 8 игроков и нужно хотя бы одного некомпьютерного. Ага! Надо найти в такой же форме сообщение о том, что не может быть больше двух и тогда... Это будет 1ce8044c. Ищем, находим.

00018c04   661a					BNE	L4122
00018c06   2f3c1ce8044c				MOVE.L	#484967500!$1ce8044c,-(A7)
00018c0c   600a					BRA	L4121

Ставим на 00018c04 безусловный переход на L4122. Видим в результате сообщение об ошибке, но про 'Tiny' universe... Зато находим пониже

00018c46   640c					BCC	L4125
00018c48   3f3c04b0				MOVE.W	#1200!$4b0,-(A7)
00018c4c   4e4fa19c				TRAP	#15,$A19C = sysTrapFrmPopupForm
00018c50   544f					ADDQ.W	#2,A7

Это вывод на экран формы добавления игрока. Это то, что нам нужно! Чтобы туда попать, нам нужно избежать перехода на 00018c46 и сделать прыжок на L4124. Смотрим, откуда. Ага!

00018bf6   6642                                 BNE     L4124
00018bf8   362b0008                             MOVE.W  8(A3),D3
00018bfc   673c                                 BEQ     L4124
00018bfe   0c6b1c840008                         CMPI.W  #7300!$1c84,8(A3)
00018c04   661a                                 BNE     L4122

Попробуем поставить на 00018bf6 безусловный переход и забить 00018c46. Все классно, добавляется. Но при запуске выводится сообщение о том, что регистрационный код потерян... (tSTR1e78.bin) Понятно. Он ещё и тут проверяет. :-(

Это происходит в

0000e2e4   620a                                 BHI     L2240
0000e2e6   206def58                             MOVEA.L -4264(A5),A0
0000e2ea   182801d0				MOVE.B	464(A0),D4
0000e2ee   671c					BEQ	L2242
0000e2f0   2f3c1e78044c			L2240	MOVE.L	#511181900!$1e78044c,-(A7)
0000e2f6   600a					BRA	L2241

Кстати, мы теперь знаем, как выглядит вывод окошек с сообщениями:

MOVE.L	#.......$<номер STR ресурса>044c,-(A7)

Попробуем забить e2e4. :) Ага. Игра автоматически сделала ход. А по тому, что после меня компьютер ходил два раза, я делаю вывод, что все получилось!!!!!! :)

Похоже, что мы победили. :) Подведём итоги. Надо в трех местах отключить запрет на большие размеры

000186b8	6624		4e71
00018712	6624		4e71
0001876c	6624		4e71

отключить

00018bf6	6642		6042
00018c46	640c		4e71

и отключить проверку

0000e2e4	620a		4e71
Урок 11 - TinySheet Урок 13 - FlipChart
TopList

Copyright © PalmPot.
Последнее обновление 03.02.2001.