Пом­нишь, как на школь­ных уро­ках информа­тики тебя зас­тавля­ли изу­чать 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
...

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

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