DevelBranch
Software Research and Development

Cracking Immortal Descendants Crackme 8

Posted in Tutorials with Crackme, Reversing, VB, Visual Basic

WhizKID's Crackme Challenge 8 WhizKID's Crackme Challenge 8

Hôm nay, tôi sẽ hướng dẫn một vài phương pháp để giải một bài crackme. Tôi sử dụng WhizKID's Crackme Challenge 8 (HERE). Tôi sử dụng máy ảo VMware và thử chạy crackme này. Crackme hoạt động hoàn toàn bình thường.

Thử kiểm tra ứng dụng với chương trình PEiD, ta có kết quả như sau:

Chương trình này được viết bằng Visual Basic. Để đơn giản, tôi sử dụng VB Decompiler thử dịch ngược chương trình. Thử mở form của chương trình, có thể nhận thấy chương trình có 7 nút "Check key" khác nhau nhưng được đặt ở cùng một vị trí. Mỗi khi lựa chọn một option( Easy serial, Harder Serial, ...) thì nút tương ứng sẽ được hiển thị ( thuộc tính Visible được thiết lập bằng True).

Easy Serial

Khi chọn tùy chọn "Easy Serial", chương trình sẽ hiển thị nút ứng với Command1.
Mở đoạn code tương ứng với "Easy Serial", có thể nhận thấy khi nhập serial là 23784628356267, chương trình sẽ hiển thị "Easy Serial Part Completed..." và qua được thử thách này.

Private Sub Command1_Click() '40E890
Dim var_1C As Variant
loc_0040E8B5: var_8 = &H401188
loc_0040E8F8: Set var_1C = Me
loc_0040E907: var_18 = Text1.Text
loc_0040E911: If var_18 >= 0 Then GoTo loc_0040E929
loc_0040E962: If (var_18 = "23784628356267") = 0 Then GoTo loc_0040EA0D
loc_0040E9A9: var_18 = Me.BackColor
loc_0040E9CA: var_4C = 10
loc_0040E9D0: var_54 = 80020004h
loc_0040E9D3: var_34 = var_18
loc_0040E9D6: var_44 = 80020004h
loc_0040E9E7: var_3C = 8
loc_0040E9EA: var_64 = "Failed Easy Serial Part..."
loc_0040E9F1: var_6C = 8
loc_0040E9F4: var_2C = "Failed Easy Serial Part..."
loc_0040EA08: GoTo loc_0040EAAD
loc_0040EA4E: var_18 = Me.BackColor
loc_0040EA6C: var_5C = 10
loc_0040EA6F: var_4C = 10
loc_0040EA75: var_54 = 80020004h
loc_0040EA78: var_34 = var_18
loc_0040EA7B: var_44 = 80020004h
loc_0040EA8C: var_3C = 8
loc_0040EA8F: var_64 = "Easy Serial Part Completed..."
loc_0040EA96: var_6C = 8
loc_0040EAAD:
loc_0040EAB1: MsgBox "Easy Serial Part Completed...", 64, var_18
loc_0040EAE3: GoTo loc_0040EB13
loc_0040EB12: Exit Sub
loc_0040EB13: Exit Sub
End Sub

Harder Serial

Tương tự phần trước, phần 2 cũng so sánh chuỗi nhập vào với một xâu cố định. Nhưng khác so với phần trước, xâu cố định phải tính toán qua hàm _vbaStrR8 . Để đơn giản, có thể sử dụng OllyDbg để đặt breakpoint tại địa chỉ 0x40EC42.

Có thể thấy serial phù hợp là ADUJSDMD8387079498SOPEMNSD

Name/Serial

Phần này khó hơn các phần trước do cần 2 yếu tố để xác thực. Chương trình yêu cầu người dùng nhập tên và serial, Serial đúng sẽ được tính toán dựa trên name. Kiểm tra Command3:

 

Có thể thấy rằng serial được tính thông qua hàm MakeKey ( địa chỉ 0x0040EE80) sau đó tính toán và trả về một số tương ứng. số này là serial. VB Decompiler gần như không có tác dụng gì khi decompiler hàm này. Kết quả sai hoàn toàn.

Trong tình huống này, tôi sử dụng IDA. Tôi đọc nội dung của hàm MakeKey và hiểu thuật toán sinh serial của hàm. Hàm này có thể viết một đoạn giả mã như sau:

def serial(name):
    return ((ord(name[-1]) * 13 + (483 / 3)) ** 2) * 154

Matrix Part

Bài này đơn giản hơn, có lẽ do có bug. Chỉ cần tick tất cả các checkbox là xong.

Key File

Phần này thì đơn giản hơn, KeyFile ứng với Option4. Mở nội dung của hàm này bằng VB decompiler thì sẽ không thấy phần kiểm tra file để active chương trình đâu cả. Vấn đề này luôn xảy ra do VB Decompiler có lúc sai. Chúng ta xem kĩ hàm này bằng IDA. Địa chỉ hàm là 0x4118A0:

 

Sau khi kiểm tra hàm một lượt, tôi phát hiện hàm gọi tới địa chỉ 0x40F4B0 để check file.

Phân tích hàm này bằng VB Decompiler, Có thể thấy rằng: Nếu ta đặt 1 file cùng thư mục với Crackme và có tên là wk.dat, nội dung của file là "Easy, eh?", ta sẽ qua được phần kiểm tra.

NAG

Phần này có lẽ nên patch chương trình, vì nó không có gì thú vị cả. Nhảy tới địa chỉ 0x00412B5E, và patch các lệnh NOP mã 0x90 tới địa chỉ 0x412B6F. Để đơn giản, có thể convert địa chỉ 0x00412B5E thành offset trên file : 0x00012B5E và patch 18 byte NOP.

cripple

Phần này cũng chả có gì để bàn. Nút disable thực chất chỉ hiển thị đúng một messagebox có chữ  "Cripple Part Completed..."