-- title: '20 bài crack' disqus: Nguyễn Hồng Phúc- HE173087 --- CrackMe #1 === Đề bài --- 1. Find the serial key and enter in the textbox 2. Patch the file to always show the Congrats message when button Check is clicked ![image](https://hackmd.io/_uploads/HkSG6NacT.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra thì thấy rằng mình sẽ nhập serial key và nếu nhập sai sẽ thông báo lỗi ![image](https://hackmd.io/_uploads/HkLKI4a96.png) 2. Muốn không hiện thị lỗi thì chúng ta sẽ cần khiến bảng lỗi không xuất hiện nên em đã đi tìm dòng chứa câu lệnh lỗi bằng `Strings references` ![image](https://hackmd.io/_uploads/HksvvVpqa.png) 3. Click vào dòng `0411B00` để xem ![image](https://hackmd.io/_uploads/Bk0buNacT.png) 4. Nhìn trong đoạn code asm thấy rằng lệnh jne kia sẽ nhảy đến dòng hiển thị `Sorry` mà không thực hiện `Congrats` khi mà test kiểm tra rằng eax = 1 bởi vì nếu eax không bằng 0, kết quả của phép AND sẽ không phải là 0 và cờ ZF sẽ không được thiết lập. Trong trường hợp này, jne sẽ thực hiện nhảy tới nhãn chỉ định, bỏ qua các lệnh tiếp theo trong chuỗi lệnh. 5. Nên chúng ta cần đặt `eax` = 0 là xong bằng cách đổi `or eax,1` thành `and eax,0` bởi vì câu lệnh `or eax,1` khiến nó thành 1 vì or chỉ cần 1 bên còn and cần 2 bên nên 1 cái bằng 0 thì đều bằng 0 6. Đổi câu lệnh như trong ảnh ![image](https://hackmd.io/_uploads/r1-hnNT56.png) 7. Sau nó tạo file và xem kết quả ![image](https://hackmd.io/_uploads/B1a1pEpcT.png) CrackMe #2 === Đề bài --- Without patching, Register it to your name. ![image](https://hackmd.io/_uploads/HyOLa4acp.png) Cách làm --- 1. Đề bài yêu cầu không cần patching nên là bài này sẽ không cần sửa code chỉ cần tìm keyword gì đó được giấu trong code 2. Mở bài thử xem có gì không ![image](https://hackmd.io/_uploads/B1R-RVTqT.png) 3. Cho vào x32dbg và vào `Strings References` để xem chuỗi kí tự để tìm điểm vào ![image](https://hackmd.io/_uploads/HkCrJracT.png) 4. Có một số thứ khá hay ho là chúng ta cần hiện chữ `Registered to` chứ không phải `Unregistered` nên là chúng ta cần đọc code asm để hiện ra chữ đó 5. Nhìn code chúng ta có thể thấy câu lệnh je tại `0040104E` sẽ nhảy qua `Registered to` mà câu lệnh này lại kiểm tra `esi` với `FFFFFFFF`(ở đây thể hiện file không tồn tại nếu esi = FFFFFFFF) ![image](https://hackmd.io/_uploads/SkX57Ha5a.png) 6. Nhìn lên trên nữa có thể thấy nó cố đọc file `keykile.txt` cho vào `eax` để chuyển vào `esi` suy ra nếu mà tồn tại file `keyfile.txt` thì `esi` không bằng `FFFFFFFF` nên câu lệnh `jump equal` sẽ không được thực hiện vào show ra kết quả cần làm ![image](https://hackmd.io/_uploads/rk9WNSac6.png) 7. Em đã tạo file keyfile.txt vào xem kết quả ![image](https://hackmd.io/_uploads/SkqoEracT.png) CrackMe #3 === Đề bài --- 1. Remove the 2 nag screens – one at startup and one at close of program. 2. In the About screen – change status to Registered. ![image](https://hackmd.io/_uploads/ryx7BBa56.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra ![image](https://hackmd.io/_uploads/BkW_DrTqa.png) ![image](https://hackmd.io/_uploads/ByrKDBTq6.png) ![image](https://hackmd.io/_uploads/ry4t5Ba96.png) ![image](https://hackmd.io/_uploads/BJr9PS6ca.png) 2. Cho file vào x32dbg và mở `Strings References` xem vào chọn câu lệnh ![image](https://hackmd.io/_uploads/B1Qv_rTqp.png) 3. Nhìn thấy cái jne sẽ nhảy qua cái cửa sổ đầu tiên nên em sẽ đổi `jne` thành `je` tại vì bình thường nếu để jne nó sẽ không qua nên em để đổi của là je nên nó sẽ nhảy qua ![image](https://hackmd.io/_uploads/r16JYBpc6.png) Bypass được cái đầu ![image](https://hackmd.io/_uploads/SywrFS65T.png) 4. Muốn bypass được cái thứ 2 cta cần đọc code vào có thể thấy nó thực hiện câu lệnh `je` nhảy tới `Unregistered` nên chúng ta sẽ đổi thành đối của nó để không nhảy là `jne` ![image](https://hackmd.io/_uploads/Bkd2cBac6.png) Bypass cái thứ 2 ![image](https://hackmd.io/_uploads/B1xQor65p.png) 5. Dưới đây của cửa số khi mình thoát file chúng ta thấy rằng chỉ cần đoạn code bên trong cửa sổ này không chạy thì nó sẽ ko hiện nên em đã để một lệnh nhảy vô điều kiện `jmp` đến dòng kết thúc luôn ![image](https://hackmd.io/_uploads/Bksr1U6c6.png) Bypass cái thứ 3 ![image](https://hackmd.io/_uploads/HkXDJLT5a.png) 6. Vậy là đã xong 3 cái giờ xem kết quả ![image](https://hackmd.io/_uploads/Hy39kUa96.png) câu lệnh hiện Register và chỉ 1 cửa sổ duy nhất CrackMe #4 === Đề bài --- 1. Crack it to extend beyond 30 days 2. In the About screen – also extend it to beyond 30 days ![image](https://hackmd.io/_uploads/S1AcxUT9p.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra ![image](https://hackmd.io/_uploads/B1zplI6ca.png) 2. Cho file vào x32dbg và mở `Strings References` xem vào chọn câu lệnh vì mình muốn nó hiển thị hơn 30 ngày nên mình sẽ can thiệp vào chỗ hiển thị ![image](https://hackmd.io/_uploads/ByN7W8a5p.png) 3. Số ngày (ở đây 1E là 30) được lưu vào ecx sau đó trừ cho eax và được số ngày còn lại và nếu lớn hơn không thì hiển thị ra màng hình theo dạng `%d days ...` ![image](https://hackmd.io/_uploads/BJNlnIpqT.png) 4. Vậy nên chúng ta chỉ cần đổi 1E thành số nào lớn hơn 30 ở hệ thập phân ở đây em sẽ thay bằng 1000 (4096 ở hệ thập phân) ![image](https://hackmd.io/_uploads/Hye8p8pcT.png) 5. Kết quả được hiện thị bị trừ 5 ngày giống ban đầu là 30-5 còn 25 như ở đầu em có cap ![image](https://hackmd.io/_uploads/Syy2pLp5p.png) CrackMe #5 === Đề bài --- 1. Enter your first name. 2. Crack the software to find a valid serial key for your firstname ![image](https://hackmd.io/_uploads/BJLcM1ljp.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra mình có thể nhập username và phải nhập đúng serial key ![image](https://hackmd.io/_uploads/HJ9LXkxsa.png) 2. Cho file vào x32dbg và run file để xem sau khai em bấm Check nó sẽ breakpoint tại đâu ![image](https://hackmd.io/_uploads/Hy11Hyeoa.png) Nhìn trên ảnh nó đã thực hiện câu lệnh `test` sau đó đến `jne` và nhảy đến dòng `Sorry` 3. Theo logic thì mình sẽ nhìn dần lên trên có thể thấy nó `test eax,eax` suy ra nếu `eax` khác 0 thì câu lệnh nhảy jne sẽ được thực hiện bởi vì nếu eax bằng 0 và ZF được set, thì lệnh jne sẽ không nhảy và chương trình sẽ tiếp tục thực hiện lệnh tiếp theo sau lệnh jne. ![image](https://hackmd.io/_uploads/HJYYwkxjp.png) 4. Chúng ta cần eax bằng 0 thì câu lệnh `or eax,1` sẽ không được xảy ra và thế nên `jmp` ở trên phải thực hiện nhưng mà câu lệnh `jmp` luôn thực hiện bất kì điều kiện nên em đã tìm xem liệu có phải có câu lệnh nhảy qua lệnh này thì đúng là có thật ![image](https://hackmd.io/_uploads/ByY_FkgoT.png) 5. Nếu nhìn ảnh trên thì có thể thấy giá trị của ecx khá nghi ngờ trông có vẻ giống serial key nhưng mà em cứ để đấy đã =)) 6. Tiếp theo nhìn lên trên em phát hiện ra 1 thứ khá hay ho đó là có một câu lệnh so sánh giá trị của eax vs ecx nếu không bằng nhau sẽ nhảy đến dòng set eax = 1 và sau đó giống phân tích ở trên nó sẽ hiện lỗi ![image](https://hackmd.io/_uploads/rJ6GjkljT.png) 7. Mà theo em thấy khi mà so sánh chứng tỏ là nó cũng đang xác nhận xem dữ liệu nhập vào có đúng không nên em đã theo bước thứ 5 lấy giá trị `ecx` cho vào ô nhập serial key Giá trị ấy là `phuc-325826` 8. Nhập vào thôi ![image](https://hackmd.io/_uploads/rkNGT1esa.png) 9. Thật ra khi em nhìn lại thì những dòng Ở dòng `0040114D`, em thấy hàm gọi chương trình `GetLocalTime`. và dòng `0040116A`, chúng ta thấy rằng có định dạng chuỗi `%s-%d%d%d`.Chúng ta có thể suy ra rằng serial là sự kết hợp của tên người dùng đã nhập, được thêm vào bởi các số được tạo bởi `GetLocalTime` ![image](https://hackmd.io/_uploads/r1H_yexoT.png) CrackMe #6 === Đề bài --- 1. Remove the starting Nag Screen 2. When the button Re-Check is clicked, a pop-up messagebox appears and you should set it to say “Thank you for registering this software” 3. Set the Status box text to: “Clean crack! Good Job!” ![image](https://hackmd.io/_uploads/S1AcxUT9p.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra ![image](https://hackmd.io/_uploads/Hy96tWQoa.png) ![image](https://hackmd.io/_uploads/BJcET-mip.png) 2. Cho file vào x32dbg và mở `Strings References` xem xem cái thẻ lúc mới mở lên ở đâu để mình sẽ loại bỏ nó 3. Em đã tìm thấy những dòng code hiện cái nag thông báo lỗi nó lên nhiệm vụ sẽ là làm cho nó không xuất hiện nên em sẽ chuyển code của nó sang nop ![image](https://hackmd.io/_uploads/HJj7IfQia.png) chuyển sang nop để nó không xuất hiện ![image](https://hackmd.io/_uploads/ByLSLGQop.png) 4. Giờ chúng ta cần hiện câu box khi nhấn Re-check là`Thank you for registering this software` nên em sẽ tìm câu này ở trong String references và để hiểu tại sao nó lại hiện `Nag not removed` mà không hiện`Clean crack! Good Job!` trong Status 5. Nhìn trong hình bên dưới có thể thấy nó thực hiện câu lệnh so sánh sau đó vì nó bằng 2 nên nó nhảy đến câu `Nag not removed` ![image](https://hackmd.io/_uploads/BkHwwQQsa.png) 6. Em sẽ chuyển cho nếu bằng 2 thì nhảy đến câu `Clean crack! Good Job!` bằng cách xóa dòng nhảy đến `Nag not removed` bằng cách chuyển thành nop 2 dòng je đến `Nag not removed` và dòng điều kiện = 1 nhảy đến `Clean crack! Good Job!`. Nhìn ảnh bên dưới nếu nó bằng 2 sẽ không nhảy đến cái cũ mà nhảy đến cái mình cần ![image](https://hackmd.io/_uploads/H1jZvm7oT.png) 7. Khi nhảy đến cái `Clean crack! Good Job!` có thể thấy nó sẽ tự hiện ra `Thank you for registering this software` vì câu lệnh cũ xuất hiện lệnh jmp nhảy qua cái đó ![image](https://hackmd.io/_uploads/BkNP_7Qo6.png) 8. Vậy là đã crack xong ![image](https://hackmd.io/_uploads/SJEmKmmiT.png) CrackMe #7 === Đề bài --- Thay đổi từ `Unregistered` sang `Registered` bằng cách thay đổi eax hoặc ecx ![image](https://hackmd.io/_uploads/rkydaV7sp.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra ![image](https://hackmd.io/_uploads/Sk_6aNXsp.png) 2. Cho file vào x32dbg và mở `Strings References` xem `Unregistered` ở đâu ![image](https://hackmd.io/_uploads/BJjqlrQs6.png) 4. Giải thích về hình trên thì nó sẽ sử sụng `test eax,eax` để xem giá trị của nó trả về là 0 hay khác không nếu là 0 thì sẽ thực hiện je vì nó je (jump equal) nó xác định xem có trả về 0 hay không 5. Vì vậy nên chúng ta cần biến đổi eax khác 0 để câu lệnh `je` không nhảy đến `Unregistered` luôn, nhìn lên trên nữa có thể thế nó thực hiện gán cho eax giá trị 5 và ecx cũng giá trị 5 và thực hiện `sub eax,ecx` nên `eax` mới bằng 0, vì vậy nên chúng ta sẽ gán cho `ecx` không phải là 5 nữa mà 1 cái sẽ là một số khác 5 ví dụ 4 ![image](https://hackmd.io/_uploads/r18TZBmop.png) sau khi chỉnh sửa ![image](https://hackmd.io/_uploads/r1xyzHXi6.png) 6. Đã crack thành công ![image](https://hackmd.io/_uploads/Hk0OMBQoT.png) 7. Bài này nếu không muốn chỉnh ecx thì có thể chỉnh je thành jne nhưng mà đề bài muốn cta thay đổi eax, ecx nên chúng ta mới làm cách đó CrackMe #8 === Đề bài --- This crackme is for learning how to put hardware breakpoints on memory addresses and then patch it to register the program. ![image](https://hackmd.io/_uploads/BJdWzhQoa.png) Cách làm --- 1. Em mở thử file và chạy xem điều gì xảy ra ![image](https://hackmd.io/_uploads/B1o_LWYip.png) Nó xuất hiện một cửa số với status là Un-registered và một gợi ý là chỉnh sửa bộ nhớ để nó trở thành Registered 2. Cho file vào x32dbg và mở `Strings References` xem `Unregistered` ở đâu ![image](https://hackmd.io/_uploads/S1u1PZKsp.png) 3. Sau khi bấm vào xem thì em thấy rằng có một lệnh je nhảy qua đoạn registered bằng cách sử dụng `cmp` ở ngay trên đó ![image](https://hackmd.io/_uploads/Sy5BPZYj6.png) 4. Dòng `cmp` ở `0040358A` nó so sánh giá trị của địa chỉ tại ô nhớ `7260D0` với 0 nếu bằng thì sẽ thực hiện câu lệnh nhảy `je` nên em sẽ đổi giá trị của ô nhớ kia thành số khác 0 ![image](https://hackmd.io/_uploads/HJWXuZFja.png) 5. Đổi giá trị ô nhớ `7260D0` bằng cách như dưới dình - ![image](https://hackmd.io/_uploads/SyqOuZYsT.png) - click vào ô bộ nhớ muốn đổi rồi đổi thành 01 màu đỏ như hình dưới - ![image](https://hackmd.io/_uploads/rJxRO-FsT.png) 6. Giờ giá trị đã thành 1 nên khi thực hiện `cmp` nó sẽ không nhảy ở câu lệnh `je` nên nó sẽ hiện Registered ![image](https://hackmd.io/_uploads/SykPtbKja.png) CrackMe #9 === Đề bài --- To practice patching memory directly. Objectives: 1. Find the correct serial key 2. Change it to a different key of your choice ![image](https://hackmd.io/_uploads/Hk-4IWYsT.png) Cách làm --- 1. Em mở thử file và thấy rằng nó sẽ cho mình nhập Serial key ![image](https://hackmd.io/_uploads/r1xwX6mj6.png) 2. Cho vào x32dbg và mở `Strings references` có thể thấy có một mã `ABC-123456` khá giống trước đây mình từng làm Serial Key nó hiện ở ngay trước thông báo lỗi khi nhập sai và thông báo đúng khi nhập đúng nên em đã thử nhập mã này vào ô `Enter Serial Key` ![image](https://hackmd.io/_uploads/Skii4TQi6.png) 3. Phần tìm Serial đã xong ![image](https://hackmd.io/_uploads/BkTiSaXsa.png) 4. Tiếp theo đến phần thay đổi giá trị này như bài trước em đã đổi gia trị của ô nhớ `0071822A` thành PHUC123456 ![image](https://hackmd.io/_uploads/S1Wj9a7ja.png) 5. Đã hoàn thành việc crack ![image](https://hackmd.io/_uploads/rJzNopmsa.png) CrackMe #10 (ReverseMe2 by Lena) === Đề bài --- This reverseme is written by Lena and is one of the classic reverseme’s used to learn reversing. Use this in conjunction with xAnalyzer plugin for x64dbg to practice serial key fishing. ![image](https://hackmd.io/_uploads/Bya0FbKiT.png) Cách làm --- 1. Em mở thử file và thấy rằng nó hiện thị cửa sổ ![image](https://hackmd.io/_uploads/Hy2boWKi6.png) 2. Cho vào x32dbg và mở `Strings references` có thể thấy cửa sổ đó cuất hiện ở đâu ![image](https://hackmd.io/_uploads/BkjXsbti6.png) 3. Click vào thì ra ngay vấn đề ![image](https://hackmd.io/_uploads/r1hOjWFoT.png) 4. Giải thích đoạn ở trên ảnh thì nó sẽ thực hiện so sánh nhờ câu lệnh `cmp` của `eax` và `FFFFFFFF`(đây là check xem file có tồn tại không nếu là FFFFFFF thì không tồn tại) suy ra eax chứa địa chỉ của file khả năng rất cao là file `keyfile.dat` ở ngay trên cho cho push vào 5. Suy ra nếu file tồn tại sẽ thực hiện câu lệnh `jne` thì sẽ nhảy qua cái cửa sổ ban đầu khi mình bật đề bài 6. Em đã tưởng tạo ra file `keyfile.dat` là xong nhưng nó đâu dễ như vậy :)) 7. Em đã không đọc kĩ trong String References nó còn 2 trường hợp nữa xảy ra ![image](https://hackmd.io/_uploads/HkHtAbYoa.png) Chúng ta cần phải vượt qua ở đoạn thông báo lỗi thứ 2 là file trống thì mới đến được dích đến 8. Để phân tích sau hơn và củng cố cho việc hàm CreateFile ở dòng `00401073` là gì thì em sử dụng Plugin xAnalzer để xem thì nó hiện thị như sau ![image](https://hackmd.io/_uploads/S13gQ0tip.png) Giải thích qua thì tệp tin đang cố tìm tệp tin tên là `keyfile.dat` để có thể đọc và ghi ![image](https://hackmd.io/_uploads/SyjWSAKip.png) 9. Và khi không có file đó thì giá trị tại `eax` đang là `FFFFFFFF` như ảnh bên dưới (nhìn giá trị eax ở bên phải) ![image](https://hackmd.io/_uploads/S1xoBRFiT.png) 10. Và vì em đã tạo file để qua được cửa sổ thứ nhất nên nó sẽ nhảy qua và đến tiếp theo đó là thực hiện chức năng đọc file ![image](https://hackmd.io/_uploads/B1EePAFjp.png) 11. Tra chức năng của readfile có thể thấy có một hàm `lpBuffer` đang đọc giá trị tại `40211A` - ![image](https://hackmd.io/_uploads/r1ZOD0Fj6.png) - ![image](https://hackmd.io/_uploads/ry5KPCKja.png) - ![image](https://hackmd.io/_uploads/SyP1uRFoT.png) 12. Sau khi thực hiện Read thì nó sẽ trả về kết quả và `test eax, eax` nếu mà câu lệnh jne ngày dưới không thực hiện sẽ thực hiện câu lệnh nhảy vô điều kiện `jmp` đến luôn thông báo file not valid nên chúng ta cần cho `jne`thực hiện ![image](https://hackmd.io/_uploads/Sy9h00YiT.png) 13. Nếu đọc thành công thì nó trả về số khác không nên phép `and (test)` sẽ trả về khác 0 thì ZF sẽ khác 0 nên `jne` thực hiện suy ra chúng ta cần có dữ liệu trong file ![image](https://hackmd.io/_uploads/Hy2qJkcsp.png) 14. Tiếp theo nó thực hiện việc so sánh `cmp` của số kí tự trong file (`402173`) với 16 , ở trên ảnh thì 10 đại diện cho thập lục phân của 16. Nếu có nhỏ hơn 16 kí tự nó sẽ nhảy đến thông báo lỗi luôn bằng câu lệnh jl ngay dưới ![image](https://hackmd.io/_uploads/HJ2x-15oT.png) ![image](https://hackmd.io/_uploads/HyPt-kciT.png) 15. Nói qua đoạn code ngay sau đó thì nso lấy giá trị trong file so sánh với chữ G nếu có trên 8 chữ G thì qua ![image](https://hackmd.io/_uploads/rJqqm1csp.png) 16. Đã crack xong với việc tạo file `keyfile.dat` với từ 16 kí tự trở lên trong đó có ít nhất 8 kí tự là chữ G ![image](https://hackmd.io/_uploads/H1Y_Ny5op.png) CrackMe #11 === Đề bài --- This CrackMe is packed with UPX 3.91 packer. Your task is to : 1. Unpack it and then patch the unpacked file, or, 2. Create a loader for it ![image](https://hackmd.io/_uploads/HyOnUk5sp.png) Cách làm --- 1. Đề bài có yêu cầu nữa là ![image](https://hackmd.io/_uploads/HJitFajop.png) 2. Em thả 2 file vào phần mềm detect xem 2 file được cấu tạo ra sao file1: được nén bằng UPX(3.91) ![image](https://hackmd.io/_uploads/B1XOoaioT.png) file2: kích thước file lớn hơn ![image](https://hackmd.io/_uploads/SkdYi6ooT.png) 3. Thử crack cả 2 file xem khác nhau ở đâu, tìm đến chô thông báo lỗi thấy có câu lệnh `je` nhảy qua thông báo lỗi đến thông báo correct nên chúng ta sẽ thay `je` bằng `jmp` để nó luôn nhảy qua file1: crack được nhưng khi patch file thì không được ![image](https://hackmd.io/_uploads/B1y2rvnoT.png) file2: patch file được và crack thành công ![image](https://hackmd.io/_uploads/H13bHDhoa.png) 4. Suy ra giờ chúng ta cần làm sao cho file `packed` có thể patch file để crack được như file `unpacked` 5. Em đã suy nghĩ khá nhiều về bài này có thể người ta cần đóng gói những tệp này để tránh dịch ngược vậy làm thế nào bây giờ thì em đã suy nghĩ ngược lại hay mình tìm cách người ta đóng gói như thế nào ![image](https://hackmd.io/_uploads/H1ecPdhsT.png) [Tham khảo ở đây](https://resources.infosecinstitute.com/topics/malware-analysis/analyzing-packed-malware/#gref) 6. Em đã tra gg về cách dịch ngược lại nó thì thấy rằng như trên UPX mà ngta sử dụng có thể dịch ngược lại được ![image](https://hackmd.io/_uploads/rJg4Od2sp.png) 7. Đầu tiên chúng ta sẽ tìm `pushad` : là nơi đẩy giá trị của các thanh ghi vào stack theo thứ tự, thì nó chính là điểm mà chúng ta khi mở file sẽ xuất hiện ở đó ![image](https://hackmd.io/_uploads/r1e0g1po6.png) 8. Chúng ta cần chú ý đến thanh ghi `ebp` vì khi mà chúng ta gài được breakpoint ở đây thì chúng ta sẽ đến được `popad`: là nơi lấy giá trị từ stack và lưu vào các thanh ghi theo thứ tự tương ứng 9. Đầu tiên tìm địa chỉ ở thanh ghi `ebp` đang ở ![image](https://hackmd.io/_uploads/SJ76-Jpoa.png) 10. Tiếp theo đặt breakpoint tại đây ![image](https://hackmd.io/_uploads/BJHgzJ6sT.png) ![image](https://hackmd.io/_uploads/ByvQfk6sp.png) 11. Tiếp theo bấm run để nó chạy đến breakpiont mình vừa cài để tìm đến popad ![image](https://hackmd.io/_uploads/HyOl7kpj6.png) 12. Giờ mình sẽ tìm đến cái `jmp` ngay gần `popad` nhất bấm f8 để thực thi tiếp và nó xuất hiện OEP (orgin entry point)chúng ta cần tìm hãy cmt nó như trong ảnh ![image](https://hackmd.io/_uploads/S1RQEyaip.png) 13. Tiếp theo sử dụng plugin để dump memory của file ra làm như trong ảnh ![image](https://hackmd.io/_uploads/r1QFH1ajT.png) 14. Nhưng nếu chỉ dump memory không thì những thư viện dll sẽ thiếu và ko thể chạy file nên chúng ta cần import bằng IAT info như ảnh dưới khi click vào IAT autosearch và getimport ![image](https://hackmd.io/_uploads/ByuyPy6i6.png) 15. Sau đó chỉnh sửa file đã được hoàn tất từ những bước trên và chạy file là crack thành công file bị đóng gói bằng UPX ![image](https://hackmd.io/_uploads/H1K_Ok6i6.png) 16. [bài viết tham khảo cách unpacked](https://tuxy0.wordpress.com/category/crackme/) CrackMe #12 === Đề bài --- This CrackMe has Anti-Debugging features. If you open it with a debugger and then run, it will detect the debugger and exit. Your task is to bypass the anti-debugging feature, so that the program will continue to run and show the window below: ![image](https://hackmd.io/_uploads/BJWDK1aoT.png) Cách làm --- 1. Bài này chúng ta cần tìm hiểu về Anti-Debugging 2. Khi mở file bên ngoài nó sẽ hiện như sau ![image](https://hackmd.io/_uploads/r16TAkTjp.png) 3. Khi mở chạy file trong trình gỡ lỗi x64dbg nó sẽ xuất hiện như sau và bị quit ngay ![image](https://hackmd.io/_uploads/r1skkepo6.png) 4. Muốn tránh khỏi anti-Debugging thì người ta nghĩ ra một cái nữa là anti-anti-Debugging và có 2 cách thường dùng để nó hoạt động đó là ![image](https://hackmd.io/_uploads/BJP9IWRj6.png) 5. Trong bài này em sẽ dùng cách set breakpoint API anti-debugging 6. Search gg về hàm isDeBuggerPresent() một API được sử dụng phổ biến nhất để xem chương trình có sử dụng vs Debugger hay không 7. Set breakpoint hàm isDeBuggerPresent() để có ngăn chương trình kết thúc luôn khi bấm run ![image](https://hackmd.io/_uploads/B1s29ZRi6.png) bấm run để xem hàm đó ở đâu ![image](https://hackmd.io/_uploads/SypQs-0ja.png) bấm run to user code để nhìn code tổng quan ![image](https://hackmd.io/_uploads/BkFjo-Rs6.png) có vẻ như nó xem giá trị hàm trả về gì sau đó từ eax lưu vào rồi sánh với 0 và nếu khác 0 thì je không được thực hiện và sẽ hiển trị cửa số quit chương trình 8. Chúng ta sẽ sửa lại chương trình bằng cách đổi je thành jmp là luôn nhảy để không hiện cửa sổ quit. Sau khi sửa bấm run lại và chương trình đã xuất hiện lại và crack anti-debugger thành công ![image](https://hackmd.io/_uploads/BypvJGAj6.png) CrackMe #13 === Đề bài --- This CrackMe combines three features: 1. Packing 2. Anti-Debugging 3. Software Serial Key Requirement ![image](https://hackmd.io/_uploads/SkVzlr0j6.png) Your task is to: 1. Unpack it, or Create a Loader for it 2. Defeat the Anti-Debugging protection 3. Crack the Serial Key, or, Patch it Cách làm --- 1. Đây là file đã bị nén và có phần chống Debugging nên chúng ta sẽ giải nén file trước sau đó cài anti-anti-Debugger và crack the Serial key sau 2. Đầu tiên giải nén giống bài 11 đã làm rồi tìm điểm OEP bằng cách tìm popad bằng cách đặt entrypoint tại địa chỉ ebp ngay sau pushad khi đầu vào. (Em đã bôi đen những thứ quan trọng ở hình dưới ) ![image](https://hackmd.io/_uploads/B1npcHRjp.png) 3. Đặt breakpoint tại địa chỉ đó để tìm popad ![image](https://hackmd.io/_uploads/HJr4srAoa.png) 4. Cho run chương đến khi xuất hiện popad ![image](https://hackmd.io/_uploads/HyNPiBAop.png) 5. Nhìn câu lệnh `jmp` ngay dưới gần nhất cho chương trình chạy qua đó vì đó chính là nơi nhảy ra khỏi tệp giải nén 6. Sau khi câu lệnh `jmp` nhảy đánh dấu cmt như hình, đó chính là orgin entry point đã được giải nén ![image](https://hackmd.io/_uploads/rkkghBAsT.png) 7. Dùng Plugin Scylla để dump memory sau đó fixdump rồi add các file dll vào giống bài 11 đã làm rồi 8. File đã giải nén xong ![image](https://hackmd.io/_uploads/SJ3cTrAop.png) 9. Giờ chúng ta sẽ giải bài toán anti-Debugger vì khi cho file đã giải nén vào x64dbg nó sẽ hiện cửa sổ quit ngay ![image](https://hackmd.io/_uploads/S1aT6SAop.png) 10. Làm như bài 12 giờ chúng ta sẽ cài breakpoint tại IsDebuggerPresent bằng cách dùng command ở dưới như hình ![image](https://hackmd.io/_uploads/BJWYRrAj6.png) 11. Giống bài trước khi run đến breakpoint đó chúng ta thấy có xem xét xem hàm `IsDebuggerPresent` trả về 0 hay 1 nếu trả về 0 thì câu lệnh je được thực hiện và chương trình không quit, nhưng chúng ta crack nên chúng ta ko xét điều kiện mà đổi `je` thành `jmp` luôn để bỏ qua thông báo quit luôn ![image](https://hackmd.io/_uploads/HJm_1I0jp.png) 12. Cuối cùng là chúng ta sẽ vượt qua nốt Serial Key, cái này thì khá dễ đi đến đoạn code có thể thấy có câu lệnh `je` em đoán là nó so sánh giá trị nhập vs Serial Key gốc nếu trùng thì nhảy qua thông báo lỗi ![image](https://hackmd.io/_uploads/BJUslU0sp.png) 13. Giờ nếu muốn nhập thì cũng nhảy thì chúng ta chỉ cần đổi `je` thành `jmp` nhưng mà em muốn hay hơn là em sẽ đổi Serial Key của ngta thành của mình 14. Đọc hình trong ảnh có thể thấy nó lấy giá trị gốc tại 718228 em sẽ đổi giá trị đó ![image](https://hackmd.io/_uploads/ryyIZ8Cjp.png) 15. Đổi giá trị bằng xem bẳng dump bộ nhớ ![image](https://hackmd.io/_uploads/BJUiWIAsT.png) Đổi thành Phuc123456 ![image](https://hackmd.io/_uploads/rkeQf8Aoa.png) 16. Patch file lại thôi là đã crack xong ![image](https://hackmd.io/_uploads/H1kYMICsT.png) CrackMe #14 === Đề bài --- This CrackMe asks for your firstname and then generates a Serial Key based on your firstname. 1. Create a Keygen that will be able to generate any Serial Key based on your firstname. 2. To solve this challenge, you may create a self-keygen or, write a separate keygen. ![image](https://hackmd.io/_uploads/HyPO3-J2p.png) Cách làm --- 1. Bài này Chúng ta sẽ biến đổi sao cho khi nhấn vào nút check thì cửa sổ hiện ra không phải thông báo lỗi mà sẽ hiện ra Serial Key 2. Tìm đoạn đoạn code mở cửa sổ thông báo lỗi ![image](https://hackmd.io/_uploads/ry1C-zJ3a.png) có thể thấy trong đoạn trên thực hiện việc so sánh giữa giá trị mình nhập và cái serial key được lưu ở 7191E0 nếu không giống nhau thì xuất hiện thông báo `Wrong Serial key` ở `71920E` 3. Em sẽ đổi thông báo lấy giá trị từ `71920E` thành lấy giá trị từ địa chỉ chứa Serial key `7191E0` ![image](https://hackmd.io/_uploads/BkbkszJnp.png) 4. Crack thành công khi nhập sai xuất hiện không phải lỗi mà là Serial Key ![image](https://hackmd.io/_uploads/rJxUqGkhT.png) ![image](https://hackmd.io/_uploads/HkeGsM1hT.png) CrackMe #15 === ![image](https://hackmd.io/_uploads/ryoPhMJ26.png) CrackMe #16 === Đề bài --- This crackme is created with Visual Basic 5/6 which is prior to the .NET framework. Some programs out there are still written in it. So here’s your opportunity to crack such a program. It is a mod of one of Lena’s VB programs. Note that this crackme is compiled to native format. The p-code format will be covered in another crackme. ![image](https://hackmd.io/_uploads/rk89nz1hp.png) There are 2 tasks: 1. Get rid of the Nag screen which pops-up before the above window shows. 2. Crack the Regcode. Cách làm --- 1. Giờ chúng ta sẽ xem chương trình gọi đến cái nag xuất hiện đầu tiên ở đâu và đặt breakpoint tại đó B1: bấm run sau đó khi chương trình xuất hiện nag đầu tiên thì pause chương trình lại ![image](https://hackmd.io/_uploads/r17U7mJ2p.png) B2: Chọn call stack để xem chương trình gọi cửa sổ đó ở đâu và click vào ![image](https://hackmd.io/_uploads/B1mZN7kn6.png) B3: Ngay trên đó chính là lệnh call gọi nag đó xuất hiện và chúng ta đặt breakpoint tại đó ![image](https://hackmd.io/_uploads/SkukBQy36.png) B4: Restart lại và cho run vì chúng ta đã đặt breakpoint nên cửa sổ đã không xuất hiện nên muốn sau này Nag không xuất hiện chúng ta đặt nó thành nop là xong ![image](https://hackmd.io/_uploads/SkIor7Jha.png) B5: Chạy lại và xem kết quả nhưng khi chạy lại debugger đã bị đóng lại và quit chứng tỏ có lỗi ở đâu đó ![image](https://hackmd.io/_uploads/HJWrUmknT.png) 2. Chúng ta cần xem lỗi xảy ra ở đâu mà chương tình quit luôn không hiện thị cửa sổ chính bằng Trace Coverage để xem chương trình thực hiện từng bước đến khi đóng lại như hình bên dưới ![image](https://hackmd.io/_uploads/BJ8cwQynp.png) 3. Chương trình chạy đến dòng `00402D55` và đóng lại vì thế nên chúng ta sẽ làm cho dòng đó không được thực thi, nếu nhìn ngay trên có thể có câu lệnh `jne` có thể nhảy qua dòng đó ![image](https://hackmd.io/_uploads/SkXYum12T.png) 4. Chúng ta sẽ đổi `jne` thành `jmp` để câu lệnh đó luôn thực hiện và câu lệnh đóng chương trình sẽ không được thực hiện nữa ![image](https://hackmd.io/_uploads/By36O7k36.png) 5. Chúng ta đã bỏ qua được cái thứ nhất là thẻ nag xuất hiện ![image](https://hackmd.io/_uploads/ByEeF712T.png) 6. Tiếp theo chúng ta sẽ tìm Recode để crack được cái tiếp theo, nếu nhập sai Regcode thì sẽ thông báo lỗi như hình bên dưới ![image](https://hackmd.io/_uploads/rJXhQ4J3T.png) 7. Nếu làm như mấy bài trước đây chúng ta sẽ mở `String Reference` để xem ![image](https://hackmd.io/_uploads/rykuVEJ3p.png) 8. Trong bảng trên có thể thấy 1 đoạn code khá giống vs những bài trước đây là PRIL-2020, tuy nhiên biết đây là đáp án nhưng em sẽ giưới thiệu 1 cách chi tiết hơn về cách tìm ra nó 9. Đầu tiên chúng ta phải hiểu việc so sánh xảy ra khi nào? Khi mà chúng ta nhấn nút `Register me!` vì vậy nên chúng ta cần biết khi chúng ta nhấn nút đó code xuất hiện ở đâu và đi từng bước 1 xem chương trình làm gì sau đó 10. Ở đây em dùng công cụ `VB Decompiler Lite` để xem thực tế khi nhấn nút `Register me!` điều gì xảy ra ở đó 11. Khi bật công cụ và trỏ vào nút `register me!` có thể thấy nó tên là `command 1` và em nhìn vào bên phải thấy trong code và mở phần `command1 click` xem code nó như thế nào 12. Có thể thấy địa chỉ bắt đầu khi click vào nút `Register me!` nằm ở đâu trong code và em sẽ copy địa chỉ cho vào x64dbg và chạy từ đó để xem sau khi nhấn nút đó thì chương trình chạy như thế nào 13. Xét breakpoint tại đó và chạy từng dòng 1 sau breakpoint ![image](https://hackmd.io/_uploads/rk2A_4Jhp.png) ![image](https://hackmd.io/_uploads/r1ukKEJnT.png) 14. Khi chạy một hồi đến đoạn thực hiện `je` và nhảy qua thông báo thành công ![image](https://hackmd.io/_uploads/BJv_tE12a.png) 15. Nên chúng ta sẽ cần đọc ở trên đó xem nó so sánh cái gì mà lại thực hiện `je` nhìn lên trên đó một xíu ta có thể thấy có 1 hàm so sánh chuỗi để ý thì ta thấy nó so sánh chuỗi ta nhập vào vs một chuỗi gì đó ![image](https://hackmd.io/_uploads/ByBxhVJ3p.png) 16. Nói là một chuỗi gì đó nhưng chắc chắn là nó so sánh với chuỗi mà ngta muốn mình nhập vào Regcode vậy nên chúng ta thử nhập chuỗi đó vào Regcode ![image](https://hackmd.io/_uploads/SyF_2V12a.png) 17. Đã tìm ra chuỗi Regcode và crack thành công CrackMe #17 === Đề bài --- This crackme is written in Visual Basic 6 and compiled as a p-code executable. ![image](https://hackmd.io/_uploads/Hyiw_BJha.png) The objectives of this crackme are: 1. patch the file so that no matter what name or serial key you enter, it will become registered 2. create a keygen for it Cách làm --- 1. nếu theo yêu cầu đề thì hơi mẫu thuận tại đề yêu cầu patch file sao cho nhập key nào cũng hợp lệ mà nếu nhập key cũng hợp lệ thì cần gì keygen :)) 2. Nên giờ em sẽ làm 2 cách 3. Cách 1 đó là nhập gì cũng từ `Unregistered` thành `Registered` 4. Nếu làm cách này thì khá đơn giản chỉ cần tìm câu lệnh nhảy qua thông báo `Registered` và chuyển thành `nop` là xong, tìm thêm câu lệnh về điều kiện và chỉnh lại nó nữa 5. Em sẽ làm nhanh cách 1 bằng cách tìm trong `String reference` dòng mà hiện thị registerd ![image](https://hackmd.io/_uploads/rJqo1Iyh6.png) 6. Click vào nó và nhìn code xem câu lệnh nào nhảy qua nó thì chuyển thành `nop` ![image](https://hackmd.io/_uploads/SJPgeUJh6.png) ![image](https://hackmd.io/_uploads/BkYZgLJ2p.png) 7. Thành công ![image](https://hackmd.io/_uploads/SyOKlUk26.png) 8. Nhưng xuất hiện trường hợp nhập dưới 5 kí tự sẽ xuất hiện lỗi ![image](https://hackmd.io/_uploads/SyupxUJ3a.png) 9. Nên em sẽ xem tiếp lỗi xuất hiện ở đâu trong đoạn code ![image](https://hackmd.io/_uploads/H1sWZIk36.png) 10. Có thể thấy nó thực hiện `cmp eax,5` và `jge` có nghĩa là nó sẽ nhảy nếu lớn hơn hoặc bằng 5 vậy nên chúng ta sẽ sửa 5 thành 0, và thành công ![image](https://hackmd.io/_uploads/rkQxzUy2a.png) 11. Giờ chúng ta sẽ làm theo cách thứ 2 là tạo keygen chứ không cho nhập gì cũng đúng nữa 12. Cách 2 này khó hơn ở chỗ chúng ta phải tìm được keygen và dump nó ra cho người dùng thấy 13. Nếu chúng ta dùng x64dbg để debug thì rất khó để có thể tìm keygen nếu keygen trong bài biến đổi, em đã thử làm như mấy bài trước tìm chỗ note keygen nhưng bài này không lấy sẵn mà nó còn biến đổi key mà người tạo file cho vào 14. Nên chúng ta sẽ sử dụng công cụ VB Decompiler để xem một cách trực quan hơn là xem mã máy thuần 15. Khi mở công cụ này lên thì chúng sẽ xem chương trình sử lí như thế nào khi chúng ta nhấn nút `Check` ![image](https://hackmd.io/_uploads/S1xtStP2T.png) 16. Ở hình trên có thể thấy chỗ `var_20` nó có một chuỗi kí tự và dòng hình dưới đây nó đã lấy 4 kí tự bắt đầu từ kí thứ 4 ở trong chuỗi đến gán vào biến `varr_68` ![image](https://hackmd.io/_uploads/HkoU8YD3T.png) 17. Tiếp theo nó kết hợp giữa username mình nhập vào và `var_68` để gán vào var_78, giải thích qua ảnh bên dưới thì nó lấy 4 kí tự từ bên phải qua và in hoa sau đó nối với key đã được biển đổi ở trên tạo ra Serialkey ![image](https://hackmd.io/_uploads/HkdhUKvh6.png) 18. Cuối cùng nó thực hiện việc so sánh `var_1C`(Serikey mình nhập) với cả `var_78`(chuỗi key gốc nhưng đã bị biến đổi), nếu chúng ta nhập đúng thì sẽ in thông báo success còn nếu không sẽ goto qua thông báo thành công đến thông báo `UN-Registed` ![image](https://hackmd.io/_uploads/BJULwKDna.png) 19. Vậy chúng ta muốn tạo ra keygen theo em thì em sẽ hiển thị ra thông báo là `N:PHUC K:PHUC82F3` bằng cách đổi giá trị của thông báo lỗi trong hình ![image](https://hackmd.io/_uploads/BkBA1ov3p.png) ![image](https://hackmd.io/_uploads/Ske-LiD36.png) 20. Crack thành công ![image](https://hackmd.io/_uploads/rkXQ8ov2T.png) ![image](https://hackmd.io/_uploads/ry_4Ljv2T.png) 21. Đề bài có bonus file p-code nhưng em thấy nếu dùng VB Decompiler nó tương tự vì bản chất là compiled p-code khác với Native code ở chỗ là nó sẽ không trực tiếp de đến Operating System mà qua P-code Interpreter CrackMe #18 === Đề bài --- There are 3 tasks: 1. Patch it to always succeed no matter what name and serial key you enter. 2. Do serial fishing to extract the serial key based on a given name of your choice. 3. Create a keygen ![image](https://hackmd.io/_uploads/H12twJzhp.png) Cách làm --- 1. bài này phải chú ý phần viết bằng C# và nó là một .NET framework có thể thực thi được nên em sẽ sử dụng một công cụ có tên dnSpy vì nó có thể decompile C# 2. Mở dnSpy và open crackme 18 có thể thấy trong option ở trên có C# và nó đã decompile thành công và chúng ta có thể nhìn thấy mã nguồn của file crackme 18 ![image](https://hackmd.io/_uploads/HkiCQm9ha.png) 3. chúng ta cần xem sau khi ấn nút CHECK thì chương trình xử lí ra sao nên em đã chọn vào `btnCheck_Click` ![image](https://hackmd.io/_uploads/ry5LNmq3a.png) 4. Đọc code trên khá dễ hiểu là nó gán `text,text2` lần lượt là Name và Serialkey và text3,4,5 là các productID sau đó nó xem là biến `text` có nhiều hơn 4 kí tự không rồi cắt kí tự trong `text` từ số 0 đến số 4 rồi in hoa lên sau đó thự hiện cộng chuỗi và so sánh với Serialkey chúng ta nhập vào lưu ở `text2` 5. Chúng ta cần chỉnh sửa lại code để không cần nhập Serial Key giống cái kia cũng đúng, chỉnh sửa bằng cách như ảnh chuột phải chọn Edit method ![image](https://hackmd.io/_uploads/S14YiQ9ha.png) 6. Sửa dòng 10 và 16 như ảnh để có thể nhập ít hơn 4 kí tự và nhập bất kì cái gì cũng đúng(vì thêm dấu ! là ngược lại) ![image](https://hackmd.io/_uploads/rkNaimq3p.png) 7. Và Save Module và đã crack task1 thành công ![image](https://hackmd.io/_uploads/B1PNT75np.png) 8. Task tiếp theo đề bài yêu cầu serial fishing để trích xuất khóa nối tiếp trên yêu cầu của mình nên em nghĩ chúng ta cần đặt breakpoint tại nơi chứa giá trị value mà để so sánh với Serialkey chúng ta nhập bởi giá trị so sánh sẽ nằm ở đó 9. Đầu tiền chúng ta sẽ add Breakpoint say đó chạy chương trình ![image](https://hackmd.io/_uploads/B1bjGVq26.png) 10. Sau khi chạy đến BreakPoint chúng ta sẽ chạy thêm 1 step nữa để xem biến value lưu như thế nào ![image](https://hackmd.io/_uploads/HkiX7V5h6.png) 11. Và đó chính là Key fishing ![image](https://hackmd.io/_uploads/rkOx4Vc3T.png) 12. Và task cuối cùng đó chính là tạo keygen, thật ra thì task 2 vs task này nso gần giống nhau chỉ là giờ thay vì chúng ta chạy chương bằng dnSpy và breakpoint phân tích các thứ thì chúng ta chạy cái khác để có thể in ra keygen tùy chỉnh 13. mình chỉnh sửa như mấy bài trước thì thay vì in ra lỗi mình in ra value của key luôn bằng cách chỉnh lại dòng thông báo lỗi thành value ![image](https://hackmd.io/_uploads/rk1tUV9hp.png) 14. Đã crack xong ![image](https://hackmd.io/_uploads/S1RRI4qh6.png) CrackMe #19 === Đề bài --- This crackme comes in 2 files. The crackme19.exe is the main file and there is also a DLL called CrackmeLibrary.dll. The objective of this crackme is to practise patching the DLL instead of the crackme19.exe file. ![image](https://hackmd.io/_uploads/rJ2cAE9h6.png) Cách làm --- 1. Trước tiên thì em sẽ giải thích DLL là gì? nó là một nơi được ví như thư viện hay là hàm của file .exe chứa các chức năng và nó không thử tự chạy một mình 2. Chạy thử file xem điều gì xảy ra có thể thấy chúng ta nó cho phép chúng ta nhập Serial number nếu sai thì in lỗi ![image](https://hackmd.io/_uploads/Bkjx4r53a.png) 3. Vậy là như mấy bài trước chúng ta sẽ xem xem thông báo lỗi in ra ở đâu trong String reference và nhìn ngược từ đó lên 4. Có thể thấy nó thực hiện một lệnh je để nhảy qua thông báo thành công đến thông báo lỗi ![image](https://hackmd.io/_uploads/HJvw4B9na.png) 5. Chúng ta sẽ nhìn lên trên và thấy nó thực hiện `test al,al` thì nó là bit tháp nhất của eax, nếu al bằng 0 thì ZF được set và je thực hiện và nhìn lên trên nữa có thể thấy al được set ở trong hàm `CheckSerialNumber` ![image](https://hackmd.io/_uploads/ryF0dH5h6.png) 6. Và tiếp theo vào trong Symbols nơi cung cấp các tên hàm, biến và cấu trúc dữ liệu cso thể thấy hàm này nằm trong dll ![image](https://hackmd.io/_uploads/HkDXYrq3p.png) 7. Bấm vào hàm đó thì có thể nó thực hiện `cmp` và gán giá trị cho al bằng `sete al` và chức năng này là set al bằng 0 nếu 2 giá trị không bằng nhau ![image](https://hackmd.io/_uploads/Hknk5H5hp.png) 8. Nên chúng ta cần ngăn việc set `al = 0` bằng cách chuyển dòng `sete al` thành `nop` ![image](https://hackmd.io/_uploads/BJ9W3B52T.png) 9. patch file và đợi kết quả crack thành công 10. Nhưng ở đây là chúng ta patch file dll nên phải để đuôi là .dll và thay thư viện ban đầu đi ![image](https://hackmd.io/_uploads/Hy6x6Hq2T.png) CrackMe #20 === Đề bài --- A crackme with multi-threads for you to practice cracking. The objectives are: 1. Patch the thread that checks for the correct serial number 2. Do serial fishing for the serial number ![image](https://hackmd.io/_uploads/B1uxRHchT.png) Cách làm --- 1. cũng giống như bài trước bài này cho nhập Serial key nếu nhập thì in lỗi ![image](https://hackmd.io/_uploads/By8XkIq2T.png) 2. Nhưng có vẻ nó khác ở chỗ dùng multi thread có vẻ nó sẽ thực hiện nhiều việc cùng 1 lúc thay vì thực hiện tuần tự 3. Nhìn vào trong x32dbg có thể thấy nó thực hiện hiện nhảy qua thông báo success bằng câu lệnh `jne` nên em đã đổi thành `je` để thể đổi thành nhập gì cũng chính xác trừ khi nhập đúng ![image](https://hackmd.io/_uploads/r1IHZ8cha.png) 4. Đổi thành `je` và xong được task 1 ![image](https://hackmd.io/_uploads/ryIcbL93a.png) ![image](https://hackmd.io/_uploads/BJOOWU926.png) 5. task 2 là chúng ta sẽ tìm key 6. Thì nếu chúng ta để ý lên trên nữa thì chúng thực hiện việc so sánh với 7A69 ở thập lục phân nên key ở hệ thập phân sẽ là `31337` 7. Nhập key vào và xem kết quả ![image](https://hackmd.io/_uploads/rJ8LVL5na.png)