HƯỚNG DẪN CRACK PHẦN MỀM - PHẦN V


nào tiếp tục, các bạn hãy kiên nhẫn đọc từng bài rồi suy ngẫm nhé, vội vàng khó thành công !Phần V 

Chào các bạn, đáng lẽ bài hôm nay sẽ hướng dẫn các bạn khái niệm về keygen nhưng vì chắc các bạn cũng cũng chưa rành cách crack lắm nên bài này sẽ tiếp tục hướng dẫn các bạn cách crack một số phần mềm để cho quen dần…sau đó mới tiếp tục nâng cao trình độ là viết keygen…------------------- 

Như thường lệ chúng ta sẽ đi qua phần lý thuyết một chút. Bài viết này sẽ hướng dẫn các bạn một chút về các câu lệnh asm đơn giản 

Chú ý : Trong bài viết này, phần lý thuyết tôi có tham khảo bài viết của một fan vicki 
--------------------- 
I. Lý Thuyết 

Tính offset của lệnh JMP, JX, JNX & CALL 


I. Lý thuyết 

1. Giới thiệu 

Xin chào các bạn! Trong bài viết này tôi muốn giải thích với các bạn cách tính toán offset của các câu lệnh JUMPS và CALL. Bạn sẽ thường xuyên tính toán offset của các câu lệnh này trong reverse. Đặc biệt, hiểu được cách tính cũng giúp bạn tiếp cận với kĩ thuật làm mù điểm vào host trong virus (EPO - EntryPoint Obscrured) một cách dễ hơn! 

2. Các loại câu lệnh JUMPS & CALL 

Ở đây tôi chỉ mô tả sự khác biệt của các câu lệnh JUMPS & CALL mà bạn thường gặp! 

a) Short Jumps: nhảy ngắn có hoặc không có điều kiện đều là 2 byte. Bạn chỉ có thể nhảy tới 127 byte hoặc nhảy lùi 128 byte với các short jumps 

b) Long Jumps: nhảy dài, 6 byte cho có điều kiện hoặc 5 byte cho không điều kiện 

c) Calls: 5 byte ở dạng short 

* Đây là bảng mã máy mô tả sự khác biệt giữa các loại JUMPS & CALLS 

Jump Description Short Op-Code Long Op-Code 
call procedure call E8xxxxxxxx N/A 
jmp unconditional jump EBxx E9xxxxxxxx (nhảy không có điều kiện)
ja/jnbe jump if above 77xx 0F87xxxxxxxx (nhảy nếu lớn hơn)
jae/jnb/jnc jump if above or equal 73xx 0F83xxxxxxxx (nhảy nếu lớn hơn hoặc bằng)
jb/jc/jnae jump if below 72xx 0F82xxxxxxxx (nhảy nếu bé hơn)
jbe/jna jump if below or equal 76xx 0F86xxxxxxxx 
(nhảy nếu bé hơn hoặc bằng)
jcxz/jecxz jump if cx/ecx equals zero E3xx N/A
je/jz jump if equal/zero 74xx 0F84xxxxxxxx 
jne/jnz jump if not equal/zero 75xx 0F85xxxxxxxx 
jg/jnle jump if greater 7Fxx 0F8Fxxxxxxxx (nhảy nếu nhiều hơn)
jge/jnl jump if greater or equal 7Dxx 0F8Dxxxxxxxx 
(nhảy nếu nhiều hơn hoặc bằng)
jl/jnge jump if less 7Cxx 0F8Cxxxxxxxx (nhảy nếu ít hơn)
jle/jng jump if less or equal 7Exx 0F8Exxxxxxxx (nhảy nếu ít hơn hoặc bằng)
jno jump if not overflow 71xx 0F81xxxxxxxx (nhảy nếu không tràn)
jnp/jpo jump if no parity/parity odd 7Bxx 0F8Bxxxxxxxx 
jns jump if not signed 79xx 0F89xxxxxxxx 
jo jump if overflow 70xx 0F80xxxxxxxx (nhảy nếu tràn)
jp/jpe jump if parity/parity even 7Axx 0F8Axxxxxxxx 
js jump if sign 78xx 0F88xxxxxxxx 
(vì để các bạn dễ hiểu nên caothean tui đã dịch tạm ra Tiếng Việt, có sai sót mong thông cảm, và cũng SR HAV vì chưa xin phép sửa)
Vấn đề của chúng ta là cần tính các số xx và xxxxxxxx trong mã máy 

3. Tính toán offset 

* Công thức: OFFSET = địa chỉ của nơi đến - (địa chỉ nơi jumps/calls + kíck thước của câu lệnh jumps/calls) 

* Ví dụ: 

a) Bạn đang ở tại địa chỉ 40108E. Bạn cần đặt một lệnh nhảy đến địa chỉ 4020D0 tại địa chỉ này 

:40108E JMP 4020D0 

Offset = 4020D0 - [40108E + 5(E9xxxxxxxx có kích thước 5 byte)] = 103D. Mã máy sẽ là E93D100000, trong đó E9 là mã máy của JMP và 3D100000 là số xxxxxxxx mà bạn vừa tính được (0000103D viết ngược lại sẽ là 3D100000) 

b) Bạn cần đặt một lệnh CALL đến địa chỉ 401184 tại địa chỉ 40218B 

:40218B CALL 401184 

Offset = 401184 - [40218B + 5(E8xxxxxxxx có kích thước 5 byte)] = FFFFEFF4. Mã máy sẽ là E8F4EFFFFF, trong đó E8 là mã máy của CALL và F4EFFFFF là số xxxxxxxx mà bạn vừa tính được (FFFFEFF4 viết ngược lại sẽ là F4EFFFFF) 

II. Thực hành 

Bạn đã dùng Notepad! Mỗi lần mở file có kích thước vượt quá 64KB, Notepad sẽ hiển thi một hộp thông báo "Lỗi: File có kích thước quá lớn. Bạn có muốn dùng WordPad để đọc file này không?" - Yes | No . Nhiệm vụ của chúng ta là patch file notepad.exe để mỗi khi mở file có kích thước lớn hơn 64KB nó sẽ không hiển thị hộp thông báo trên nữa và tự động mở file bằng WordPad cho bạn. Trước khi bắt đầu mọi việc, bạn hãy sao lưu file notepad.exe trước đề phòng sự cố! Thật ra thì cũng không cần thiết bởi bạn có thể dùng SFC(System File Checker) của Windows để restore lại file notepad.exe bất cứ lúc nào. Trong ví dụ này tôi dùng bản Notepad của Windows98SE. 

1/ Chạy W32Dasm. Sau khi dism file xong, bạn vào menu Ref/String Data References, tìm dòng String Resource ID=00056: "wordpad.exe" và double click lên nó. Để xem chúng ta có gì nào?! 

* Possible Reference to String Resource ID=00036: "&f" 

:004033A5 6A24 push 00000024 ; rất quan trọng 
:004033A7 A1B4504000 mov eax, dword ptr [004050B4] 
:004033AC 56 push esi 
:004033AD 50 push eax 
:004033AE FF7508 push [ebp+08] 

* Reference To: USER32.MessageBoxA, Ord:01ACh 

:004033B1 FF15A8644000 Call dword ptr [004064A8] ; hiện messagebox 
:004033B7 83F806 cmp eax, 00000006 ; đã chọn YES hay NO? (IDYES=6) 
:004033BA 0F85A7000000 jne 00403467 ; NO -> thoát 
:004033C0 6804010000 push 00000104 ; YES -> mở file bằng WordPad 
:004033C5 8D858CFDFFFF lea eax, dword ptr [ebp+FFFFFD8C] 
:004033CB 837D1001 cmp dword ptr [ebp+10], 00000001 
:004033CF 1BFF sbb edi, edi 
:004033D1 50 push eax 
:004033D2 83C737 add edi, 00000037 

