Пом­нишь, как на школь­ных уро­ках информа­тики тебя зас­тавля­ли изу­чать Basic? Так вот: это был ненас­тоящий Basic. А нас­тоящий, то есть REALbasic, теперь называ­ется Mojo Xojo, и на нем до сих пор пишут при­ложе­ния. Сегод­ня я рас­ска­жу тебе, как они устро­ены изнутри и как их мож­но взло­мать.

Час­то ревер­сить прог­рам­мный про­дукт слож­но не потому, что его код запутан или на него навеси­ли какую‑то осо­бен­ную защиту, а потому, что раз­работ­чики исполь­зовали ред­кий и малорас­простра­нен­ный фрей­мворк. Сегод­ня в нашем меню — экзо­тичес­кая сре­да раз­работ­ки под наз­вани­ем REALbasic (Xojo).

Это один из пионе­ров кросс‑плат­формен­ного прог­рамми­рова­ния. REALbasic неод­нократ­но менял наз­вание, архи­тек­туру и хозя­ев и в пос­леднее вре­мя серь­езно рас­терял как свои рыноч­ные позиции, так и акту­аль­ность. Написан­ные на нем при­ложе­ния встре­чают­ся все реже и реже, в основном в таких узкоспе­циали­зиро­ван­ных областях, как колори­мет­рия. Из‑за малой рас­простра­нен­ности для него, в отли­чие от извес­тных сред раз­работ­ки (вро­де Delphi, .NET или VBS), прак­тичес­ки отсутс­тву­ют спе­циали­зиро­ван­ные инс­тру­мен­ты для ревер­са. Поэто­му мы, как обыч­но, на при­мере кон­крет­ных при­ложе­ний раз­берем прин­ципы и лай­фха­ки для изу­чения кода таких при­ложе­ний.

Нач­нем с самого прос­того слу­чая. Как ни стран­но, лег­че все­го иссле­довать при­ложе­ние, соз­данное в сов­ремен­ных акту­аль­ных вер­сиях Xojo (да‑да, он мало того что еще под­держи­вает­ся, вдо­бавок стал 64-бит­ным, Ви­кипе­дия врет).

Итак, нам попалось гра­фичес­кое при­ложе­ние, при ана­лизе которо­го наш безот­казный Detect It Easy (DIE) утвер­жда­ет, что это Xojo (x64).

Нам понадо­бит­ся самая малость: вклю­чить фун­кции при­ложе­ния, которые отка­зыва­ются работать в незаре­гис­три­рован­ной вер­сии, выдавая вмес­то это­го окош­ки с тре­бова­нием регис­тра­ции. Заг­рузив прог­рамму в отладчик x64dbg и при­тор­мозив ее в этом мес­те, мы с облегче­нием замеча­ем, что прог­рамма не зашиф­рована, не упа­кова­на и лишена средств анти­отладки. Она даже сооб­щение выда­ет стан­дар­тным MessageBoxA, при этом прог­рамма прек­расно дизас­сем­бли­рует­ся при помощи IDA. Получен­ный код, прав­да, как и сле­дова­ло ожи­дать от кросс‑плат­формен­ного бей­сика, чудовищ­но неук­люж и сло­жен для понима­ния.

Хо­чет­ся как‑то облегчить себе жизнь, хотя бы вос­ста­новив име­на вызыва­емых методов. Наш пре­дыду­щий опыт работы со ском­пилиро­ван­ным кодом, изна­чаль­но пред­назна­чен­ным под интер­пре­татор, под­ска­зыва­ет, что эта информа­ция где‑то обя­затель­но дол­жна хра­нить­ся. Прос­мотрев в IDA все ссыл­ки на про­цеду­ру, из которой была выз­вана ошиб­ка демовер­сии, находим инте­рес­ную конс­трук­цию:

...
.text:0000000141A85CF5 mov edx, 0F40h
.text:0000000141A85CFA xor r8d, r8d
.text:0000000141A85CFD lea rcx, sub_140D7D410
.text:0000000141A85D04 lea r9, aOBevelbutton_64 ; "%%o<BevelButton>" — похоже на класс нашего метода
.text:0000000141A85D0B lea r10, aBvlmeaschartAc_0 ; "BvlMeasChart_Action" — похоже на его имя
.text:0000000141A85D12 lea r11, sub_141A91350 ; Адрес нашего метода
.text:0000000141A85D19 mov [rbp+8F0h+var_438], rax
.text:0000000141A85D20 mov [rbp+8F0h+var_60], r11
.text:0000000141A85D27 mov rax, [rbp+8F0h+var_8E0]
.text:0000000141A85D2B mov [rax+0F68h], r11
.text:0000000141A85D32 mov r11, [rbp+8F0h+var_68]
.text:0000000141A85D39 mov [r11+0F40h], r10
.text:0000000141A85D40 mov r10, [rbp+8F0h+var_68]
.text:0000000141A85D47 mov [r10+0F60h], r9
.text:0000000141A85D4E mov [rbp+8F0h+var_440], rcx
.text:0000000141A85D55 mov r9, [rbp+8F0h+var_68]
.text:0000000141A85D5C mov [r9+0F70h], rcx
.text:0000000141A85D63 mov rcx, [rbp+8F0h+var_68]
.text:0000000141A85D6A mov dword ptr [rcx+0F78h], 39h ; '9'
.text:0000000141A85D74 mov rcx, [rbp+8F0h+var_68]
.text:0000000141A85D7B mov dword ptr [rcx+0F48h], 101h
.text:0000000141A85D85 mov rcx, [rbp+8F0h+var_68]
.text:0000000141A85D8C mov [rbp+8F0h+var_8E8], rcx
.text:0000000141A85D90 call RuntimeAllocateAttributeTable
...

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии