# Cracking part 20

Chia sẻ: Dqwdasdasd Qwdasdasdasd | Ngày: | Loại File: PDF | Số trang:6

0
60
lượt xem
7

## Cracking part 20

Mô tả tài liệu

Tài liệu hướng dẫn làm cracking phần 20

Chủ đề:

Bình luận(0)

Lưu

## Nội dung Text: Cracking part 20

1. 7D cb JGE rel8 Jump short if greater or equal (SF=0F) 7C cb JL rel8 Jump short if less (SFOF) 7E cb JLE rel8 Jump short if less or equal (ZF=1 or SFOF) 76 cb JNA rel8 Jump short if not above (CF=1 or ZF=1) 72 cb JNAE rel8 Jump short if not above or equal (CF=1) 73 cb JNC rel8 Jump short if not carry (CF=0) 75 cb JNE rel8 Jump short if not equal (ZF=0) 7E cb JNG rel8 Jump short if not greater (ZF=1 or SFOF) 7C cb JNGE rel8 Jump short if not greater or equal (SFOF) 7D cb JNL rel8 Jump short if not less (SF=OF) 7F cb JNLE rel8 Jump short if not less or equal (ZF=0 and SF=OF) 71 cb JNO rel8 Jump short if not overflow (OF=1) 7B cb JNP rel8 Jump short if not parity (PF=1) 79 cb JNS rel8 Jump short if not sign (SF=0) 75 cb JNZ rel8 Jump short if not zero (ZF=0) 70 cb JO rel8 Jump short if overflow (OF=1) 7A cb JP rel8 Jump short if parity (PF=1) 7A cb JPE rel8 Jump short if parity even (PF=1) 7B cb JPO rel8 Jump short if parity odd (PF=0) 78 cb JS rel8 Jump short if sign (SF=1) 74 cb JZ rel8 Jump short if zero (ZF=0) Code: 0F 87 cw/cd JA rel16/32 Jump near if above (CF=0 and ZF=0) 0F 83 cw/cd JAE rel16/32 Jump near if above or equal (CF=0) 0F 82 cw/cd JB rel16/32 Jump near if below (CF=1) 0F 86 cw/cd JBE rel16/32 Jump near if below or equal (CF=1 or ZF=1) 0F 82 cw/cd JC rel16/32 Jump near if carry (CF=1) 0F 84 cw/cd JE rel16/32 Jump near if equal (ZF=1) 0F 84 cw/cd JZ rel16/32 Jump near if 0 (ZF=1) 0F 8F cw/cd JG rel16/32 Jump near if greater (ZF=0 and SF=OF) 0F 8D cw/cd JGE rel16/32 Jump near if greater or equal (SF=OF) 0F 8C cw/cd JL rel16/32 Jump near if less (SFOF) 0F 8E cw/cd JLE rel16/32 Jump near if less or equal (ZF=1 or SFOF) 0F 86 cw/cd JNA rel16/32 Jump near if not above (CF=1 or ZF=1) 0F 82 cw/cd JNAE rel16/32 Jump near if not above or equal (CF=1) 0F 83 cw/cd JNB rel16/32 Jump near if not below (CF=0) 0F 87 cw/cd JNBE rel16/32 Jump near if not below or equal (CF=0 and ZF=0) 0F 83 cw/cd JNC rel16/32 Jump near if not carry (CF=0) 0F 85 cw/cd JNE rel16/32 Jump near if not equal (ZF=0) 0F 8E cw/cd JNG rel16/32 Jump near if not greater (ZF=1 or SFOF) 0F 8C cw/cd JNGE rel16/32 Jump near if not greater or equal (SFOF) 0F 8D cw/cd JNL rel16/32 Jump near if not less (SF=OF)
2. 0F 8F cw/cd JNLE rel16/32 Jump near if not less or equal (ZF=0 and SF=OF) 0F 81 cw/cd JNO rel16/32 Jump near if not overflow (OF=0) 0F 8B cw/cd JNP rel16/32 Jump near if not parity (PF=0) 0F 89 cw/cd JNS rel16/32 Jump near if not sign (SF=0) 0F 85 cw/cd JNZ rel16/32 Jump near if not zero (ZF=0) 0F 80 cw/cd JO rel16/32 Jump near if overflow (OF=1) 0F 8A cw/cd JP rel16/32 Jump near if parity (PF=1) 0F 8A cw/cd JPE rel16/32 Jump near if parity even (PF=1) 0F 8B cw/cd JPO rel16/32 Jump near if parity odd (PF=0) 0F 88 cw/cd JS rel16/32 Jump near if sign (SF=1) 0F 84 cw/cd JZ rel16/32 Jump near if 0 (ZF=1) JMP - Lệnh nhảy không điều kiện Code: EB cb JMP rel8 Jump short, relative, displacement rel to next instruct E9 cw JMP rel16Jump near, relative, displacement rel to next instruct FF /4 JMP r/m16Jump near, absolute indirect, address given in r/m16 FF /4 JMP r/m32Jump near, absolute indirect, address given in r/m32 EA cb JMP ptr16:16 Jump far, absolute, address given in operand EA cb JMP ptr16:32 Jump far, absolute, address given in operand FF /5 JMP m16:16Jump far, absolute indirect, address given in m16:16 FF /5 JMP m16:32Jump far, absolute indirect, address given in m16:32 PHẦN 5 : Kiến thức về SET SETcc - Lệnh SET có điều kiện Code: 0F 97 SETA r/m8 Set Byte if above (CF=0 and ZF=0) 0F 93 SETAE r/m8 Set Byte if above or equal (CF=0) 0F 92 SETB r/m8 Set Byte if below (CF=1) 0F 96 SETBE r/m8 Set Byte if below or equal (CF=1 or ZF=1) 0F 92 SETC r/m8 Set Byte if carry (CF=1) 0F 94 SETE r/m8 Set Byte if equal (ZF=1) 0F 9F SETG r/m8 Set Byte if greater (ZF=0 and SF=OF) 0F 9D SETGE r/m8 Set Byte if greater or equal (SF=0F) 0F 9C SETL r/m8 Set Byte if less (SFOF) 0F 9E SETLE r/m8 Set Byte if less or equal (ZF=1 or SFOF) 0F 96 SETNA r/m8 Set Byte if not above (CF=1 or ZF=1) 0F 92 SETNAE r/m8 Set Byte if not above or equal (CF=1) 0F 93 SETNB r/m8 Set Byte if not below (CF=0) 0F 97 SETNBE r/m8 Set Byte if not below or equal (CF=0 and ZF=0) 0F 93 SETNC r/m8 Set Byte if not carry (CF=0) 0F 95 SETNE r/m8 Set Byte if not equal (ZF=0) 0F 9E SETNG r/m8 Set Byte if not greater (ZF=1 or SFOF)
3. 0F 9C SETNGE r/m8 Set Byte if not greater or equal (SFOF) 0F 9D SETNL r/m8 Set Byte if not less (SF=OF) 0F 9F SETNLE r/m8 Set Byte if not less or equal (ZF=0 and SF=OF) 0F 91 SETNO r/m8 Set Byte if not overflow (OF=1) 0F 9B SETNP r/m8 Set Byte if not parity (PF=1) 0F 99 SETNS r/m8 Set Byte if not sign (SF=0) 0F 95 SETNZ r/m8 Set Byte if not zero (ZF=0) 0F 90 SETO r/m8 Set Byte if overflow (OF=1) 0F 9A SETP r/m8 Set Byte if parity (PF=1) 0F 9A SETPE r/m8 Set Byte if parity even (PF=1) 0F 9B SETPO r/m8 Set Byte if parity odd (PF=0) 0F 98 SETS r/m8 Set Byte if sign (SF=1) 0F 94 SETZ r/m8 Set Byte if zero (ZF=0) Lệnh SETcc lưu 1 trong destination nếu gặp điều kiện hoặc lưu 0 nếu như không gặp điều kiện. Destination (r/m8) là 1 effective address (địa chỉ) hoặc 1 register (thanh ghi). PHẦN 6 : Tips & Tricks for Cracking 06.1 Crippled Programs ============== Cách tốt nhất để crippled chương trình là dùng hàm MessageBox[A] hoặc DialogBox[A] vì nó thường được dùng để gọi thông báo như “Function not avaiblein demo” hay “Can’t save in Shareware/Demo”… mà các bác thấy mỗi khi các bác “vô tình” dùng những chức năng bị disable (có thể là do các bác dùng bản shareware -----> bị giới hạn chức năng). 06.2 Dongles ======= Lần đầu tiên mà các bác bước vào “con đường tội lỗi nhưng cũng hết sức thú vị ” cracking, khả năng của các bác sẽ được kiểm tra và đo được thông qua việc crack dongles. Dongle programs đã được giới cracker thế giới thừa nhận là 1 trong những chương trình khó crack nhất. Và nó được chọn là “kẻ canh giữ” cho những “đại gia” như Cubase, SoftImage và 3D Studio Max cũng như nhìu plugins khác. Dzậy Dongle là gì mà lại “có giá” như thế ? Thưa, nó là sự liên kết giữa hardware và software protection. Cấu tạo của hardware là 1 plug nhỏ và plug này thường nối đến parallel port (cổng song song) của máy tính . Em thường thấy nhất là Sentinel và HASP, ngoài ra còn có DesKEY... Đặt giả thiết nếu các bác không có dongle chương trình không chạy , thường chương trình sẽ kiểm tra xem có dongle hay không trong suốt quá trình hoạt động . Hiện nay việc crack dongle không khó khi các bác có actual dongle itself , những tác giả của các tutorial hầu như đều có dongle trong place đầu tiên, không dùng dongle các bác
4. sẽ phải zen rất nhiều và có thể pray (cầu nguyện) – hài thật :), ở đây chắc tác giả muốn nhấn mạnh tầm quan trọng của dongle. Với dongle em không thể nhấn mạnh tầm quan trọng của việc phải có thông tin về “kẻ canh giữ” mà các bác sẽ gặp , một nửa sự thách thức là xác minh flavour của dongle mà các bác gặp (ở đây em xin đưa ra 1 hướng dẫn: đối với HASP thì các bác hãy xem tại ftp://ftp.hasp.com) . Các bác hãy sử dụng các bộ máy tìm kiếm trên mạng cho những vendor khác, thậm chí các bác hãy theo dõi những file chẳng hạn sentinel.vxd... trong suốt quá trình install. Các bác nên làm thử và hiểu chính xác dongle mà các bác dự định sẽ crack. Sau đây là những “mánh khóe” mà các bác nên đọc qua để có thể crack tốt hơn các dongle : 1. Hãy nhớ rằng phần dễ crack nhất trong dongle là khi software drive hardware, đó là lúc hầu hết các phần của software muốn nhận được trả lời từ hardware, và các bác không nên crack vào dongle wrapper trừ khi các bác có đủ thời gian ngồi chờ cho 1 session khá lâu. 2. Hầu hết những dongle bổ sung đều kém, do đó người lập trình thường sẽ viết những function dùng để kiểm tra phản hồi từ dongle sử dụng tên những function “ngớ ngẩn” mà sẽ hiện ra hoàn toàn khi bị disassembly. Còn nếu họ dùng dongle API của người sản xuất thì sự bảo vệ có thể sẽ bền vững hơn. 3. Hầu hết dongle có hơn 1 beggar off/ beggar on khi kiểm tra, đôi khi cờ được set riêng rẽ để đánh lừa các bác, theo dấu đi xuống khá là dễ một khi các bác chắc chắn rằng mình đang nhìn vào “sơ đồ” bảo vệ. 4. Một vài dongle routine sẽ cố gắng làm “mờ mắt” các bác bằng những phép toán phức tạp mà trên thực tế khi thi hành thì nó lại rất đơn giản. Trong assembler, ngay cả những phép toán đơn giản cũng có thể biến thành rắc rối, nhưng đó cũng không phải là vấn đề lớn trong SoftICE bởi vì nó thường có 1 beggar off kiểm tra ở điểm cuối. 5. Đối với hầu hết các phần, các bác đừng nên tính những đoạn code dongle hoặc routine trừ khi các bác muốn biết nó như thế nào ở trạng thái bình thường, điều đó đôi lúc tốt hơn việc chúng ta cứ ngồi bố trí cho “đẹp mắt” các đoạn NOP nhỏ và các kĩ thuật bắt buộc “tàn bạo” (ghê quá) 6. Không nản lòng khi không vượt qua được dongle, một vài chương trình không thể crack mà không có dongle present, một số dongle tìm chương trình mà nó bảo vệ đến 1 khoảng rộng mà việc patch chỗ này là không thực tế. Điều cuối cùng mà các bác nên nhớ là hãy dùng bất cứ thông tin nào mà các bác có được. Chúc các bác may mắn ;) Các Breakpoint hữu ích dùng để crack dongle : BPIO –h 278 R
5. BPIO –h 378 R 06.3 General ======== Chọn Fake Serial Khi bước vào “con đường tội lỗi” cracking, các bác nên chọn cho mình 1 con số (như ngày sinh của mình, hay là của người yêu, hay là telephone của người yêu chẳng hạn...) và con số này sẽ theo các bác đến hết quãng đời ... cracking của mình. Và khi crack các chương trình yêu cầu nhập số serial, các bác sẽ rút “bảo bối” này ra (và đương nhiên các bác sẽ nhận đuợc 1 cái nag văng vào mặt) bởi lẽ theo thời gian các bác chác chắn sẽ biết được nó bằng bao nhiêu trong hệ hex cũng như decimal (như của em là 1234567890, và trong hex nó sẽ là 499602D2 – hehe quá dễ nhớ :) Ở đây em cũng nói thêm 1 điều là các bác nên chọn số mà các chữ số không giống nhau , bởi nếu chương trình không kiểm tra từ số đầu tiên mà từ số thứ 2 hoặc thứ 3 thì sao (keke... thì đơ chứ seo nữa) hoặc giả sử các bác dùng số 1122334455 và khi kiểm tra code nó hiện ra là “1” thì các bác có biết nó là số 1 nào không, còn nếu các bác sử dụng các chữ số khác nhau thì sau 1 lần kiểm tra các bác sẽ nhận ra ngay. Lệnh CALL Mỗi khi các bác quyết định nhảy qua 1 lệnh CALL nào đó trong đoạn code bảo vệ, các bác hãy kiểm tra nội dung của các register bị thay đổi, các bác có thể tìm thấy real serial ở đó đó. Nếu các bác đã kiểm tra tất cả posibilities mà không thấy gì, các bác hãy trace lại và khảo sát từng function. Các cracker/programmer suy nghĩ như thế nào ? Các programmer được dạy rằng mỗi khi có công việc nào đó mà cần hoàn thành nhiều hơn 1 lần thì nên tạo ra function để thực hiện công việc đó, và chỉ gọi function khi cần thi hành công việc. Hầu hết các chương trình đều dùng name kết hợp với serial để kiểm tra code ít nhất 2 lần : 1 lần là khi chúng ta nhập name và serial, còn 1 lần là khi chúng ta khởi động chương trình. Vì vậy các programmer thường sẽ gọi function để kiểm tra code đăng kí của các bác. Và thông thường thì function sẽ được gọi mỗi khi code được check. Tại điểm này các bác sẽ thấy nơi mà chúng ta bắt đầu. Nếu các bác patch function được gọi để kiểm tra code đăng kí, nó sẽ hiện lên hợp lý mỗi khi chương trình check nó. Kĩ thuật ở đây không chỉ áp dụng để crack những chương trình dùng code name và serial. Đừng tự trói buộc bản thân bằng cách nghĩ "Inside the Box" (cái này em chả biết dịch thế nào :), những kĩ thuật này có thể áp dụng với các kiểu bảo vệ khác
6. Sử dụng INT 3 Trong trường hợp bạn chưa chuẩn bị để nghe, INT 3 được set để debug theo ý định. Vì vậy nếu các bác muốn break tại 1 điểm nào đó, các bác có thể sử dụng kiến thức này. Các bác nên copy file mà các bác muốn break ra rồi hãy patch file copy đó. Hãy thử thay 1 byte đơn bằng opcode CC ( CC là opcode của INT 3). Nếu các bác không tìm được điểm nào, các bác đừng quên NOP (opcode của NOP là 90) những byte còn lại. Sau đó các bác có thể sử dụng SoftICE để break INT 3. Đùng quên chú ý giá trị gốc, bởi các bác cần nó khi SoftICE break tại vị trí này. Khi đã ở đó (trước chỗ INT 3 được thi hành), các bác hãy gõ A (nếu các bác không làm thế thì các bác sẽ gây ra 1 General Protection Fault) . Việc tiếp theo tùy ý các bác ... Giá trị trả về Khi function trả về 1 giá trị, các bác hãy để ý : nếu check thành công thì giá trị trả về thường là 1 (có 1 vài trường hợp là 0), còn nếu là -1 nghĩa là check không thành công. Unregistred