PDA

View Full Version : craking bằng phương pháp dùng STACK <by Computer_angel>



freewarez
07-06-2004, 18:20
PHƯƠNG PHÁP DÙNG STACK

I – Giới thiệu :
I.1 – Giới thiệu :
- Phương pháp này được dùng trong trường hợp không tìm thấy Death-List ( trực tiếp – tìm thấy trong Olly; hay gián tiếp - Win32dasm … ).
- Phương pháp này dựa trên cơ sở chuỗi Death-List thay vì hiện trực tiếp thì sẽ được “ ẩn đi ” và chỉ xuất hiện khi được gọi đến. Và để xuất hiện được thông báo chương trình cần phải lưu các thông số cần thiết vào STACK.
- Phương pháp này chính là tìm các dữ liện được nạp vào từ trong STACK, từ đó ta truy ra được mục tiêu cần tiếp cận.

I.2 – Phương pháp tổng quát :

*** Load chương trình bằng Olly
*** Chạy chương trình với Fake ******, chương trình sẽ hiện thông báo sai .
*** Nhấn F12, Olly sẽ dùng lại chương trình tại điểm xuất hiện NAG.
*** Nhấn Alt-K để mở cửa sổ : Call Stack of Main Thread
*** Double-Click vào hàm hiện thông báo ta trở về chương trình chính.
*** Từ đây ta xác định được mục tiêu cần tiếp cận

I.3 – Dạng chương trình áp dụng :

>>>>>>> Tất cả các dạng chương trình đều có thể sử dụng phương pháp nạy Tuy nhiên, đối với các chương trình có sử dụng hàm MessageBoxA để hiện thông báo thì cách thức sẽ có phần đơn giản hơn .

- Dạng chuỗi được mã hoá, và chỉ xuất hiện khi quá trình xử lý.
- Dạng không có chuỗi trong Olly, trong kWdsm 10 hay chuỗi mã hoá.
- Dạng không có thông báo trong hàm MessageBoxA.
- Dạng không sử dụng hàm MessageBoxA. ( thường là các chương trình được viết bằng ngôn ngữ Borland Delphi ).

II – Thực hành :

II.1 – Dạng chuỗi đã được mã hoá, và chỉ hiện diện sau khi đã được RE :

Homepage : http://www.audio-recorder.net
Soft : Audio Recorder Deluxe v2.2.36
Cracked File : ard.exe (Microsoft Visual C++ 6.0)

- Dùng PeiD kiểm tra biết chương trình được viết bằng Micorsoft Visual C++ 7.0 Method2
- Chạy thử chương trình với User (U) và Fake ****** (FR) ta nhận được thông báo "Incorrect code". Ta không thể tìm được chuỗi này trong Olly cũng như trong kWdsm 10, nên ta dử dụng phương pháp dùng STACK :
**** Load và chạy chương trình với U và FR. Chương trình xuất hiện thông báo "Incorrect code". Giữ nguyên chương trình. Quay trở lại Olly.
**** Sau khi quay trở lại Olly, nhấn F12, Olly sẽ dừng chương trình lại. Nhấn tiếp Alt-K để hiện cửa sổ Call stack of main thread. Ta thấy ngay thông báo :

