với TaskLock, chúng ta nhấn F11 để trở về đoạn lệnh gọi function. Chúng ta nhấn Ctrl- Up để kéo màn hình lên trên và sẽ thấy đoạn code sau : MOV ESI,[ESP+0C] PUSH 1E_____________________________Lưu chiều dài lớn nhất của FN PUSH 0040A680_______________________Địa chỉ đến buffer PUSH 000003ED_______________________Control handle PUSH ESI_____________________________Dialog handle CALL [USER32!GetDlgItemTextA] Các bác có thấy cái gì không ? Đó là số 40A680. Để xem nó giấu cái gì nào, okey chúng ta hãy đánh : d 40A680 Và cái gì hiện ra trong data window vậy các bác. Well, chúng ta hãy nhìn vào phần đầu của đoạn code : PUSH 00 PUSH 00 PUSH 000003F6_______________________Control handle MOV EDI, 00401680___________________Lưu địa chỉ đến buffer PUSH EDI____________________________Dialog handle CALL [USER32!GetDlgItemInt] Chắc các bác đang thắc mắc GetDlgItemInt là cái quái gì phải không ? Ở đây em xin nói ngoài lề 1 chút : GetDlgItemInt là 1 function giống với GetDlgItemText, nó trả về giá trị integer từ hộp thoại text. Nó được trả về trong EAX, vì vậy chúng ta “nhảy” qua đoạn lệnh này, và nhìn vào register window … Của em là nó như thế này : EAX=00003039 Và để biết 3039 là cái gì, chúng ta đánh : ? 3039 Okey, chúng ta sẽ có gì nào : 00003039 0000012345 “09” ___|_________|________| ___|_________|________| __hex_______dec______ascii Như các bác thấy, nó hiện ra FS mà chúng ta đã đánh vào ban nãy. Bây giờ chúng ta típ tục, các bác hãy nhìn vào đoạn code theo sau, trước tiên là FS đã được lưu lại : MOV [0040A548], EAX___________________Lưu FS MOV EDX, EAX_________________________”đặt” FS vào EDX 3.1.3 Đoạn code tính số serial Và đây chính là đoạn code tính số serial : MOV ECX, FFFFFFFF______________________Tính chiều dài FN SUB EAX, EAX REPNZ SCASB NOT ECX DEC ECX_______________________________EAX chứa chiều dài FN MOVSX EAX, BYTE PTR [0040A680]____________Nhận byte tại 40A680 IMUL ECX, EAX___________________________ECX = ECX * EAX SHL ECX, 0A____________________________Đổi chỗ 0A ADD ECX, 0002F8CC______________________Thêm 2F8CC vào kết quả MOV [0040A664], ECX Và đây mới là đoạn code mà ta mong đợi nhất ( cố lên các bác, sắp xong rùi :) : CMP ECX, EDX___________________________So sánh EAX và EDX JZ 00402DA6___________________________Nhảy nếu bằng Sau khi “nhảy” đến CMP ECX,EDX , các bác có thể xem đoạn code thực của nó bằng cách đánh vào : ? ecx Và nó sẽ hiện ra như sau (không bít có giống của các bác không) : 000DC0CC 0000901324 Hehehehhe……đến đây thì chúng ta đã có được registration number c ủa mình rùi đó là 901324. Bây giờ các bác thử nhập lại registration number xem có được không, được quá đi chứ lị :))))))) 4. Tạo keymaker cho phần mềm Command Line 95 =============================== Chúng ta nhìn vào đoạn code tính số serial ở trên, và dịch nó sang C. Em làm ví dụ này để thấy làm thế nào để tính được real serial : Real serial= [( kí tự viết hoa đầu tiên * chiều dài của chuỗi)<< 0x0A ]+0x2F8CC Ở đây các bác chú ý 2 vấn đề : + các kí tự trong FN sẽ được chuyển sang chữ hoa khi bạn gõ chúng trong text box. + “<< 0x0a” có nghĩa là “ nhân với 2^10” Trong C nó sẽ như thế này : #include <string.h> #include <stdio.h> int main() { unsigned long code; unsigned char buffer[0*1e]; 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_lighthouse (http://www.reaonline.net) cRACKER's nOTES Quote: Bài viết được chia thành 10 phần chính : 00. Giới thiệu 01. Assembly for Crackers 02. SoftICE ( Boot Menu, Setup, Commands) + 02.1 Boot Menu + 02.2 Setup + 02.3 Commands 03. Breakpoints và Win API Details + 03.1 Crippled Programs + 03.2 Dialog Box + 03.3 Drive Type Checks + 03.4 File Accesses + 03.5 Registry Accesses + 03.6 Serial Catching + 03.7 Time & Date Accesses + 03.8 Window Generating 04. Kiến thức về lệnh nhảy ( jump ) 05. Kiến thức về SET 06. Tips & Tricks for Cracking + 06.1 Crippled Programs + 06.2 Dongles + 06.3 General + 06.4 InstallSHIELD Setups + 06.5 Key File Protections + 06.6 Nag Screens + 06.7 Runtime Limits + 06.8 Serials + 06.9 Time Limits + 06.10 Visual Basic Programs 07. Window Messages for Crackers 08. Nhận biết Functions, Arguments, và Variables 09. Các cách thức bảo vệ của phần mềm + 09.1 C – Dilla SafeDISC + 09.2 SalesAgent + 09.3 SecuROM + 09.4 softSENTRY + 09.5 TimeLOCK + 09.6 Vbox 10. Bitmanipulation Phụ lục : +A. Những ý kiến chung về Cracking +B. Những câu hỏi thường gặp ******************************************* 00. Giới thiệu ======== Bài viết là 1 cuốn “bí kíp” được tích lũy từ những kiến thức “bí mật không thể bật mí “ cũng như các kinh nghiệm quý báu của các cracker trên thế giới, do đó những gì quan trọng nhất mà 1 cracker cần phải biết đều có trong loạt tuts này. 01. Assembly for Crackers ================ Quote: AND Cú pháp : AND <đích>,<nguồn> Tác dụng : thực hiện logical AND của 2 giá trị, thay thế đích với nguồn Ví dụ : AND BX,03h Quote: CALL Cú pháp : CALL address Tác dụng : đưa vào stack lệnh next. Sử dụng cho việc gọi hàm Ví dụ : CALL 10284312 + Gọi function tại địa chỉ “address”, sau khi function kết thúc, đoạn code ngay phía dưới lệnh call sẽ được tiếp tục Quote: . bít có giống của các bác không) : 000DC0CC 00009 0132 4 Hehehehhe……đến đây thì chúng ta đã có được registration number c ủa mình rùi đó là 9 0132 4. Bây giờ các bác thử nhập lại registration number. Generating 04. Kiến thức về lệnh nhảy ( jump ) 05. Kiến thức về SET 06. Tips & Tricks for Cracking + 06.1 Crippled Programs + 06.2 Dongles + 06.3 General + 06.4 InstallSHIELD Setups. softSENTRY + 09.5 TimeLOCK + 09.6 Vbox 10. Bitmanipulation Phụ lục : +A. Những ý kiến chung về Cracking +B. Những câu hỏi thường gặp ******************************************* 00. Giới thiệu