* Possible Reference to String Resource ID=00056: "wordpad.exe" 

:004033D5 6A38 push 00000038 
:004033D7 FF3540554000 push dword ptr [00405540] 
Chúng ta chỉ cần thay PUSH 00000024 tại địa chỉ 4033A5 thành lệnh nhảy ngắn đến địa chỉ 4033C5. Mã máy của short jump là EBxx. May mắn là kích thước của short jump này là 2 byte, đúng bằng kích thước của câu lệnh PUSH 00000024 tại địa chỉ 4033A5 (6A24)! Áp dụng công thức tính offset ở trên, xx = 4033C0(địa chỉ đến) - [4033C5(địa chỉ jump) + 2 (kích thước của short jump EBxx)] = 19. Okay, mã máy sẽ là EB19! 

6A24 PUSH 00000024 
EB19 JMP 004033C0 

2/ Chạy Hiew và mở file notepad.exe. Nhấn F4, F5 và nhập vào ".4033A5". Nhấn F3 và thay đổi 6A24 thành EB19, sau đó bấm F9 và F10. Xong, thử chạy lại Notepad và mở một file có kíck thước lớn hơn 64KB xem sao! 

------------------------------------------------------------------------- 

II. Thực hành 

Vì phần lý thuyết có lẽ khá phức tạp đối với các bạn newbie, nên trong phần thực hành chúng ta sẽ giải trí với phần một phần mềm khá nổi tiếng của hãng EURONET đó là phần mềm Hanami…Một phần mềm trang trí cho desktop…Nó làm một cây anh đào ngay trên desktop, sao đó những cách hoa đào sẽ rơi nhè nhẹ xuống thanh taskbar…Lâu lâu lại có một cơn gió thổi qua làm nhưng cánh hoa đào cuốn theo chiều gió bay thật đẹp… 

Đẹp thì có đẹp đó…Nhưng “thằng Hanami” này bắt bạn phải đăng ký…Nếu bạn không đăng ký thì mỗi lần bạn chạy chương trình nó sẽ đập vào mặt bạn một cái nag “ Not registered…hanami is shareware….” thật bực mình…Dĩ nhiên là bạn không muốn cái nag đó hiện ra chứ gì…Đúng vậy…Nhu cầu bức thiết là chúng ta phải crack nó…Ok Sau khi tải về (từ site euronet), bạn cài đặt, copy một bản hanami.exe ra dự phòng, rủi làm bậy còn có cái mà backup lại…Okie chúng ta bắt đấu crack nó. 

