Những kí thuật tốt hơn sẽ không bao giờ áp dụng phương pháp so sánh Serial đã tính toán được với Serial mà người sử dụng nhập vào nhưng phần chính của nó vẫn là một quá trình kiểm tra, t
Trang 1CrackMe hay là Soft cũng đều là những bài thực hành vô cùng bổ ích Công việc tiếp theo và cũng là cuối cùng , đó là chúng ta tiến hành tạo ra Keygen cho chương trình này :D
III – Making the Kegen :
- Keygenerator thực chất là công việc tìm ra thủ tục kiểm tra Serial và sau đó Reverse nó với mục đích để tìm hiểu xem quá trình Serial của chương trình được tạo ra và kiểm tra như thế nào? Có rất nhiều phương thức khác nhau để tạo ra một Serial Protection ,có thể dựa trên User name nhập vào , hay thông số ID từ máy PC của bạn Thậm chí nó có thể được tạo ra bằng việc sử dụng Hash Table hoặc một giải thuật phức tạp nào đó Những kí thuật tốt hơn sẽ không bao giờ áp dụng
phương pháp so sánh Serial đã tính toán được với Serial mà người sử dụng nhập vào nhưng phần chính của nó vẫn là một quá trình kiểm tra, trong trường hợp soft
mà chúng ta đang crack này Right Serial không được hiển thị , mà nó được tính toán thông qua một giải thuật hết sức yếu kém và sau đó được hiện thị một cách rõ ràng trên thanh ghi Giá trị Right Serial tính toán được này sau đó sẽ được đem so sánh với Serial mà chúng ta nhập vào Trong phần cuối của bài viết này các bạn sẽ thấy được quá trình tính toán Serial và sẽ thấy được giải thuật mà chương trình đem ra sử dụng yếu kém như thế nào!
- Qúa trình tạo ra Serial được thực hiện đầu tiên và sau đó sẽ là thao tác kiểm tra,
so sánh Serial mà ta nhập vào với Serial mà chương trình tính toán được , giải thuật tính toán Serial rất đơn giản và nằm từ đoạn code có địa chỉ từ 004117D9 tới
0041177F Do trong quá trình Serial Fishing ở trên , chúng ta đã tiến hành nhập
Right Serial và chương trình đã được Registered, vậy để có thể trở lại trạng thái lúc ban đầu chúng ta phải xóa thông tin đăng kí đi Ta vào thư mục Windows và tìm file sau ripenc.ini, open file này và tìm đến đoạn chứa thông tin vể User Name & Reg code thì chúng ta xóa đi Chương trình sẽ trở về trạng thái ban đầu
- Để có thể tìm ra được đoạn code tính toán Serial chúng ta phải lần ngược từ chỗ câu lệnh check CMP EBP, EAX (tại địa chỉ 0041181D) Bạn hãy nhớ lại , khi chúng ta đặt BP tại địa chỉ này và tiến hành đăng kí chương trình , sau khi nhấn
Register chương trình sẽ Ice tại địa chỉ trên Nhìn sang cửa sổ Register (FPU) các
bạn sẽ thấy được giá trị Right Serial được lưu trong thanh ghi EBP Vậy thì quá trình tính toán chắc chắn phải nằm ở phía trên Dịch lên trên một chút các bạn sẽ bắt gặp một lệnh CALL :
Trang 2- Chúng ta nghi ngờ rằng lệnh CALL này sẽ là lời gọi tới một hàm tính toán Serial ,kết thúc quá trình tính toán cũng giá trị trả về sẽ là Right Serial nằm trong thanh ghi EBP OKi , thử đặt một BP tại địa chỉ 0041180A (Call Function) , sau đó thực hiện lại quá trình đăng kí chúng ta sẽ Ice tại lệnh Call này Nhưng lạ thay giá trị của EBP đã là Right Serial rồi , chưa cần chúng ta phải thực hiện lệnh Call :
- Điều này cho chúng ta thấy rằng lệnh Call trên không phải như những gì chúng ta mong đơi, mà qúa trình tính toán Serial hóa ra lại nằm ở phía trên lệnh Call này Kéo lên trên để quan sát, nhưng lạ thay chúng ta chẳng thấy có một lệnh Call nào khả nghi cả, nhưng bù lại chúng ta tìm được một thứ rất quan trọng Đó là câu lệnh tại địa chỉ 004117FF : 004117FF 8DAC8A 155E01>LEA EBP, DWORD
PTR DS:[EDX+ECX*4+15E15] Đây chính là câu lệnh gán giá trị cho EBP mà
cuối cùng chính là Right Serial, nó được tạo thành với sự tham gia của các thanh ghi EDX, ECX và một giá trị mặc định là 0x15E15 Do đó dịch lên một chút,
chúng ta sẽ đặt một BP tại : 004117D9 8B07 MOV EAX, DWORD PTR
DS:[EDI] Tiến hành lại thao tác đăng kí , chúng ta Ice tại địa chỉ mà chúng ta đăt
BP Ta sẽ tìm hiểu quá trình tính toán của chương trình để cho ra Right Serial Code:
- ====== Calculation ====== -
004117D9 8B07 MOV EAX, DWORD PTR DS:[EDI] ; <==
FU
004117DB BA 01000000 MOV EDX, 1 ; <== Temp = 1 004117E0 8B48 F8 MOV ECX, DWORD PTR DS:[EAX-8] ;
<== Length (FU)
004117E3 33C0 XOR EAX, EAX
004117E5 85C9 TEST ECX, ECX
004117E7 7E 0C JLE SHORT cdrip.004117F5
004117E9 > 0FBE6C04 38 MOVSX EBP, BYTE PTR SS:[ESP+EAX+38]
; <== FU[i]
Trang 3004117EE 03D5 ADD EDX, EBP ; <== Temp = Temp + FU[i]
004117F0 40 INC EAX ; <== i ++
004117F1 3BC1 CMP EAX, ECX ; <== While (i < Length(FU))
004117F3 .^ 7C F4 JL SHORT cdrip.004117E9 ; <==
Continue
004117F5 > 8BC2 MOV EAX, EDX ; <== Value = Temp
004117F7 C1E0 06 SHL EAX, 6 ; <== Value = Value
* 64
004117FA 03C2 ADD EAX, EDX ; <== Value = Value + Temp
004117FC 8D0CC0 LEA ECX, DWORD PTR DS:[EAX+EAX*8] ;
<== Value1 = Value + Value * 8
004117FF 8DAC8A 155E01>LEA EBP, DWORD PTR
DS:[EDX+ECX*4+15E15] ; <== RightSerial = Temp + Value1 * 4 + 0x15E15
00411806 8D4C24 1C LEA ECX, DWORD PTR SS:[ESP+1C]
- ====== Calculation ====== -
- Qua đoạn Code trên ta có thể tóm tắt lại quá trình tính toán Serial như sau :
1- EAX trỏ tới chuỗi Fake User, thanh ghi EDX được khởi gán bằng 1 (Temp = 1),
ECX chứa chiều dài của chuỗi Fake User Có một vòng lặp tính toán từ địa chỉ 004117E9 > 004117F3 Đây là vòng lặp tính toán với từng kí tự của chuỗi Fake User nhập vào, mà cụ thể là quá trình cộng từng kí tự (Ascii Code) lại với nhau , lặp lại tới khi hết chuỗi , kết quả sẽ được lưu tại thanh ghi EDX (Temp)
2- Giá trị của thanh ghi EDX (Temp) này sau khi kết thúc vòng lặp sẽ được gán
cho thanh ghi EAX (Value) Sau đó giá trị của thanh ghi EAX sẽ được tính toán lại thông qua câu lệnh SHL EAX, 6 tức là Value = Value * 64
3- Tiếp theo EAX sẽ được cộng với EDX, kết quả có được được gán lại cho EAX
(Value = Value + Temp)
4- Thanh ghi ECX (Value1) sẽ được tính toán dựa trên EAX thông qua ECX =
EAX + EAX * 8 (Value1 = Value + Value * 8)
5- Và cuối cùng thanh ghi EBP (Right Serial) sẽ được tính toán EBP = EDX +
ECX * 4 + 0x15E15 (RightSerial = Temp + Value1*4 + 0x15E15)
- Quá trình phân tích đã xong , công việc còn lại bây giờ là dùng VB 6.0 để Code Keygen dựa trên những gì chúng ta đã phân tích Open VB6.0 lên , chọn Project là
Standard.exe, nhấn Open Tiến hành thiết kế Form như hình minh họa dưới đây :
Trang 4- Sau đó ta vào cửa sổ Code Window, ta tiến hành coding : Code:
Private Sub cmdREA_Click()
Form2.Show 1
End Sub
Private Sub Form_Load()
txtSerial.Text = ""
txtUserName.Text = ""
End Sub
Private Sub txtUserName_Change()
' -
' Serial Generator from UserName
' -
EAX = 0
ECX = 0
EDX = 0
Trang 5
' -
' Serial Generation routine
' -
UserName = txtUserName.Text
If Len(Name) > 0 Then
EDX = 1
For Index = 1 To Len(UserName)
EDX = EDX + Asc(Mid$(UserName, Index, 1))
Next Index
EAX = EDX
EAX = EAX * 64
EAX = EAX + EDX
ECX = EAX + EAX * 8
EBP = EDX + ECX * 4 + 89621 '0x15E15
txtSerial.Text = EBP
End If
If txtUserName.Text = "" Then txtSerial.Text = ""
End Sub
- Sau khi Test và run thử , Keygen của chúng ta đã hoạt động rất tốt Vậy là chúng
ta vừa hoàn thành xong việc Cracking cũng như viết một Keygen hết sức đơn giản cho chương trình Hẹn gặp lại các bạn ở tut sau : )
III – End of Tut :
- Finished – June 6, 2005
++ ==[ Greatz Thanks To ]== ++
- Thank to my family, Computer_Angel, Moonbaby , Zombie_Deathman,
Littleboy, Benina, QHQCrker, the_Lighthouse, Hoadongnoi, Nini all REA‘s members, HacNho,RongChauA,Deux, tlandn, dqtln , ARTEAM all my friend,
Trang 6and YOU :jerry:
>>>> If you have any suggestions, comments or corrections email me:
kienbigmummy[at]gmail.com
REVERSE ENGINEERING ASSOCIATION
http://www.reaonline.net [Serial Fishing] RunViewer 1.2
Mấy bữa nay bận thật, trình cho các pác tut mới nhất của em nè
REVERS ENGINEERING ASSOCCIATION
Target: RunViewer 1.2
Homepage: www.softvers.com/RunViewer
Protect: Serial
Pack: Not use (Microsoft Visual C++ 6.0)