Полный ПИ 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. Запускаем - нага как не бывало, осталось убрать форму нага, но это будет домашним заданием. Надеюсь, ты спрашишься без проблем. |