Đó là toàn bộ phần lý thuyết. Sau đây chúng ta sẽ bước vào thực hành. II - THỰC HÀNH : Tool : Olly Victim : game freecell (vừa nhẹ lại có sẵn trong bất kì máy nào) Dùng Olly load file freecell.exe lên, xong chúng ta sẽ ở tại 01005438 - ta sẽ gọi đây là điểm đầu của chương trình. Bây giờ ta cần tìm chỗ để đặt đoạn code của mình. Kéo xuống dưới, ta tìm được 1 chỗ khá "rộng rãi" ở 0100617D. Bây giờ ta sẽ bắt đầu viết code cho 1 cái MessageBox. Trong ASM đoạn code gọi hàm MessgeBoxA được viết như sau : Quote: Push 0 Push "reaonline" <== tiêu đề của MessageBox Push "welcome" <== nội dung của MessageBox Push 0 Call User32.MessageBoxA Để nhập được đoạn code trên vào chương trình ta làm như sau : Trong Olly chúng ta kéo chuột chọn 1 khoảng dài. Sau đó ấn Ctrl-E. Trong khung ASCII đánh vào reaonline, xong ấn OK. Olly lúc này sẽ có 1 đoạn code rất "khó hiểu". Không sao, các bạn ấn Ctrl-A để chương trình Analyse lại đoạn code. Và bây giờ chúng ta sẽ thấy dòng này : Quote: 0100617D . 72 65 61 6F 6E 6C 69 6E 65 00 ASCII "reaonline",0 Ta sẽ ghi ra giấy địa chỉ 0100617D để dùng sau này. Làm tương tự bước trên, ta có được dòng chữ welcome : Quote: 01006187 . 77 65 6C 63 6F 6D 65 00 ASCII "welcome",0 Ghi lại địa chỉ 01006187. Tại địa chỉ 01006190 , ta ấn Space và nhập vào Push 0 xong ấn Assemble. Tại địa chỉ 01006192 , ta ấn Space và nhập vào Push 0100617D xong ấn Assemble. Tại địa chỉ 01006197 , ta ấn Space và nhập vào Push 01006187 xong ấn Assemble. Tại địa chỉ 0100619C , ta ấn Space và nhập vào Push 0 xong ấn Assemble. Tại địa chỉ 0100619E , ta ấn Space và nhập vào Call User32.MessageBoxA xong ấn Assemble. Lưu ý, ở đây ta hãy ghi ra giấy địa chỉ 01006190. Nếu các bạn làm đúng, chúng ta sẽ có như sau : Quote: 0100617D . 72 65 61 6F 6E 6C 69 6E 65 00 ASCII "reaonline",0 01006187 . 77 65 6C 63 6F 6D 65 00 ASCII "welcome",0 0100618F 00 DB 00 01006190 6A 00 PUSH 0 01006192 68 7D610001 PUSH freecell.0100617D ; ASCII "reaonline" 01006197 68 87610001 PUSH freecell.01006187 ; ASCII "welcome" 0100619C 6A 00 PUSH 0 0100619E E8 D302D676 CALL USER32.MessageBoxA Bây giờ ta ấn * để trở về đâu chương trình. Tại đây, để chắc chắn chúng ta hãy copy từ địa chỉ 01005438 đến địa chỉ 01005447 ra Notepad. Sau đó trong Olly, kéo chọn từ địa chỉ 01005438 đến địa chỉ 01005447 và ấn Space. Nhập vào JMP 01006190 (đây là địa chỉ mà lúc nãy tui kêu các bạn ghi lại) xong ấn Assemble. Mở lại Notepad (đang giữ đoạn code lúc nãy chúng ta copy lại), ta hãy so sánh xem đoạn code nào đã bị mất để khôi phục lại sau. Ta thấy 2 dòng lệnh 01005438 > $ 6A 70 PUSH 70 và 0100543A . 68 70150001 PUSH freecell.01001570 đã bị mất. Vậy ta chỉ cần giữ lại 2 dòng này và xóa hết các dòng lệnh kia đi. Ghi ra giấy địa chỉ 0100543D - đây sẽ là nơi chương trình "trở về" sau khi cho chạy xong cái MessageBox của chúng ta. Tại địa chỉ 01005438 ta ấn Enter để nhảy thử xem đoạn code của chúng ta có đúng không. Oh, vậy là đoạn code của chúng ta không sai :D Tại 010061A4 ta ấn Space và nhập Push 70 và tại 010061A6 ta ấn Space rồi nhập Push 1001570 (đây là 2 đoạn code đang nằm trong Notepad). Tại 010061AB ta ấn Space và nhập vào JMP 0100543D. Oh yeah, vậy là xong. Bây giờ ta chỉ việc lưu lại chương trình là xong :blowup: Thank to my family, Computer_Angel, Moonbaby, Zombie, nini all REA's members, benina, kienmanowar, QHQCrker, hoadongnoi, rongchaua, hacnho, deux , all my friends, and YOU !!! Bạn nào chưa làm được có thể xem file của tui (attach ở dưới) để tham khảo The_lighthouse(REA) 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: CMP Cú pháp : CMP <left>,<right> Left: là thanh ghi hay bộ nhớ Right : là thanh ghi hay bộ nhớ hay trực hằng Tác dụng : dùng để so sánh giữa toán hạng left và toán hạng right. Lệnh này Assemble sẽ lấy toán hạng left trừ toán hạng right, kết quả được lưu trong các cờ mà không thay đổi nội dung của 2 toán hạng trên. Kết quả của phép so sánh : + Đối với số không dấu : Left > Right=>ZF=0, CF=0 Left = Right=>ZF=1, CF=0 Left < Right=>ZF=0, CF=1 +Đối với số có dấu : Left > Right=>ZF=0/1, OF=0, SF=0/1 Left = Right=>ZF=1, OF=0, SF=0 Left < Right=>ZF=0, OF=0/1, SF=1/0 Ví dụ : MOV AX, 6000h CMP AX, -7000h <=>6000h – (-7000h) Đây là 1 lệnh quan trọng mà chúng ta cần quan tâm. Một vài chương trình sử dụng nó kiểm tra, như là so sánh real serial với số serial ta nhập vào khi đăng kí, hay kiểm tra chương trình đã được đăng kí hay chưa… Và ta thấy lệnh này thường được đặt trước lệnh jump Quote: Flags Về cơ bản , Flags giống registers ngoại trừ việc Flags chỉ có thể tồn tại true (đúng) hoặc false (sai). Nó được set bởi những lệnh như CMP, và được dùng để kiểm tra kết quả lệnh call. Ví dụ : CMP AX, BX________So sánh AX và BX, nếu bằng thì cờ Zero được set là 0 JZ 00124531_______Nếu cờ zero đã được set thì nhảy đến địa chỉ 00124531 Quote: INT (interupt - ngắt) Cú pháp : INT <số ngắt> Định nghĩa và tác dụng : ngắt là 1 tín hiệu được gửi đến bộ vi xử lý để tạm ngưng công việc đang làm và xử lý 1 nhiệm vụ khác. Sau khi xử lý xong thì chương trình bị ngăt sẽ tiếp tục lại. Ví dụ : INT 21h ( gọi ngắt 21 của DOS ) Ở đây chúng ta có 2 loại ngắt là : + Ngắt cứng : được phát sinh bởi 1 mạch máy tính để đáp lại 1 sự kiện nào đó. Nó được dùng để điều khiển các thiết bị quan trọng như bàn phím, ổ đĩa, máy in + Ngắt mềm : được nhiều người lập trình sử dụng để yêu cầu các phục vụ hệ thống ngắt mềm xảy ra khi chương trình gọi phục vụ ngắt bằng lệnh INT <interupt> Bạn sẽ không thấy lệnh này khi debug chương trình window, nhưng nó “gây náo loạn” khắp mọi nơi trong DOS. Thường các thông số vượt qua default registers( như AX, BX, CX…) Quote: JMP Cú pháp : JMP address Tác dụng : tương đương với GO TO, nghĩa là nó sẽ nhảy đến address Ví dụ : JMP 00402011 JMP là lệnh nhảy không điều kiện nhảy đến section của code. Có rất nhiều sự khác nhau trong lệnh này, và quan trọng nhất là : JZ______nhảy nếu cờ zero được set ( giống như JE ) JNZ_____nhảy nếu cờ zero không được set ( giống như JNE ) Và nó thường được đi theo sau lệnh CMP : CMP RealSerial,FakeSerial_____so sánh real serial với fake serial do ta nhập vào JNE ______________________nhảy nếu không bằng . "welcome" ,0 01 0 0 618 F 00 DB 00 01 0 0 619 0 6A 00 PUSH 0 01 0 0 619 2 68 7D 6 10 0 01 PUSH freecell. 01 0 0 617 D ; ASCII "reaonline" 01 0 0 619 7 68 87 6 10 0 01 PUSH freecell. 01 0 0 618 7 ; ASCII "welcome". lệnh 01 0 05 438 > $ 6A 70 PUSH 70 và 01 0 05 43A . 68 7 01 5 00 01 PUSH freecell. 01 0 01 5 70 đã bị mất. Vậy ta chỉ cần giữ lại 2 dòng này và xóa hết các dòng lệnh kia đi. Ghi ra giấy địa chỉ 01 0 05 43D. "welcome" ,0 Ghi lại địa chỉ 01 0 0 618 7. Tại địa chỉ 01 0 0 619 0 , ta ấn Space và nhập vào Push 0 xong ấn Assemble. Tại địa chỉ 01 0 0 619 2 , ta ấn Space và nhập vào Push 01 0 0 617 D xong ấn Assemble.