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

Pulse Reverseing Force

Програма: vbkeygenme by plux
Tрудност: 3/10
Инструменти: w32dasm, SmartCheck, hex editor
Разлика при кракването: Писана е на VisualBasic 

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

В този туториал ще разберем как plux се генерира правилния код на keygenme-то на plux.Като за начало включете SmarCheck-а аз въведох за име sashoo и за парола 1234567890.Ето и какво излезе в SmartCheck-а за процедурата при кликване на бутона 'check':
-----------------------------------------------------------------------------------------------------------------------------------------------------
Len returns LONG:6 -->String string1("sashoo") = 00410328                     VBKGM.EXE !0000419F(no debuging info)
                                      |                            
                                      ---- = "sashoo"
Len returns LONG:6551608 -->String (Variant)                                         VBKGM.EXE !0000448C(no debuging info)
                                                 |
                                                 -----String .bstrVal = 00410328
                                                           |
                                                           ---- = "sashoo"
//1)--------------------------------------------------------------------------------
Mid --> String (variant)                                                                          VBKGM.EXE !000044D4(no debuging info)
           | -----String .bstrVal = 00410328
           | |
           | ---- = "sashoo"
           |--Long length = 1 0x00000001
           |--start(variant)
                  |
                  ------Integer .iVal = 1 0x0001
Asc returns Integer:115 -->String string - 004102A4                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "s"
Hex -->string(variant)                                                                             VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 56 0x0037
//2)--------------------------------------------------------------------------------
Mid --> String (variant)                                                                          VBKGM.EXE !000044D4(no debuging info)
           | -----String .bstrVal = 00410328
           | |
           | ---- = "sashoo"
           |--Long length = 2 0x00000002
           |--start(variant)
                  |
                  ------Integer .iVal = 1 0x0001
Asc returns Integer:97 -->String string - 004102F0                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "a"
Hex -->string(variant)                                                                           VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 47 0x002F
//3)--------------------------------------------------------------------------------
Mid --> String (variant)                                                                          VBKGM.EXE !000044D4(no debuging info)
           | -----String .bstrVal = 00410328
           | |
           | ---- = "sashoo"
           |--Long length = 3 0x00000003
           |--start(variant)
                  |
                  ------Integer .iVal = 1 0x0001
Asc returns Integer:115 -->String string - 004102C8                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "s"
Hex -->string(variant)                                                                             VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 56 0x0038
//4)--------------------------------------------------------------------------------
Mid --> String (variant)                                                                           VBKGM.EXE !000044D4(no debuging info)
           | -----String .bstrVal = 00410328
           | |
           | ---- = "sashoo"
           |--Long length = 4 0x00000004
           |--start(variant)
                  |
                  ------Integer .iVal = 1 0x0001
Asc returns Integer:104 -->String string - 004102A4                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "h"
Hex -->string(variant)                                                                             VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 50 0x0032
//5)--------------------------------------------------------------------------------
Mid --> String (variant)                                                                           VBKGM.EXE !000044D4(no debuging info)
           | -----String .bstrVal = 00410328
           | |
           | ---- = "sashoo"
           |--Long length = 5 0x00000005
           |--start(variant)
                  |
                  ------Integer .iVal = 1 0x0001
Asc returns Integer:111 -->String string - 0041034C                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "o"
Hex -->string(variant)                                                                             VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 54 0x0036
//6)--------------------------------------------------------------------------------
Mid --> String (variant)                                                                           VBKGM.EXE !000044D4(no debuging info)
           | -----String .bstrVal = 00410328
           | |
           | ---- = "sashoo"
           |--Long length = 6 0x00000006
           |--start(variant)
                  |
                  ------Integer .iVal = 1 0x0001
Asc returns Integer:111 -->String string - 00410304                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "o"
Hex -->string(variant)                                                                             VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 54 0x0036
//-----------------------------------------------------------------------------------
Val returns double:9,42815e+008(displayed as single-precision floating point) --> String string1 = 004103A4
                                                                                                                        |
                                                                                                                        ------ = "&H382F38323636"
//-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------
В началото става ясно , че се взима дължината на въведеното име (
Len returns LONG:6), за да се завърти после цикък за всяка негова буква.После виждаме (Mid --> String (variant) ).След това взема Asc-и кода на взетата вече буква(Asc returns Integer).Например в началото имаме следното:

Asc returns Integer:115 -->String string - 004102A4                                  VBKGM.EXE !000044E7(no debuging info)
                                            |
                                            ----- = "s"
Hex -->string(variant)                                                                             VBKGM.EXE !0000462F(no debuging info)
               |
               ------Integer .iVal = 56 0x0037

