Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #90, ИЮНЬ 2006 г.

Полный ПИ

GPcH (admin@vb-decompiler.org)

Хакер, номер #090, стр. 090-082-5


loc_404407: ShellExecute(0, var_8C, var_90, 0, 0, 0)

родолжим исследовать пикод? Не закрывай таблицу опкодов - рано еще.

Следующий и последний опкод 13 - ExitProcHresult. Как понятно из названия, он завершает процедуру, значит, что после него идет уже известная нам структура ProcDscInfo. Вот мы и разобрались, как декомпилировать пикод в уме. Теперь пора поговорить о реальных задачах по исследованию - анализировать будем в моем декомпиляторе.

Срубаем NAG-скрины

В любой программе есть две проблемы: триал и NAG-скрины. Если триал обычно можно обойти, лишь найдя ключ в реестре, который отвечает за счетчик дней, и написав простенький инлайн-патч, который будет перед запуском EXE обнулять этот ключ, то с нагами такой номер не пройдет. Они надоедают либо до покупки проги, либо до отрубания этих злостных трюков. Думаю, лучшим примером NAG-скрина в виде мессаги будет простенький крэкми на пикоде. Не уверен, что ты найдешь его в Интернете, поэтому бери с диска (я его назвал "AC_Crackme_01.exe"). Откроем-ка мы его в декомпиляторе, чтобы посмотреть, с чем мы имеем дело. Видим две процедуры: одна закрывает приложение по кнопке, вторая - та, что в Form_Load:

loc_401A48: LitVar_Missing var_104

loc_401A4B: LitVar_Missing var_E4

loc_401A4E: LitVar_Missing var_C4

loc_401A51: LitI4 0

loc_401A56: LitVarStr var_94, "NAG"

loc_401A5B: FStVarCopyObj var_A4

loc_401A5E: FLdRfVar var_A4

loc_401A61: ImpAdCallFPR4 MsgBox(, , , , )

loc_401A66: FFreeVar var_A4 = "": var_C4 = "": var_E4 = ""

loc_401A71: ExitProcHresult

Видим вызов MsgBox по адресу: 401A61. Как ты понимаешь, нам его нужно убрать. Тут есть несколько путей. Так как в данном случае вся функция - это NAG, то можно просто сделать выход в самом начале функции, то есть по адресу loc_401A48 вбить опкод ExitProcHresult. Красиво, оригинально, а главное - работает. Посмотрим теперь крэкми посложнее - "AC_Crackme_01_A.exe":

loc_401DE8: LitVar_Missing var_104

loc_401DEB: LitVar_Missing var_E4

loc_401DEE: LitVar_Missing var_C4

loc_401DF1: LitI4 0

loc_401DF6: LitVarStr var_94, "Another NAG"

loc_401DFB: FStVarCopyObj var_A4

loc_401DFE: FLdRfVar var_A4

loc_401E01: ImpAdCallFPR4 MsgBox(, , , , )

loc_401E06: FFreeVar var_A4 = "": var_C4 = "": var_E4 = ""

loc_401E11: FLdPr arg_8

loc_401E14: Me.Hide

loc_401E19: LitVar_Missing var_B4

loc_401E1C: PopAdLdVar

loc_401E1D: LitVar_Missing var_94

loc_401E20: PopAdLdVar

loc_401E21: ImpAdLdRf unk_4019F4

loc_401E24: NewIfNullPr

loc_401E27: Me.Show from_stack_1 from_stack_2

loc_401E2C: ExitProcHresult

loc_401E2D: ILdPr

Видим, что по адресу 401E01 выводится один наг с помощью MsgBox, затем в 401E14 скрывается форма и в 401E27 происходит загрузка основного окна. Здесь я рассмотрю сначала, как можно обойти мессагу, а уж потом поговорим про форму. Как же обойти этот вызов MsgBox? А как бы мы его обошли в программировании? Наверное, будет логично по адресу 401DE8 прописать GoTo на адрес 401E11, что мы и сделаем. В качестве GoTo используется BranchF, а адрес рассчитывается относительно адреса начала данной функции. То есть начальный адрес - 401DE8, а нам нужно перейти на 401E11, следовательно, в начало функции 401E11h-401DE8h=29h надо приписать 1E2900. Запускаем - нага как не бывало, осталось убрать форму нага, но это будет домашним заданием. Надеюсь, ты спрашишься без проблем.

Назад на стр. 090-082-4  Содержание  Вперед на стр. 090-082-6
Hosted by uCoz