-**** Double click lên String trên , chúng ta sẽ quay trở lại màn hình chính của Olly... Các bạn sẽ thấy là nếu như sau một hồi kiểm tra ở trước hai câu lệnh này mà giá trị của DI là 0 t
Trang 1-**** Double click lên String trên , chúng ta sẽ quay trở lại màn hình chính của Olly Dịch lên một chút chúng ta đặt BP tại hàm sau :
Quote:
0042DB17 FF91 A0000000 CALL DWORD PTR DS:[ECX+A0] ;<== Set BP here
II – Cracking :
-**** Sau khi đặt BP tại hàm trên , chúng ta nhấn Ctrl +F2 để Restart lại , tiếp theo nhấn F9 để run chương trình Chúng ta tiến hành nhập Fake Serial vào (chú ý
các bạn nên gõ FS ra một file sau đó copy lại và paste vào, lý do là vì nếu bạn gõ thì chỉ cần gõ 1 kí tự thôi nó sẽ tự Break trong Olly ngay ) Sau khi nhập xong chúng ta sẽ Break tại hàm trên :
Quote:
0042DB17 FF91 A0000000 CALL DWORD PTR DS:[ECX+A0] ;<== We’ re here
-**** Trace qua đoạn code này , chúng ta sẽ đến đây:
Code:
0042DB35 > \8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18] ; <== Fake Serial
0042DB38 50 PUSH EAX
0042DB39 FF15 24104000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaLenBs>; MSVBVM60. vbaLenBstr
; <== Get Length(FS) 0042DB3F 33C9 XOR ECX,ECX
0042DB41 83F8 06 CMP EAX,6 ; <== Length (FS) must equal 6
0042DB44 0F95C1 SETNE CL ; <== CL = 1 if Length (FS) <> 6
0042DB47 F7D9 NEG ECX
0042DB49 8BF9 MOV EDI,ECX ; <== EDI = ECX 0042DB4B 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
0042DB4E FF15 E8114000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaFreeS>; MSVBVM60. vbaFreeStr
0042DB54 8B1D E4114000 MOV EBX,DWORD PTR
DS:[<&MSVBVM60. vbaFr>; MSVBVM60. vbaFreeObj
0042DB5A 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
0042DB5D FFD3 CALL EBX ;
<&MSVBVM60. vbaFreeObj>
Trang 20042DB5F 66:85FF TEST DI,DI ; <== If EDI <> 0 then 0042DB62 0F85 BC010000 JNZ CMB_Audi.0042DD24 ; <== Jump out of check Serial
-**** Qua đoạn code trên bạn đã hiểu tại sao lại phải gõ FS ra rùi paste vô textbox rùi chứ Bởi vì nếu bạn nhập bằng tay vào thì chúng ta chỉ được một kí tự thôi và Olly sẽ Break ngay lập tức , do đó chúng ta sẽ không thể vượt qua được đoạn check length He he nhưng có một mẹo nhỏ để các bạn có thể vượt qua được đoạn
check length nếu chỉ nhập một kí tự , đó là khi đến lệnh Test DI, DI bạn hãy
Assemble (click Space) tại câu lệnh nhảy JNZ ở phía dưới và sửa lại câu lệnh này
Oki
-**** Bây giờ sau khi chúng ta đã vượt qua được đoạn check Length trên , trace tiếp chúng ta sẽ tới đoạn code sau :
Code:
0042DBA3 > \8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18] ;<== Fake Serial
0042DBA6 50 PUSH EAX
0042DBA7 FF15 C4104000 CALL DWORD PTR
DS:[<&MSVBVM60.#527>] ; MSVBVM60.rtcUpperCaseBstr
0042DBAD 8BD0 MOV EDX,EAX
0042DBAF B9 B4F04200 MOV ECX,CMB_Audi.0042F0B4
0042DBB4 FF15 BC114000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaStrMo>; MSVBVM60. vbaStrMove
0042DBBA 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
0042DBBD FF15 E8114000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaFreeS>; MSVBVM60. vbaFreeStr
0042DBC3 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
0042DBC6 FFD3 CALL EBX
0042DBC8 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
0042DBCB 51 PUSH ECX
0042DBCC E8 5F1DFFFF CALL CMB_Audi.0041F930 ; <== Compare
FS with default serial
0042DBD1 8D55 D4 LEA EDX,DWORD PTR SS:[EBP-2C]
0042DBD4 8D45 94 LEA EAX,DWORD PTR SS:[EBP-6C]
0042DBD7 52 PUSH EDX
0042DBD8 50 PUSH EAX
0042DBD9 C745 9C FFFFF>MOV DWORD PTR SS:[EBP-64],-1
0042DBE0 C745 94 0B800>MOV DWORD PTR SS:[EBP-6C],800B
0042DBE7 FF15 D8104000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaVarTs>; MSVBVM60. vbaVarTstEq
Trang 30042DBED 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C] 0042DBF0 66:8BF8 MOV DI,AX
0042DBF3 FF15 20104000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaFreeV>; MSVBVM60. vbaFreeVar
0042DBF9 66:85FF TEST DI,DI
0042DBFC 0F84 22010000 JE CMB_Audi.0042DD24
0042DC02 8B0E MOV ECX,DWORD PTR DS:[ESI]
0042DC04 56 PUSH ESI
0042DC05 FF91 8C030000 CALL DWORD PTR DS:[ECX+38C] 0042DC0B 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
0042DC0E 50 PUSH EAX
0042DC0F 52 PUSH EDX
0042DC10 FF15 7C104000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaObjSe>; MSVBVM60. vbaObjSet
0042DC16 8BF8 MOV EDI,EAX
0042DC18 6A FF PUSH -1
0042DC1A 57 PUSH EDI
0042DC1B 8B07 MOV EAX,DWORD PTR DS:[EDI]
0042DC1D FF90 B4010000 CALL DWORD PTR DS:[EAX+1B4] 0042DC23 85C0 TEST EAX,EAX
0042DC25 DBE2 FCLEX
0042DC27 7D 12 JGE SHORT CMB_Audi.0042DC3B
0042DC29 68 B4010000 PUSH 1B4
0042DC2E 68 40A44000 PUSH CMB_Audi.0040A440
0042DC33 57 PUSH EDI
0042DC34 50 PUSH EAX
0042DC35 FF15 60104000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaHresu>; MSVBVM60. vbaHresultCheckObj 0042DC3B > 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C] 0042DC3E FFD3 CALL EBX
0042DC40 8B0E MOV ECX,DWORD PTR DS:[ESI]
0042DC42 56 PUSH ESI
0042DC43 FF91 8C030000 CALL DWORD PTR DS:[ECX+38C] 0042DC49 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C]
0042DC4C 50 PUSH EAX
0042DC4D 52 PUSH EDX
0042DC4E FF15 7C104000 CALL DWORD PTR
DS:[<&MSVBVM60. vbaObjSe>; MSVBVM60. vbaObjSet
0042DC54 8BF0 MOV ESI,EAX
Trang 40042DC56 68 78BA4000 PUSH CMB_Audi.0040BA78 ; UNICODE
"Thank you for registering!"
-**** Oki , trong đoạn code trên các bạn để ý thấy có một câu lệnh TEST và một
câu lệnh JE tại 0042DBF9 và 0042DBFC Các bạn sẽ thấy là nếu như sau một hồi kiểm tra ở trước hai câu lệnh này mà giá trị của DI là 0 thì câu lệnh nhảy sẽ cho chúng ta nhảy qua dòng “Thank you for resgistering “ như các bạn đã thấy ở
trên Đây là điều mà chúng ta không hề mong muốn Vậy thì chắc chắn sẽ phải có một hàm nào đó kiểm tra Serial của chúng ta nhập vào và kết quả đúng sai sẽ trả về
cho DI Sau khi tìm hiều thì đoạn check đó nằm tại đỉa chỉ sau 0042DBCC :
Quote:
0042DBCC E8 5F1DFFFF CALL CMB_Audi.0041F930 ; <== Compare FS with default serial (Trace Into)
-**** Đã xác định được mục tiêu chính chúng ta hãy Trace Into vào trong hàm
này Oki sau khi trace vào trong hàm này thì nhìn xuống một chút các bạn sẽ thấy
các Default Serial của chương trình này Chương trình sẽ nạp từng Default Serial này vào sau đó đem check với Fake Serial mà chúng ta gõ vào Các Default Serial
của chương trình này như sau:
Quote:
………
0041FA19 C785 D4FEFFFF>MOV DWORD PTR
SS:[EBP-12C],CMB_Audi.0040>; UNICODE "FGA485"
…………
0041FA4D C785 B4FEFFFF>MOV DWORD PTR
SS:[EBP-14C],CMB_Audi.0040>; UNICODE "FHA486"
………
0041FA81 C785 94FEFFFF>MOV DWORD PTR
SS:[EBP-16C],CMB_Audi.0040>; UNICODE "FAH487"
………
0041FAB5 C785 74FEFFFF>MOV DWORD PTR
SS:[EBP-18C],CMB_Audi.0040>; UNICODE "FWH488"
………
0041FADE C785 54FEFFFF>MOV DWORD PTR
SS:[EBP-1AC],CMB_Audi.0040>; UNICODE "FGH489"
………
-**** Keke , lấy giấy bút ra và ghi lại thôi còn chần chừ gì nữa Qua đoạn trên các bạn có thể đặt ra câu hỏi là tại sao lại có thể biết được hàm đó là check Serial thì xin thưa với các bạn như sau Sau khi chúng ta đã thu hẹp lại khoảng cần quan tâm
Trang 5là nằm phía trên của lệnh TEST DI, DI Các bạn để ý thấy có rất nhiều hàm nằm
trong từng hàm Call khác nhau Vậy thì tại sao và làm thế nào để biết chính xác đâu là hàm cần tìm ? Một câu trả lời ngắn gọn theo sự hiểu biết của mình như sau, trong một chương trình nó sẽ có những hàm chuẩn và những hàm mà coder tự viết Hàm chuẩn thường là các hàm gọi API hay là các hàm bắt đầu bằng tiếp đầu ngữ là
MSVB đối với Visual Basic , còn đối với Visual C++ là MFC Còn hàm coder
tự viết thì không có các tiếp đầu ngữ như vậy, do đó việc xác định đâu là mục tiêu cần tìm sẽ được tiếp tục thu hẹp và chúng ta có được kết quả như trên :D
/*/*/*/* Serial tương ứng :
FGA485 Or FHA486 Or FAH487 Or FWH488 Or FGH489
III – KeyGen :
N/A
IV – End of Tut :
- Finished – December 29, 2004
- Thank to my family, Computer_Angel, Moonbaby , Zombie_Deathman,
Littleboy, Benina, QHQCrker, the_Lighthouse, Hoadongnoi, Nini all REA‘s members, HacNho, RongChauA, Deux all my friend, and YOU :wub:
REVERSE ENGINEERING ASSOCIATION
http://www.reaonline.net
Kienmanowar(REA)
-=== www.enins.com === -
Reverse Engineering Association
SoftWare
Home page : http://www.enins.com
Production : ENIN Software
Software : Batch Launcher v1.1.4
Copyright by : Nikolay Enin 2003
Packed : N / A
Language : Borland Delphi 6.0 - 7.0
Crack tool : OllyDBG v1.10, PEiD v0.92
Unpack : N / A
Trang 6Request : Correct Serial
Comment :
Quote:
Batch Launcher v1.1.4
Start more than one application at once, make shortcut to the such batch Using created batches as the startup sequences and more