printf(“CommandLine 95 Keymaker by the_lighthouse\n”); printf(“Enter your name: “); gets(buffer); strupr(buffer); code = ( ((unsigned long)buffer[0] * (unsigned long)strlen(buffer)) << 0x0A) + 0x2f8cc; printf(“Your serial is : %lu”, code); return 0; } 5. Làm thế nào mà lệnh PUSH và lệnh CALL và những lệnh khác thật sự làm việc khi mà chương trình gọi 1 funtion =============================================== Nào, chúng ta hãy nhìn lại đoạn 1 code của TaskLock ( nếu bác nào không bít nó nằm ở đâu thì hãy nhìn vào đoạn code đầu tiên) : PUSH 32_________________________________Lưu chiều dài của FS PUSH EAX_______________________________Lưu địa chỉ của text buffer PUSH 000003F4___________________________Lưu Identifier của control PUSH DWORD PTR [ESI+1C]________________Lưu handle của dialog CALL [USER32!GetDlgItemTextA] Nếu các bác gọi nó từ chương trình C, nó sẽ như thế này : GetDlgItemTextA(hwndDlg, 0x3F4, buffer, 0x32); _________________|____________| _________________|____________| ______________[ESI+1C]________EAX PUSH lưu dữ liệu trên 1 vài lệnh gọi stack. Kết quả này trong mỗi lệnh PUSH đặt 1 phần của dữ liệu phía trên stack, và sau đó function kiểm tra cái gì đang nằm trên stack và dùng nó để làm bất cứ cái gì . 6. Đôi điều về chương trình viết bằng Visual Basic =================================== File Visual Basic.exe không thực sự được biên dịch ra file exe. Nó chỉ chứa đoạn code để gọi file VBRUNxxx.DLL , file này có nhiệm vụ đọc dữ liệu từ file exe và chạy chương trình. Đó là lí do vì sao chương trình viết bằng Visual Basic lại chạy chậm như vậy. Và khi file exe không có thực, các bác không thể disassemble nó, các bác chỉ tìm thấy đoạn lệnh gọi DLL và rất nhiều “rác”, và khi các bác dubeg, các bác sẽ kết thúc tại DLL. Và cách giải quyết là decompiler (dịch ngược). Có rất nhìu chương trình decompile cho Visual Basic, được viết bởi DoDi. Đây là chương trình shareware và có thể tìm được trên mạng. Tuy nhiên các bác cũng chớ lo vì các programmer giỏi thường không bao giờ viết chương trình bằng Basic. (phù, may quá ;)) Phụ lục : A. Làm thế nào để kiểm tra SoftICE đã load symbols ? ++++++++++++++++++++++++++++++++++++++ Để kiểm tra xem SoftICE đã load symbols cho GetWindowText chưa, các bác vào SoftICE và đánh : exp getwindowtext B. Cú pháp cho function +++++++++++++++++ int GetWindowText(int windowhandle, char *buffer, int maxlen); int GetDlgItemText(int dialoghandle, int controlid, char *buffer, int maxlen); int GetDlgIemInt(int dialoghandle, int controlid, int *flag, int type); THE END Hi vọng qua bài viết có thể giúp được 1 phần nào đó cho các bác trong việc crack soft với SoftICE Hẹn gặp lại các bác trong những tut sau The_lighthouse(REA) CRACK CÁC CHƯƠNG TRÌNH ĐÓNG GÓI BẰNG INSTALLER VISE 3.5.1 tlandn Tut này tui có tham khảo của Ap0x. Tut của Ap0x viết bằng ngôn ngữ Serbian (tui cũng không biết ngôn ngữ này là cái gì nữa). Dùng OllyDbg mở file Setup.exe. Nhấn F9 để chạy. Nhập các thông tin như trong hình và nhấn nút “Next”. Một thông báo lỗi hiện lên : Trong OllyDbg nhấn Alt-E để mở “Executable Modules”. Chú ý cái dòng màu xám (vise32ex.dll) : Nhấn phải chuột vào dòng màu xám. Chọn “View Code in CPU” : Chúng ta sẽ ở đây : Nhấn phải chuột chọn như trong hình : Trong cửa sổ “Text reference … “. Nhấn phải chuột chọn “Search for text”. Nhập như trong hình : Nhấn OK. Chúng ta sẽ dừng ở dòng “IDS_INVALID…” Nhấn phải chuột chọn như trong hình : Chúng ta sẽ ở đây : Ở 10020F20 sẽ bắt đầu hàm. Đặt con trỏ (click chuột) ở dòng 10020F20. Nhấn phải chuột chọn như trong hình : Được như sau : Chúng ta thấy tại 10021253 sẽ có lời gọi tới 10020F20. Nhấn đúp chuột vào dòng 10021253 . Chúng ta sẽ ở tại dòng màu xám : . 10 020F 20 sẽ bắt đầu hàm. Đặt con trỏ (click chuột) ở dòng 10 020F 20. Nhấn phải chuột chọn như trong hình : Được như sau : Chúng ta thấy tại 10 0 212 53 sẽ có lời gọi tới 10 020F 20. . EAX_______________________________Lưu địa chỉ của text buffer PUSH 00 000 3F4___________________________Lưu Identifier của control PUSH DWORD PTR [ESI+1C]________________Lưu handle của dialog CALL [USER32!GetDlgItemTextA]. strupr(buffer); code = ( ((unsigned long)buffer [0] * (unsigned long)strlen(buffer)) << 0x0A) + 0x2f8cc; printf(“Your serial is : %lu”, code); return 0; } 5. Làm thế nào mà lệnh PUSH và