QUOTE
0012D8D8 0017030C hOwner = 0017030C (class='#32770',
0012D8DC 004E6758 Text = "Incorrect code"
0012D8E0 004E6448 Title = "Help"
0012D8E4 00000030 Style = MB_OK|MB_ICONEXCLAMATION|M
0012D8E8 00000000 LanguageID = 0 (LANG_NEUTRAL)
0012D8EC 004993A2 ? USER32.MessageBoxA ard.0049939C
0012D8F0 0017030C hOwner = 0017030C (class='#32770',
0012D8F4 004E6758 Text = "Incorrect code"
0012D8F8 004E6448 Title = "Help"
0012D8FC 00000030 Style = MB_OK|MB_ICONEXCLAMATION|M
0012D904 0041B21B ? ard.00499374 ard.0041B216


**** Ở đây ta chú ý đến dòng :

QUOTE
0012D8EC 004993A2 ? USER32.MessageBoxA ard.0049939C


**** Double-Click vào dòng này ta đến địa chỉ 0049939C :

QUOTE
0049939C |. FF15 68365300 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
004993A2 |. 5E POP ESI ; <== Set BreakPoint here


**** Sau khi đặt BP ở đây, Olly sẽ dừng chương trình lại, nhấn F8 để xuất hiện lại thông báo "Incorrect code". Nhấn OK để chấp nhận thông báo này, chương trình sẽ dừng lại ngay tại điểm BP này. Xoá điểm đặt BP này đi. Và dùng F8 trace tiếp.
**** Sau khi trace qua một số lần (ở chương trình này là 1 lần ) RETN ta nhìn lên trên chút và thấy

QUOTE
0041B20C . 68 48644E00 PUSH ard.004E6448 ; ASCII "Help"
0041B211 . 68 58674E00 PUSH ard.004E6758 ; ASCII "Incorrect code"
0041B216 > E8 59E10700 CALL ard.00499374


**** Ghi nhớ địa chỉ đoạn CODE này (0041B20C). Load chương trình lại bằng Olly, truy đến địa chỉ này ta thấy thông báo ở đây :

QUOTE
0041B20C . 68 48644E00 PUSH ard.004E6448 ; ASCII "Help"
0041B211 . 68 58674E00 PUSH ard.004E6758 ; ASCII "Hmbnqqdbs bncd"
0041B216 > E8 59E10700 CALL ard.00499374


**** Chuỗi "Hmbnqqdbs bncd" chính là chuỗi "Incorrect code" được mã hoá. Khi quá trình xử lý diễn ra đến đây, chuỗi này sẽ được mã hoá ngược để cho ra chuỗi "Incorrect code".
- Đến đây CRACKING diễn ra bình thường.

freewarez
07-06-2004, 18:20
II.2 - Dạng không có chuỗi trong Olly, trong kWdsm 10 hay chuỗi mã hoá.

II.3.1 – Dạng hiện chuỗi khi truy ngược đến :

Homepage : http://www. ipmonitor.tsarfin.com
Soft : IPMonitor - Version 4.8 (Build 804)
Cracked File : IPMonitor.exe (Micorsoft Visual C++ 7.0 Method2 )

- Dùng PeiD kiểm tra biết chương trình được viết bằng Micorsoft Visual C++ 7.0 Method2
- Chạy thử chương trình với User (U) và Fake ****** (FR) ta nhận được thông báo "Incomplete or incorrect information.". Ta không thể tìm được chuỗi này trong Olly cũng như trong kWdsm 10, nên ta dử dụng phương pháp dùng STACK :
**** Load và chạy chương trình với U và FR. Chương trình xúat hiện thông báo "Incomplete or incorrect information.". Giữ nguyên chương trình. Quay trở lại Olly.
**** Sau khi quay trở lại Olly, nhấn F12, Olly sẽ dừng chương trình lại. Nhấn tiếp Alt-K để hiện cửa sổ Call stack of main thread. Ta thấy ngay thông báo :

QUOTE
0012DAF0 77D6649A ? USER32.MessageBoxExA USER32.77D66495 0012DAEC
0012DAF4 0012030E hOwner = 0012030E ('Register IPMonitor',class='#32770'
0012DAF8 00423B80 Text = "Incomplete or incorrect information."
0012DAFC 008C2678 Title = "dum_"
0012DB00 00000030 Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0012DB04 00000000 LanguageID = 0 (LANG_NEUTRAL)
0012DB08 7C1DCD91 ? USER32.MessageBoxA mfc71.7C1DCD8B
0012DB0C 0012030E hOwner = 0012030E ('Register IPMonitor',class='#32770'
0012DB10 00423B80 Text = "Incomplete or incorrect information."
0012DB14 008C2678 Title = "dum_"
0012DB18 00000030 Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0012DC44 00417BE1 ? <JMP.&mfc71.#1123> dum_.00417BDC


**** Ở đây ta chú ý đến dòng :

QUOTE
0012DB08 7C1DCD91 ? USER32.MessageBoxA mfc71.7C1DCD8B


**** Double-Click vào dòng này ta đến địa chỉ 7C1DCD8B :

QUOTE
7C1DCD8B FF15 4016147C CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; USER32.MessageBoxA
7C1DCD91 85FF TEST EDI,EDI ; <== Set BreakPoint here


**** Sau khi đặt BP ở đây, Olly sẽ dừng chương trình lại, nhấn F8 để xuất hiện lại thông báo "Incomplete or incorrect information.". Nhấn OK để chấp nhận thông báo này, chương trình sẽ dừng lại ngay tại điểm BP này. Xoá điểm đặt BP này đi. Và dùng F8 trace tiếp.
**** Sau khi trace qua một số lần (ở chương trình này là 1 lần ) RETN ta nhìn lên trên chút và thấy

QUOTE
00417BD5 6A 00 PUSH 0
00417BD7 68 803B4200 PUSH dum_.00423B80 ; ASCII "Incomplete or incorrect information."
00417BDC E8 77240000 CALL <JMP.&mfc71.#1123>
00417BE1 5F POP EDI


- Đến đây CRACKING diễn ra bình thường

freewarez
07-06-2004, 18:21
II.2.2 – Dạng không hiện chuỗi khi truy ngược đến :

Homepage : http://www.genie-soft.com
Soft : Genie Backup Manager v4.0 b920
Cracked File : GBManager.exe (Microsoft Visual C++ 6.0)

- Dùng PeiD kiểm tra biết chương trình được viết bằng Microsoft Visual C++ 6.0
- Chạy thử chương trình với User (U) và Fake ****** (FR) ta nhận được thông báo "Incorrect ****** Number". Ta không thể tìm được chuỗi này trong Olly cũng như trong kWdsm 10, nên ta dử dụng phương pháp dùng STACK :
**** Load và chạy chương trình với U và FR. Chương trình xúat hiện thông báo "Incorrect ****** Number". Giữ nguyên chương trình. Quay trở lại Olly.
**** Sau khi quay trở lại Olly, nhấn F12, Olly sẽ dừng chương trình lại. Nhấn tiếp Alt-K để hiện cửa sổ Call stack of main thread. Ta thấy ngay thông báo :

QUOTE
0012DDF4 0032020E hOwner = 0032020E ('Register Genie Backup Mana
0012DDF8 00AE2CB8 Text = "Incorrect ****** Number"
0012DDFC 00AE2558 Title = "Genie Backup Manager"
0012DE00 00000010 Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
0012DE04 00000000 LanguageID = 0 (LANG_NEUTRAL)
0012DE08 73DD9CCB ? USER32.MessageBoxA MFC42.73DD9CC5
0012DE0C 0032020E hOwner = 0032020E ('Register Genie Backup Mana
0012DE10 00AE2CB8 Text = "Incorrect ****** Number"
0012DE14 00AE2558 Title = "Genie Backup Manager"
0012DE18 00000010 Style = MB_OK|MB_ICONHAND|MB_APPLMODAL


**** Double-Click vào dòng :

QUOTE
0012DE08 73DD9CCB ? USER32.MessageBoxA MFC42.73DD9CC5


**** Ta trở về chương trình trong Olly. Đặt BreakPoint ở lệnh ngay bên dưới địa chỉ này. Nhấn F8 để chạy chương trình. Xuất hiện thông báo "Incorrect ****** Number". Nhấn OK, Olly lập tức dùng chương trình lại.
**** Dùng F8 trace cho đến khi ta trở lại chương trình chính :

QUOTE
0045DC33 . E8 407E0700 CALL <JMP.&MFC42.#858>
0045DC38 . 51 PUSH ECX


**** Nhìn lên trên chút ta thấy có lệnh nhảy qua đoạn CODE này. Như vậy đây chính là đoạn CODE ta cần trong quá trình xem xét quá trình mã hoá của chương trình.

QUOTE
0045DC1A . E8 01400500 CALL GBManage.004B1C20 ; \GBManage.004B1C20
0045DC1F . 85C0 TEST EAX,EAX
0045DC21 . 74 45 JE SHORT GBManage.0045DC68 ; <=== JMP out of NAG if Serrial is Correct


- Đến đây CRACKING diễn ra bình thường.

freewarez
07-06-2004, 18:21
II.3 - Dạng không có thông báo trong hàm MessageBoxA :

Homepage : http://www.imtoo.com
Soft : ImTOO CD Ripper 1.0.4
Cracked File : cdripper.exe (Microsoft Visual C++ 6.0 [Debug])

- Dùng PeiD kiểm tra biết chương trình được viết bằng Microsoft Visual C++ 6.0 [Debug]
- Chạy thử chương trình với User (U) và Fake ****** (FR) ta nhận được thông báo "Invalid registration info!". Ta không thể tìm được chuỗi này trong Olly cũng như trong kWdsm 10, nên ta dử dụng phương pháp dùng STACK :
**** Load và chạy chương trình với U và FR. Chương trình xuất hiện thông báo "Invalid registration info!". Giữ nguyên chương trình. Quay trở lại Olly.
**** Sau khi quay trở lại Olly, nhấn F12, Olly sẽ dừng chương trình lại. Nhấn tiếp Alt-K để hiện Call stack of main thread :

QUOTE
Address Stack Procedure / arguments Called from Frame
0012EB70 77D43C6B Includes 7FFE0304 USER32.77D43C69 0012EBA4
0012EB74 77D4B406 USER32.WaitMessage USER32.77D4B401 0012EBA4
0012EBA8 77D4D9AA USER32.77D4B279 USER32.77D4D9A5 0012EBA4
0012EBD0 77D662F4 USER32.77D4D8F6 USER32.77D662EF 0012EBCC
0012EE88 77D65D77 ? USER32.SoftModalMessageBox USER32.77D65D72 0012EE10
0012EF5C 77F6379E ntdll.77F78C4E ntdll.77F63799 0012EF58


**** Ở đây ta chú ý đến dòng :

QUOTE
0012EE88 77D65D77 ? USER32.SoftModalMessageBox USER32.77D65D72 0012EE10


**** Double-Click vào dòng này ta đến địa chỉ 77D65D72 :

QUOTE
77D65D72 E8 19000000 CALL USER32.SoftModalMessageBox
77D65D77 66:837E 2C 00 CMP WORD PTR DS:[ESI+2C],0 ; <== Set BreakPoint here


**** Sau khi đặt BP ở đây, Olly sẽ dừng chương trình lại, nhấn F8 để xuất hiện lại thông báo "Invalid registration info!". Nhấn OK để chấp nhận thông báo này, chương trình sẽ dừng lại ngay tại điểm BP này. Xoá điểm đặt BP này đi. Và dùng F8 trace tiếp.
**** Sau khi trace qua một số lần (ở chương trình này là 7 lần ) RETN ta nhìn lên trên chút và thấy

QUOTE
004615F4 . 68 9C4E5300 PUSH cdripper.00534E9C ; |Arg1 = 00534E9C ASCII "Invalid registration info!"
004615F9 . E8 1E240700 CALL cdripper.004D3A1C ; \cdripper.004D3A1C


- Đến đây CRACKING diễn ra bình thường.

II.4 - Dạng không sử dụng hàm MessageBoxA :


- Dùng PeiD kiểm tra biết chương trình được PACK bằng ASPack 2.11c -> Alexey Solodovnikov. UnPACK và kiểm tra lại biết chương trình được viết bằng Borland Delphi 4.0 - 5.0
- Chạy thử chương trình với User (U) và Fake ****** (FR) ta nhận được thông báo “The license key ***X is not scorrect”. Ta không thể tìm được chuỗi này trong Olly cũng như trong kWdsm 10, nên ta sử dụng phương pháp dùng STACK :
**** Load và chạy chương trình với U và FR. Chương trình xuất hiện thông báo “The license key ***X is not scorrect”. Giữ nguyên chương trình. Quay trở lại Olly.
**** Sau khi quay trở lại Olly, nhấn F12, Olly sẽ dừng chương trình lại. Nhấn tiếp Alt-K để hiện Call stack of main thread :

QUOTE
0012F8B8 77D43C6B Includes 7FFE0304 user32.77D43C69 0012F8E8
0012F8BC 004561D4 <JMP.&user32.WaitMessage> up-gdb_.004561CF 0012F8E8
0012F8EC 004559A0 ? up-gdb_.00456100 up-gdb_.0045599B 0012F8E8
0012F910 00452C70 up-gdb_.00455984 up-gdb_.00452C6B 0012F960


**** Ở đây ta chú ý đến dòng :

QUOTE
0012F910 00452C70 up-gdb_.00455984 up-gdb_.00452C6B 0012F960


**** Double-Click vào dòng này ta đến địa chỉ 0012F960 :

QUOTE
00452C69 > /8B03 MOV EAX,DWORD PTR DS:[EBX]
00452C6B . |E8 142D0000 CALL up-gdb_.00455984
00452C70 . |8B03 MOV EAX,DWORD PTR DS:[EBX] ; <== Set BreakPoint here
00452C72 . |80B8 8C000000>CMP BYTE PTR DS:[EAX+8C],0
00452C79 . |74 0F JE SHORT up-gdb_.00452C8A
00452C7B . |8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00452C7E . |C780 34020000>MOV DWORD PTR DS:[EAX+234],2
00452C88 . |EB 14 JMP SHORT up-gdb_.00452C9E
00452C8A > |8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00452C8D . |83B8 34020000>CMP DWORD PTR DS:[EAX+234],0
00452C94 . |74 08 JE SHORT up-gdb_.00452C9E
00452C96 . |8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00452C99 . |E8 26FDFFFF CALL up-gdb_.004529C4
00452C9E > |8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00452CA1 . |8B80 34020000 MOV EAX,DWORD PTR DS:[EAX+234]
00452CA7 . |85C0 TEST EAX,EAX
00452CA9 .^\74 BE JE SHORT up-gdb_.00452C69


**** Sau khi đặt BP ở đây, chương dừng lại tại BP. Xoá BP . Nhấn tiếp F8 ta nhận thấy đoạn CODE trên là một vòng lặp . Để thoát khỏi vòng lặp này ta đặt BP bên ngoài vòng lặp này :

QUOTE
00452CAB . 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX ; <== Set BreakPoint here
00452CAE . 6A 00 PUSH 0


**** Nhấn F9 để đến BP này. Chương trình xuất hiện thông báo “The license key ***X is not scorrect”. Nhấn CANCEL để đóng thông báo này, lập tức ta trở lại chương trình trong Olly. Xoá điểm đặt BP này. Nhấn tiếp F8
**** Sau khi trace qua một số lần (ở chương trình này là 7 lần ) RETN ta nhìn lên trên chút và thấy

QUOTE
0050F58A |. E8 29FCFFFF CALL up-gdb_.0050F1B8
0050F58F |. 84C0 TEST AL,AL
0050F591 |. 74 5B JE SHORT up-gdb_.0050F5EE <=== JMP out of NAG if Serrial is Correct


- Đến đây CRACKING diễn ra bình thường.