:: Информация ::

Pulse Reverseing Force

=======Поредния Урок за revers-ване от ^Shade^=======
Предполагам сте прочели миналия ми урок посветен на p-code.В този урок ще продължим обемната тема 'P-code reversing'.Не е желателно да четете този урок ако не сте прочели миналия!! Когато работите с 'p-code' знайте, че нещата не стоят така както в нормалния asm и се опитвайте да разсъждавате по абстрактно.

 :: Съдържание ::

При работа с 'p-code' , ще ви трябват следните продукти за работа , които можете да изтеглите архива на миналия урок посветен на 'p-code'.
1.Декомпилер за 'p-code'

2.Help за самия 'p-code'

3.но не на последно място по важност VbDebug
4.SmartCheck

5.Малко акъл :)
-----------------------------------------------------------------------------------------------------------------------------------------------------
Ето и нашата цел , която можете да изтеглите от тук.Това е програма за разглеждане на картинки.Не е нещо особено.Като е стартирате,сигурен съм сте забелязали противния nag-screen,на който пише 'This is only a demo version.....'.Няма никакъв trial,нито някакви пароли нито каквито и да било ограничения освен този начален nag-screen.Сега нашата цел е да го разкараме.Това ще стане лесно :) Отваряте .exe-то с декомилера за 'p-code' и би трябвало да виждате следното:

-----------------------------------------------------------------------------------------------------------------------------------------------------
Естествено , вие веднага намерихте нашия nag-screen:
4026F2: 1b LitStr: This is only a demo version
4026F5: 1b LitStr:
4026F8: 2a ConcatStr
4026F9: 23 FStStrNoPop local_0088
4026FC: 1b LitStr: Plese download the full version from
4026FF: 2a ConcatStr
402700: 23 FStStrNoPop local_008C
402703: 1b LitStr:
402706: 2a ConcatStr
402707: 23 FStStrNoPop local_0090
40270A: 1b LitStr: www.---------.com
40270D: 2a ConcatStr
40270E: 46 CVarStr local_00A0
402711: 0a ImpAdCallFPR4:

Нека сега малко го анализираме

4026F2: 1b LitStr: Взема като стринг "This is only a demo version"
4026F5: 1b LitStr: Взема като стринг VbCrlf(Това е константа във VisualBasic за нов ред)
4026F8: 2a ConcatStr:Конкатинира взетите стрингове(последните 2)
4026FC: 1b LitStr: Взема "Plese download the full version from" като стринг
4026FF: 2a ConcatStr:конкатинира взетите стрингове(последните 2)
402703: 1b LitStr: Взема като стринг VbCrlf(Това е константа във VisualBasic за нов ред)
402706: 2a ConcatStr:Конкатинира взетите стрингове(последните 2)
40270A: 1b LitStr:Взема  "www.---------.com" като стринг.
40270D: 2a ConcatStr:Конкатинира взетите стрингове(последните 2)
402711: 0a ImpAdCallFPR4: Това е функцията msgbox() във VisualBasic-а

=>От анализирането на кода стигнахме до извода че това е един ред на VisualBasic
msgbox "This is only a demo version" & VbCrlf & "Plese download the full version from" & VbCrlf & "www.---------.com"

Сега сигурно се чудите как ще прескочим тозо msgbox() като никъде няма условен преход или нещо подобно.Ако беше нормален asm код можеше да сложим Nop(90x0) или Inc(40x0),Dec(48x0).Но тъй като това не е asm  код а p-code ще трябва да походим по друг начин.За целта ще се запознаем с условните и безусловните преходи във VisualBasic P-Code:

BranchТ  -- [1Dh]-- Jump if True -- Скача ако е изпълнено условието или преведено буквално "Скочи ако е истина"
BranchF -- [1Ch]-- Jump if False -- Скача ако не е  изпълнено условието или преведено буквално "Скочи ако е лъжа"
Branch --[h]-- Jump -- Прескача без никакво увловие или преведено буквално просото "Прескочи"

BranchT,BranchF,Branch са както във asm-то :je,jne,jmp
Във asm-то се проверява флаговия регистър Zero
Този регистер се променя след операции като : cmp,test и др.
Във VisualBasic това се установява след функции като:
1)Функции които проверяват дали дадени неща са еднакви и ако са , връщат True а ако не са False:
EqI2,EqI4,EqR4,EqCy,EqCyR8,EqUI1,EqvI4,EqVar(Проверява дали 2 променливи са еднакви или не),EqI2,EqR8,EqStr(Провева дали 2 стринга са еднакви или не),EqTextVar,EqVarBool(Проверява дали 2 променливи от тип Boolen са еднакви),EqTextVarBool
2)Функции които проверяват дали нещата са различни и ако са , връщат True а ако са еднакви False: 
NeI2,NeI4,NeR4,NeCy,NeCyR8,NeUI1,NevI4,NeVar(Проверява дали 2 променливи са различни или не),NeI2,NeR8,NeStr(Провева дали 2 стринга са различни или не),NeTextVar,NeVarBool(Проверява дали 2 променливи от тип Boolen са различни),NeTextVarBool