Phần mềm : Hanami (http://www.euronet.nl/~rja/Hanami/
Công cụ : Windasm, Hiew 
Cracker : hacnho 

Đầu tiên bạn chạy hanami, một cái nag “ Not registered…hanami is shareware….” Văng ra, bạn hãy nhớ dòng “…shareware”, click ok…Sau đó bạn vào bạn click vào nút lệnh (command button) “ Register…”, một cái nag khác văng ra bắt bạn nhập vào “ your name”, “keyword”, “Registration Code” 

…He he bạn đừng tưởng bở là cái “ keyword” không có tác dụng nhe…Tuy phần mềm rất nhỏ nhưng tác giả lại đặt một cơ chế tạo key phức tạp nhiêu khê…Nếu dùng SoftIce để tìm số code thì hơi lâu…Nên tôi dùng phương pháp đơn giản là patch nó 

hãy nhập vào tên, keyword và Registration Code. Ở đây tôi nhập vào 

Your name : hacnho 
Keyword :123456 
Registration Code: abcdef 

Enter, oh la la một nag văng ra “ Error…The registration code entered is incorect”…Ok hãy nhớ lấy nó, bạn hãy thoát hanami. 

Bây giờ chúng ta mở WDASM lên, chọn file Hanami.exe…chờ WDASM disassembly xong bạn vào menu Refs, chọn String Data References, kiếm cho ra dòng “The registration code entered”, double click vào nó hai lần…Bạn trở lại màn hình của nhìn xem chúng ta đang ở đâu…bạn sẽ thấy như thế này: 

* Possible String Ref from Data Obj -->"The registration code entered" 
-->"is incorect" 

:0040886C 68E8424100 push 004142E8 
:00408871 8B4D08 mov ecx, dword ptr [ebp+08] 
:00408874 51 push ecx 

* Refenrence To: USER32.MessageBoxA, Ord :01BEh 


:00408875 FF1534124100 Call dword ptr [00411234] 
:0040887B EB5A jmp 004088D7 


Bây giờ bạn thấy vệt sáng đang ở tại 
:0040886C 68E8424100 push 004142E8 
hãy dịch chuyển vệt sáng lên trên vài dòng bạn sẽ thấy như sau 

*. Possible String Data Ref from Data Obj --> " " 
:0040884F 68B0384100 push 004142E0 
:00408854 E827140000 call 00409C80 
:00408859 83C408 add esp, 00000008 
:0040885C E828FEFFFF call 0040869 --> gọi thông báo đăng ký 
:00408861 85C0 test eax, eax -->kiểm tra số code 
:00408863 7518 jne 0040887D--> nhảy nếu sai (chổ cần crack, nhớ lấy) 
:00408865 6A00 push 0000000 

đưa vệt sáng đến dòng :00408863 7518 jne 0040887D, nhìn xuống thanh task bar thấy offset là : 00008863 (1) 

Trở lại bảng menu Refs, chọn String Data References, bạn tìm dòng " Hanami is a shareware program", double click...Chúng ta lại ra ngoài, Bạn sẽ thấy như sau 


* Possible String Ref from Data Obj -->" Hanami is a shareware program" 
:004014DE 68583F4100 push 00412F58 -->bạn đang ở đây 
:004014E3 A1CC584100 mov eax, đwor ptr [004158CC] 
:004014E8 50 push eax 


* Refenrence To: USER32.MessageBoxA, Ord :01BEh 

:004014E9 FF1534124100 call dword ptr [004011234] 


hãy dịch chuyển lên và dòng, bạn thấy 

*. Referenced by a (U)nconditional or ©onditional Jump at Address: 
|:004014B4© 

:004014CE 833DF053410000 cmp dword ptr [0040153F0], 00000000 
:0040014D5 7518 jne 004014EF --> nhảy nag "Not Registered Yet", cần crack 
:004014D7 6A00 push 00000000 

*.* Possible String Ref from Data Obj -->"Not Registered Yet" 
:004014D9 push 00413F44 

bạn hãy di chuyển vệt sáng đến dòng :0040014D5 7518 jne 004014EF, nhìn xuống task bar, thấy offset là 000014D5 (2) 

***từ (1) và (2) ta có hai địa chỉ offset là 00008863 , và 000014D5, do jne nghĩa là nhảy nếu không bằng, từ là bạn nhập sai thì sẽ nhảy tới thông báo sai, do đó ta cần crack ở chổ đổi cho nó dù nhập sai thì sẽ không nhảy...vậy thì ta chỉ cần đổi jne thành je ( 75 thành 74) 

Ok bây giờ bạn hãy ghi lại hai offset trên, mở Hiew, mở file hanami.exe lên 

Gõ F5, nhập 00008863, gõ F3, sửa 75 thành 74, gõ F9 
Gõ F5, nhập 000014D5, gõ F3, sửa 75 thành 74, gõ F9, gõ F10 

Okie bây giờ bạn ở Hanami lại xem, bạn sẽ thích ngay mà ha ha ha 
----------------- 
bài viết của hacnho (vui lòng để lại dòng này khi bạn trích dẫn--thanx a lot) 
------------------- 

trong phần 6 tôi sẽ hướng dẫn các bạn dùng các công cụ crack engine như file patcher 2002, và đặc biết là crack engine của anh Lê Vũ Hoàng, 
**************************************: 



Các bạn xem thêm các phần khác tại đây: Crack phần mềm

Loading...