В случея параметърът даден за функцията Asc е буквата "s".Резултатът които се връща от нея е 115.Това е нейния Asc-код
По доло виждаме обаче , че за параметър на функцията Hex е дадена стойноста 56 , а резултатът който се връща е 37.
=>plux си играя по някакъв логичен алгоритъм с Asc-и кода на буквата , който винаги е някакво положително цяло число.По принцип не е много лесно да се задалбава в API-тата на VisualBasic-а , защото microsoft не са дали списък с тяхните параметри :((.Затова ние ще намерим сега просто серийния номер на нашето име.За целта обръщаме повече внимание на следния ред, който междо другото е и последния в нашата процедура:

Val returns double:9,42815e+008(displayed as single-precision floating point) --> String string1 = 004103A4
 (VBKGM.EXE !
000046BB(no debuging info))                                                          |
                                                                                                                        ------ = "&H382F38323636"
Val("&H382F38323636") ще е равно в случея на  942814774
.Значи генерирания до момента сериен номер за 942814774.

Сега отваряме с IDA-та нашто keygenme и отиваме на адрес
000046BB+Image Base = 004046BB .
Ето и нашия код в IDA
.dbl_4011C8 dq 7.0
text:004046BB call rtcR8ValFromBstr
.text:004046C0 fmul ds:
dbl_4011C8 //Умножава нашия резултат(942814774) със 7.0
.text:004046C6 lea edx, [ebp-0CCh]
.text:004046CC lea ecx, [ebp-44h]
.text:004046CF mov dword ptr [ebp-0CCh], 5
.text:004046D9 fstp qword ptr [ebp-0C4h]
.text:004046DF fnstsw ax
.text:004046E1 test al, 0Dh
.text:004046E3 jnz loc_40480C
//__vbaErrorOverflow (проверява дали е препълнен буфера)
.text:004046E9 call __vbaVarMove
.text:004046EE lea ecx, [ebp-58h]
.text:004046F1 call __vbaFreeStr
.text:004046F6 lea ecx, [ebp-6Ch]
.text:004046F9 call __vbaFreeVar
.text:004046FE mov eax, [esi]
.text:00404700 push esi
.text:00404701 call dword ptr [eax+2FCh]
.text:00404707 push eax
.text:00404708 lea eax, [ebp-5Ch]
.text:0040470B push eax
.text:0040470C call __vbaObjSet //Сетва TextBox-а за паролата като обект
.text:00404711 mov esi, eax
.text:00404713 lea ecx, [ebp-58h]
.text:00404716 push ecx
.text:00404717 push esi
.text:00404718 mov eax, [esi]
.text:0040471A call dword ptr [eax+0A0h]
.text:00404720 test eax, eax
.text:00404722 fnclex
.text:00404724 jge short loc_404737
|---------------------------------------------------------------------------
.text:00404726 push 0A0h                                                                                                            
|
.text:0040472B push offset dword_40293C                                                                                     
|
.text:00404730 push esi                                                                                                               
|
.text:00404731 push eax                                                                                                              
|
.text:00404732 call __vbaHresultCheckObj //Взема текста въведен от сетнатия по горе TextBox       |
.text:00404737 loc_404737: ; CODE XREF: .text:00404724  <-----------------------------------------------|
.text:00404737 mov eax, [ebp-58h]
.text:0040473A and dword ptr [ebp-58h], 0
.text:0040473E mov [ebp-64h], eax
.text:00404741 lea eax, [ebp-6Ch]
.text:00404744 push eax
.text:00404745 lea eax, [ebp-44h]
.text:00404748 push eax
.text:00404749 mov dword ptr [ebp-6Ch], 8008h
.text:00404750 call __vbaVarTstEq  //Сравнява генерирания до момента сериен номер с въведения(call __vbaHresultCheckObj)
.text:00404755 lea ecx, [ebp-5Ch]
.text:00404758 mov esi, eax //Резултатът от сравнението се записва в ESI(SI)
.text:0040475A call __vbaFreeObj
.text:0040475F lea ecx, [ebp-6Ch]
.text:00404762 call __vbaFreeVar
.text:00404767 test si, si //Проверява дали SI = 0(SI=0 ?)
.text:0040476A jz short loc_404771 //Aко са различни прескача на 404771 пък иначе..
.text:0040476C call __vbaEnd //Излиза от програмата
Сега можете да си изкарате към 5-6 имена със съответните пароли и да си направите keygen :)
В друг тут  ще обясня по конкретно как се revers-ва целия алгоритъм на програма писана на VisualBasic
----------------------------------------------------------------------------------------------------------------------------------------------------
Greetingz to
---plux-------
---stan4oo---
---BuKo------
---Dim_cr----

---Pumqara--
---Nre---------

---jeux--------
---AEX---------

---PsYcHo-----
---------------------------------------------------------------------------------------------------------------------------------------------:shade:---

Дата: 22.1о.2оо3

Автор: shade!prf

Поща: sashoo@abv.bg