Във дисасемблера за p-code всяка процедура се характеризиза с
начало:"Proc:XXXXXX" , където XXXXXX е адреса на процедурата и  край:"YYYYYY:13 ExitProcHresult", където YYYYYY е адреса на края на процедурата.

Нека сега се върнем към нашия код:
Proc: 40272c
4026DC: 27 LitVar_Missing
4026DF: 27 LitVar_Missing
4026E2: 3a LitVarStr: ( local_00B0 ) Info
4026E7: 4e FStVarCopyObj local_00C0
4026EA: 04 FLdRfVar local_00C0
4026ED: f5 LitI4: 0x0 0 (....)
4026F2: 1b LitStr: This is only a demo version
4026F5: 1b LitStr:
4026F8: 2a ConcatStr
4026F9: 23 FStStrNoPop local_0088
4026FC: 1b LitStr: Plese download the full version from
4026FF: 2a ConcatStr
402700: 23 FStStrNoPop local_008C
402703: 1b LitStr:
402706: 2a ConcatStr
402707: 23 FStStrNoPop local_0090
40270A: 1b LitStr: www.---------.com
40270D: 2a ConcatStr
40270E: 46 CVarStr local_00A0
402711: 0a ImpAdCallFPR4:
402716: 32 FFreeStr local_0088 local_008C local_0090
40271F: 36 FFreeVar local_00A0 local_00C0 local_00E0 local_0100
40272A: 13 ExitProcHresult

Вероятно ви е дошла идеата за беусловен преход Branch(1Ex0)  и нещата биха изглежадли ето така:
Proc: 40272c
4026DC: 27 LitVar_Missing
4026DF: 27 LitVar_Missing
4026E2: 3a LitVarStr: ( local_00B0 ) Info
4026E7: 4e FStVarCopyObj local_00C0
4026EA: 04 FLdRfVar local_00C0
4026ED: f5 LitI4: 0x0 0 (....)
4026F2: 1e Branch: 402716
4026F5: 1b LitStr:
4026F8: 2a ConcatStr
4026F9: 23 FStStrNoPop local_0088
4026FC: 1b LitStr: Plese download the full version from
4026FF: 2a ConcatStr
402700: 23 FStStrNoPop local_008C
402703: 1b LitStr:
402706: 2a ConcatStr
402707: 23 FStStrNoPop local_0090
40270A: 1b LitStr: www.---------.com
40270D: 2a ConcatStr
40270E: 46 CVarStr local_00A0
402711: 0a ImpAdCallFPR4:
402716: 32 FFreeStr local_0088 local_008C local_0090
40271F: 36 FFreeVar local_00A0 local_00C0 local_00E0 local_0100
40272A: 13 ExitProcHresult

В такъв случей ще се прескочи msgbox-a.
Изглежда лесно нали :) , но остава само един въпрос неизяснен.Знаем как да направим Branch-Това е просот 1E в HexEditor-а , но до сега не сме говорили за адресите при p-code.
4026F2: 1e Branch: 402716
Branch-Проста команда , наподобяваща jmp , или накратко безувловен преход-1Е
402716-Това е просто един адрес на който трябва да се прескочи.Нека поразсъждаваме как msvbvm60.dll чете във HEX нашия код.1-като види както в случея 1E разбира че става въпрос за Branch , после да речем види 39  (1E39):msvbvm60.dll ще намери първия адрес от процедурата (4026DC: 27 LitVar_Missing) и към нея ще привави 39.След което ще прескочи към този новообразувал се адрес.
=>За да направи,
4026F2: 1e Branch: 402716 Вземаме адреса където искаме да отидем(402716),От него изваждаме първия адрес от процедурата който в случея е 4026DC.
402716-4026DC=3A
Уверете се че ImageBase = 00400000 и след това  с HEX-едитора отидете на Offset 26F2 и въведете следното:1E3A .След това дайте 'Save as ' и го запазете като "cracked.exe". След което стартирайте новото ни .exe .Както виждате вече го няма Nag-Screen-а :))
-----------------------------------------------------------------------------------------------------------------------------------------------------
Толкова днеска от мене :)Следващия път ми се ще да се занимаваме малко с keyfiles , ама да видим дали ще остане време :)
-----------------------------------------------------------------------------------------------------------------------------------------------------
Дата: 15.o1.2004
Автор: shade!prf
Поща: sashoo@abv.bg