CrackMe 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 : - 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] 004117EE . 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 : - 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 ' ' 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, and 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) . 00 411 7D9 . 8B07 MOV EAX, DWORD PTR DS:[EDI] ; <== FU 00 411 7DB . BA 01 0 00 000 MOV EDX, 1 ; <== Temp = 1 00 411 7E0 . 8B48 F8 MOV ECX, DWORD PTR DS:[EAX-8] ; <== Length (FU) 00 411 7E3. . 33C0 XOR EAX, EAX 00 411 7E5 . 85C9 TEST ECX, ECX 00 411 7E7 . 7E 0C JLE SHORT cdrip .00 411 7F5 00 411 7E9 > 0FBE6C04 38 MOVSX EBP, BYTE PTR SS:[ESP+EAX+38] ; <== FU[i] 00 411 7EE . 03 D5 ADD. Temp + FU[i] 00 411 7F0 . 40 INC EAX ; <== i ++ 00 411 7F1 . 3BC1 CMP EAX, ECX ; <== While (i < Length(FU)) 00 411 7F3 .^ 7C F4 JL SHORT cdrip .00 411 7E9 ; <== Continue 00 411 7F5 > 8BC2