CRACKER's NOTES
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ệu00. 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
========
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.
================
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
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
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
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
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…
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
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
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
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>
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…)
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
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
LODSB / LODSW
Cú pháp : LODSB / LODSW
Tác dụng : load 1 byte hoặc 1 word từ DS:SI và đặt nó vào AL (đối với LODSB) hay vào AX (đối với LODSW)
Ví dụ : LODSW
Hãy chuyển DS:SI points đến word mà đang giữ giá trị Ebh
LODSW
AX bây giờ sẽ chứa giá trị EBh
Cú pháp : LODSB / LODSW
Tác dụng : load 1 byte hoặc 1 word từ DS:SI và đặt nó vào AL (đối với LODSB) hay vào AX (đối với LODSW)
Ví dụ : LODSW
Hãy chuyển DS:SI points đến word mà đang giữ giá trị Ebh
LODSW
AX bây giờ sẽ chứa giá trị EBh
Lệnh này thương được sử dụng cùng với lệnh REP
MOV
Cú pháp : MOV <đích>,<nguồn>
<đích>: chỉ có thể là 1 thanh ghi hay bộ nhớ
<nguồn>: có thể là thanh ghi, bộ nhớ hay hằng
Tác dụng : chuyển nội dung toán hạng nguồn vào toán hạng đích
Ví dụ : MOV AX,DX
Các bác sẽ thấy có rất nhiều lệnh này khi các bác step các đoạn code, về cơ bản (ngôn ngữ BASIC) nó là LET đích=nguồn
Cú pháp : MOV <đích>,<nguồn>
<đích>: chỉ có thể là 1 thanh ghi hay bộ nhớ
<nguồn>: có thể là thanh ghi, bộ nhớ hay hằng
Tác dụng : chuyển nội dung toán hạng nguồn vào toán hạng đích
Ví dụ : MOV AX,DX
Các bác sẽ thấy có rất nhiều lệnh này khi các bác step các đoạn code, về cơ bản (ngôn ngữ BASIC) nó là LET đích=nguồn
Có rất nhiều biến thể khác bao gồm MOVSX, nhưng về cơ bản tất cả chúng đều làm 1 nhiệm vụ. Nó có thể giúp để có Intel Programming Specifications từ website của chúng.
MOVSB / MOVSW
Cú pháp : MOVSB / MOVSW
Tác dụng : chuyển byte (đối với MOVSB) hoặc word (đối với MOVSW) từ DS:SI đến ES:DI
Ví dụ : MOVSB
Hãy chuyển DS:SI points đến byte mà giữ giá trị 5h
MOVSB____lấy byte của DS:SI points và đặt nó trong ES:DI
Byte của ES:DI bây giờ có giá trị là 5h
Cú pháp : MOVSB / MOVSW
Tác dụng : chuyển byte (đối với MOVSB) hoặc word (đối với MOVSW) từ DS:SI đến ES:DI
Ví dụ : MOVSB
Hãy chuyển DS:SI points đến byte mà giữ giá trị 5h
MOVSB____lấy byte của DS:SI points và đặt nó trong ES:DI
Byte của ES:DI bây giờ có giá trị là 5h
Lệnh này thường được dùng với lệnh REP
Registers
Registers là nơi mà chứa dữ liệu. Một điều duy nhất chúng ta lo lắng là: (E)AX, (E)BX, E(CX), E(DX) (chữ E chỉ có ý nghĩa khi chúng ta debug 32bit-code.
Như vậy cặp registers là :
DS:SI____có thể được dùng như nguồn của chuỗi hoạt động
ES:DI____sử dụng như mục tiêu của chuỗi hoạt động
Registers là nơi mà chứa dữ liệu. Một điều duy nhất chúng ta lo lắng là: (E)AX, (E)BX, E(CX), E(DX) (chữ E chỉ có ý nghĩa khi chúng ta debug 32bit-code.
Như vậy cặp registers là :
DS:SI____có thể được dùng như nguồn của chuỗi hoạt động
ES:DI____sử dụng như mục tiêu của chuỗi hoạt động
Việc hiểu registers không phải là quá quan trọng trong việc crack, các bác chỉ cầ bít nó là những biến số để lưu trữ dữ liệu là được.
REP ( Repeat String Operation)
Cú pháp : REP
Tác dụng : Lập lại dữ liệu trong CX register. Lệnh REP đặt trước MOVSB, LODSB hay STOSB sẽ làm cho lệnh này lặp lại chính nó.
Ví dụ : MOVAL ,Bh_____AL bao gồm bh
MOV CX,5h_____CX bao gồm 5h
Cú pháp : REP
Tác dụng : Lập lại dữ liệu trong CX register. Lệnh REP đặt trước MOVSB, LODSB hay STOSB sẽ làm cho lệnh này lặp lại chính nó.
Ví dụ : MOV
MOV CX,5h_____CX bao gồm 5h
REP STOSB_____copy giá trị của AL (ở đây là 5h) vào nơi mà DS:SI point 5 times và increment SI.
RET
Cú pháp : RET
Tác dụng : trở lại function
Ví dụ : RET
Cú pháp : RET
Tác dụng : trở lại function
Ví dụ : RET
Các bác chắc đã thấy lệnh này ở cuối mỗi function, và nó chỉ đạo bộ xử lý máy tính trở lại địa chỉ của lệnh call gọi function
STOSB / STOSW
Cú pháp : STOSB / STOSW
Tác dụng : Lấy giá trị trong AL (STOSB) hoặc trong AL(STOSW) và đặt nó vào DS:SI
Ví dụ : STOSB
Giả sử AX chứa giá trị Ebh
STOSB____copy giá trị trong AX và đặt nó vào word của DS:SI. Lúc này DS:SI points to word chứa Ebh.
Cú pháp : STOSB / STOSW
Tác dụng : Lấy giá trị trong AL (STOSB) hoặc trong AL(STOSW) và đặt nó vào DS:SI
Ví dụ : STOSB
Giả sử AX chứa giá trị Ebh
STOSB____copy giá trị trong AX và đặt nó vào word của DS:SI. Lúc này DS:SI points to word chứa Ebh.
Lệnh này thường được dùng với lệnh REP
Trước khi gọi bất kì function nào, chương trình phải “push” những thông số mà function đang “chờ đợi” trên stack. Chúng ta giả sử nó như là 1 chồng bát, cái bát đặt vào đầu tiên sẽ là cái bát lấy ra cuối cùng - ở đây stack cũng vậy. Chúng ta hãy cứ nhớ “vào đầu / ra cuối” khi nhìn vào lệnh call, có nghĩa là thông số đó sẽ đảo ngược .
Nếu như các bác không hỉu những giều trên thì hãy nhìn vào ví dụ sau :
Windows API function GetDlgItemText yêu cầu các thông số sau:
(1) Handle of dialog box
(2) Identifier of control
(3) Địa chỉ của text buffer
(4) Chiều dài tối đa của chuỗi
Bởi vậy nên đoạn code có thể như sau :
MOV EDI,[ESP+00000220]_____get handle of dialog box trong EDI
PUSH 00000100____________PUSH (4)
PUSH 00406130____________PUSH (3)
PUSH 00000405____________PUSH (2)
PUSH EDI_________________PUSH (1)
CALL GetWindowText________Gọi function
Có dễ không các bác? Đây là 1 trong những ví dụ đơn giản nhất trong lĩnh vực crack đi tìm số serial, nếu các bác biết được địa chỉ buffer của serial, trong trường hợp này là ở địa chỉ 00406130 , các bác hãy set breakpoint nó và thường các bác sẽ kết thúc tại chuỗi tạo real serial
POP dùng để remove first item khỏi stack, thường có rất nhìu trước khi function trở lại chương trình
(Còn tiếp)
the_lighthouse(REA)
In bài này